jvm(运行时数据区域)

以上是jvm在运行时内存的数据分区图例(各个分区简介):

1、程序计数器:

          在jvm中一块很小的区域,主要作用就是记录当前线程执行字节码的行号指示器。

          在单核的多线程中,cpu会在不同线程之间切换,为了切换回来时正确的回到当前线程的执行位置,

          每个线程都有自己单独的程序计数器,之间互不影响,独立运行,同时这块区域也是在java虚拟机

          规范中唯一没有规定任何OutOfMemoryError情况的区域。

2、虚拟机栈:

          java虚拟机栈和程序计数器一样,都是线程私有的,他的生命周期和线程一样,它描述的是Java方法内存模型,

          每个方法的执行的同时都会创建一个栈帧,用于存储局部变量,操作数栈等。

          这块区域定义了两个异常:

          1、如果线程的请求栈深度大于虚拟机栈所允许的最大深度,会抛出 StackOverflowError异常

          2、如果虚拟机栈可以动态拓展的话,如果拓展时无法申请到足够的内存,就会抛出 OutOfMemoryError异常

3、本地方法栈

         和虚拟机栈类似,为虚拟机使用到的native方法服务,抛出的异常和虚拟机栈一样

4、堆内存

         对于大多数的应用来说,Java堆是java虚拟机管理中内存最大的一块,是被所有线程共享的一块区域,虚拟机启动时创建,

         此区域的唯一目的是存放对象的实例,几乎所有的对象的实例都在这里分配内存,当堆内存中无法拓展内存,或者当前内存

         的堆内存无法给新的对象分配内存,此时会抛出OutOfMemoryError

5、方法区

        和堆类似,被各个线程共享,主要存储虚拟机加载的类信息,静态变量,常量

        运行时常量池也是方法区的一部分,也会抛出OutOfMemoryError异常

6、直接内存

        jdk 1.4之后,新增nio,一种基于通道和buffer 方式,通过调用native函数库调用堆以外的内存,通过directByteBuffer对象

       进行操作,避免Java堆 和native堆之间来回复制数据,这块内存受本机总内存的影响,也会抛出OutOfMemoryError

        

猜你喜欢

转载自www.cnblogs.com/muyarn/p/10518285.html