Java 虚拟机运行时的数据区域(简单理解)

2019-02-01  本文已影响0人  6ea566508d0d

Java 虚拟机运行时的数据区域图示

Java 虚拟机运行时的数据区域

程序计数器(Program Counter Register)

简单理解:线程私有、行号指示器

程序计数器:是一小块内存区域,它可以看作是当前线程所执行字节码的行号指示器。
字节码解释器工作时,就是通过改变程序计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能都要依赖程序计数器来完成。


Java 虚拟机栈(Java Virtual Machine Stacks)

简单理解:线程私有、描述 Java 方法执行过程

虚拟机栈:描述 Java 方法执行的内存模型。它的生命周期同线程。
每个方法执行的时候都会创建一个栈桢,每个方法的调用直至执行完成,就对应一个栈桢在虚拟机栈中入栈到出栈道过程


本地方法栈(Native Method Stack)

简单理解:线程私有、描述 Native 方法执行过程

本地方法栈:与 Java 虚拟机栈发挥到作用非常相似。
虚拟机栈:为虚拟机执行 Java 方法服务;本地方法栈:为虚拟机执行 Native 方法服务


Java 堆(Java Heap)

简单理解:线程共享、存放对象实例

Java 堆:被所有线程共享的一块内存区域,在虚拟机启动时创建。
Java 堆内存区域的唯一目的就是:存放对象实例(但,对象实例都分配在堆上,不是绝对的)
Java 堆是垃圾收集器管理的主要区域,很多时候也被称为“GC堆(Garbage Collected Heap)”
根据 Java 虚拟机规范规定:Java 堆可以处于物理上不连续的内存空间中,只要逻辑上连续即可

内存分配的角度:
线程共享的 Java 堆可能划分出多个线程私有的分配缓冲区(Thread Local Allocation Buffer,TLAB)


方法区(Method Area)

简单理解:线程共享、存放对象实例以外的数据

方法区:与 Java 堆一样,被所有线程共享的一块内存区域。
方法区用于存储:已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
类信息:存储类名、访问修饰符、常量池、字段描述、方法描述等
习惯在 HotSpot 虚拟机上开发、部署的开发者,更愿意将方法区称为“永久代(Permanent Generation)”

运行时常量池(Runtime Constant Pool Table)

简单理解:线程共享、存放字面量、符号引用、直接引用

运行时常量池:方法区的一部分。
Class 文件除了有类的版本、字段、方法、接口等描述信息;还有一项信息,便是常量池,用于存放编译期生成的各种字面量和字符引用,这部分内容(常量池)将在类加载后进入方法区的运行时常量池中存放。
不过,一般来说,除了保存 Class 文件中描述的符号引用外,还会把翻译出来的直接引用也存储在运行时常量池中。


直接内存(Direct Memory)

直接内存:这块内存区域,不是虚拟机运行时的数据区域的一部分,也不是 Java 虚拟机规范中定义的内存区域。
Nio 操作时,为提高效率,避免在 Java 堆和 Native 堆中来回复制数据,运行直接操作堆外内,即直接内存。


总结一下

概念及要点

同步策略

异常


参考:深入理解Java虚拟机

上一篇 下一篇

猜你喜欢

热点阅读