java 内存区域

124 阅读2分钟

运行时数据区域

程序计数器

程序计数器是一块较小的内存空间,可以当做是当前线程所执行的字节码的行号指示器。在java虚拟机中,字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的的字节码指令。

java 虚拟机栈

java虚拟机栈也是线程私有的,他的生命周期与线程相同,每个方法执行的时候,java虚拟机栈都会同步一个栈帧,用于存储局部变量表,操作数栈,动态链接,方法出口等信息

本地方法栈

本地方法栈是为虚拟机使用的本地native方法服务

java堆

被各个线程共享,主要存放的是对象实例,也是垃圾回收器主要管理区域,被称为GC堆

方法区

方法区和java堆一样,都是线程共享的,主要存放的是被虚拟机加载的类型信息,常量,静态变量,这区域的内存回收主要目标是针对常量池的回收和对类型的卸载,一般来说,这个区域的回收效果比较难令人满意。

运行时常量池

运行时常量池是方法去的一部分,Class文件处理又累的版本,字段,方法,接口等描述信息之外,还有一项信息是常量池表,用于存放编译器生成的各种字面量与符号引用,这部分内容在类的加载之后存放在方法区的运行时常量池。

直接内存

直接内存并不是虚拟机运行时数据区的一部分,也不是java规范中的内存区域,这部分被经常使用。 1.4之后加入NIO类,引入一种基于甬道与缓冲区的I/0方式,他可以使用native函数库直接分配堆外内存,然后通过一个存储在java堆里面的DirectByteBuffer对象作为这款内存的引用进行操作。

思维导图