JVM运行时数据区里有什么

来自《深入了解Java虚拟机》

在这里插入图片描述

1. 线程共享的数据区

1.1 方法区

又叫Non-Heap,属于各个线程所共有的,存储已经被加载的类信息,常量,静态变量,即时编译后的代码,还有运行时常量池

  1. JDK1.2~JDK1.6 Hotspot使用永久代实现方法区。
  2. JDK1.7开始移除永久代,符号表被移动到 Native Heap中,字符串常量和类引用被移动到 Java Heap中。
  3. JDK1.8用元空间来替换。

1.2 堆内存

Java Heap ,JVM管理的内存中最大的一块,存放着基本上所有的实例对象。也是GC主要管理的区域。

  1. Java堆中分为新生代和老生代,或者Eden,From Survivor ,To Survivor。
  2. Java堆可以处于物理上的不连续内存空间。
  3. 可能划分为多个线程私有的分配缓冲区。

2.线程隔离的数据区

2.1 Java虚拟机栈

Java虚拟机栈属于线程私有,生命周期和线程相同,每个方法执行的时候都会创建一个栈帧,用来存储局部变量表,操作数栈,动态链接,方法出口等信息。

  1. 局部变量表:存放编译期可知的各种基本类型,引用类型,returnAddress(指向一条字节码指令的地址)。long和double类型的数据占用两个局部变量空间,其余类型只占用一个。
  2. 局部连变量表所需的空间在编译期间已经确定的,方法运行期间不会改变局部变量表的大小。

2.2 本地方法栈

本地方法栈和虚拟机栈的作用相似,Java虚拟机栈执行的是Java方法(字节码),本地方法栈是为Native方法服务的。

部分虚拟机将本地方法栈和虚拟机栈进行了合并。

2.3 程序计数器

很小的一块内存空间,当前线程所执行的字节码的行号指示器。Java虚拟机的多线程是通过线程轮流切换并分配处理器的执行时间来实现。

发布了56 篇原创文章 · 获赞 3 · 访问量 1191

猜你喜欢

转载自blog.csdn.net/qq_40788718/article/details/103172169
今日推荐