说明
java虚拟机运行时数据区域可划分为:堆、方法区、栈(虚拟机栈和本地方法栈)、程序计数器等四类
程序计数器
程序计数器是当前线程执行的字节码的行号指示器,字节码解释工作通过改变这个计数器的
值来选择下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能
都需要依赖这个计数器来完成。
java虚拟机的多线程是通过线程轮流切换并分配处理器执行时间的方式实现的,在任何一个
确定的时刻,一个处理器都只会执行一条线程中的指令。因此,为了线程切换后能够恢复到正
确的执行位置,每条线程都需要有一个独立的程序计数器,各条线程之间计数器互不影响,独
立存储,该区域为线程私有的内存
虚拟机栈
虚拟机栈描述的是每个方法执行的内存模型。每个方法在执行的同时都会创建一个栈帧用于
存储局部变量、操作数栈、动态链接、方法出口等信息。每个方法的调用开始到结束对应着一
个栈桢在虚拟机中入栈到出栈的过程。局部变量存储各种基础数据类型(四类八种)、引用类
型及returnAddress类型。局部变量所需的内存大小在编译期间就可知,在方法运行期间不会改
变大小。在该区域规定了两种异常类型StackOverflowError和OutOfMemoryError。
本地方法栈
本地方法栈和虚拟机栈类似,本地方法栈主要是调用Native方法,native方法所使用的语言、
实现方式并没有做强制要求,不同的虚拟机有不同的实现方式。
堆
堆是java虚拟机管理的内存最大的一块。堆是所有线程所共享的一个区域,几乎所有的实例
都在这块内存分配。java堆又分为新生代和老年代;新生代又分为eden区,from survivor区和
to survivor区。
方法区
方法区是所有线程共享的区域。它存储已被虚拟机加载的类信息、常量、静态变量、即时编
译器编译后的代码等。该区域也可以被称为永久代。运行时常量池是方法区的一部分,Class
文件中除了有类的版本、字段、方法、接口等的描述信息外,还有一项就是常量池,用于存放4
编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池
参考资料:《深入理解java虚拟机 JVM高级特性及最佳实践》