JVM知识点总结(一)——运行时数据区

虚拟机规范的运行时数据区域:
java虚拟机运行时数据区

各区域简介:

1. 程序计数器(PC)

它是线程私有的,每个线程都会有一个独立的PC。它可以看做是当前线程所执行的字节码的行号指示器,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖它。

2. Java虚拟机栈:

它是线程私有的,它的生命周期与线程相同,他描述的是Java方法执行的内存模型,每个方法执行时都会创建一个栈帧用于存储局部变量表、操作数栈等。每一个方法从调用 直至完成的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
通常说的“堆栈”中的栈,指的是虚拟机栈的局部变量表部分。局部变量表存放了编译器可知的各种基本数据类型(boolean、byte、char、short、int、float、long、double)、对象引用和returnAddress类型(指向一条字节码指令的地址)。局部变量表每个slot是32位,double和long会占用两个slot。

3.本地方法栈

作用和虚拟机栈相同,只不过它针对的是Native方法。在Hotspot虚拟机中,它和虚拟机栈实现到一起了。

4.Java堆

它是线程共享的,虚拟机启动时创建。它是Java虚拟机所管理的内存中最大的一块,虚拟机规范描述为:“所有的对象实例和数组都在堆上分配”,但是由于JIT和逃逸分析等技术,在具体虚拟机实现上可能存在特殊情况。它是垃圾收集器管理的主要区域。(具体的划分请看垃圾回收篇)Java堆可以存在于物理上不连续的空间上,只要逻辑上连续即可。

5.方法区

它是线程共享的,它用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
在Hotspot虚拟机中,方法区被实现为“永久代”,JDK8中被实现为“元空间”。垃圾回收器也会在这个区域进行垃圾回收,只不过出现的次数很少,而且回收效率也很低。
运行时常量池是方法区的一部分,它与类加载机制的内容关联较多。Class文件中除了有类的版本、字段、方法、接口等描述信息外,还有一项信息时常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载后进入方法区的运行时常量池中存放。

参考链接

  1. 《深入理解Java虚拟机(第2版)》
  2. JVM知识点总结(二)——垃圾回收
  3. JVM知识点总结(三)——对象的创建与类加载过程
  4. JVM知识点总结(四)——即时编译(JIT)

猜你喜欢

转载自blog.csdn.net/xtick/article/details/81012333