深入理解java虚拟机学习—运行时数据区域

参考资料:《深入理解java虚拟机》JVM高级特性与最佳实践第二版  周志明


java虚拟机运行时数据区域如下图:

深入理解java虚拟机学习—运行时数据区域_第1张图片

其中 红色背景区域代表的是线程共享的内存区,而蓝色背景区域代表的是线程私有的内存区。

一、 线程共享的内存区域

    1. 堆 Heap

        这个区域是我们用到最多的内存区域,该区域在虚拟机启动时创建,对象实例以及数组(直观点就是使用new产生的)都在这个堆上分配,我们可以通过 -Xmx(堆最大可用内存)和 -Xms(堆初始分配内存)来控制,如果在堆中没有内存可以用来分配实例,同时堆也无法再扩展时,会抛出 OutOfMemoryError异常。

    2. 方法区

        这个区域用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据,该区域包括了一个 运行时常量池区域,运行时常量池用于存放编译期生成的各种字面量(literal)和符号引用,这部分当内存不足时,会抛出 OutOfMemoryError异常。


二、线程私有的内存区域

    1. 程序计数器

        这是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器,每条线程都需要有一个独立的程序计数器,各个线程之间计数器互不影响。当线程执行的是一个java方法时,计数器记录的是虚拟机字节码指令的地址;当线程执行的是Native方法时,这个计数器值为空。 此内存区域是唯一一个在java虚拟机规范中没有规定任何OutOfMemoryError情况的区域。

    2. 虚拟机栈

        每个方法在执行时都会创建一个栈帧,一个方法对应一个栈帧。栈帧用来存储局部变量表、操作数栈等(比如在一个方法里定义的局部变量就存在这里),每一个方法从调用直到执行完成的过程,就是这个方法对应的栈帧在虚拟机栈入栈到出栈的过程。如果线程请求的栈深度大于虚拟机所允许的深度,将抛出StackOverflowError异常;如果虚拟机栈可以动态扩展,那么在扩展时如果无法申请到足够的内存,就会抛出 OutOfMemoryError异常。

    3. 本地方法栈

        本地方法栈发挥的作用于虚拟机栈类似,只不过虚拟机栈为虚拟机执行java方法服务,而本地方法栈为虚拟机使用到的Native方法服务,本地方法栈也会抛出StackOverflowError和OutOfMemoryError异常。

你可能感兴趣的:(java,虚拟机)