JVM内存结构

277 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

image.png

堆是所有类实例和数组的内存分配的运行时数据区。 虚拟机启动时创建。 堆可以为固定大小或动态扩展 堆的内存逻辑连续,物理不连续 堆是线程共享的 对象的堆存储由垃圾收集器回收。

堆栈

Java虚拟机堆栈存储帧。包含局部变量和部分结果,并在方法调用和返回中扮演角色。 每个线程都有一个私有Java虚拟机堆栈,同时创建线程的堆栈 堆栈可以为固定大小或动态扩展 堆栈是线程不共享的。

本地方法栈

与虚拟机栈类似,为Native方法服务。一般是java调用其他语言时使用。

方法区

存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。 可以为固定大小或动态扩展 方法区是线程共享的 方法区可以不被垃圾收集器回收。

运行常量池
存放编译器生成的各种字面量和符号引用以及直接引用。 方法区的一部分。

程序计数器
当前线程所执行的字节码的行号指示器。 字节码解释器工作时就是通过改变这个计数器的值来选取下一条需要执行的字节码指令。

直接内存
非虚拟机运行时内存 基于通道与缓冲区的NIO模式下,直接内存可以使用native函数库直接分配堆外内存,然后通过一个存 储在java堆中的DirectByteBuffer对象作为这块内存的引用进行操作。避免java堆和natice堆中来回复制数据。