关于JVM运行时内存数据区,结合自己的学习经验整理了一张图,在这里分享给大家
(可放大)
解读:在JVM运行时内存区域中,可以按线程共享和线程独立来区分不同的区域
其中我们常说的堆就是线程共享的,它主要用来存放对象实例和数组,我们创建好的对象的引用就指向这里,是JVM管理内存中最大的一块,也是JVM回收的主要区域;
还有一个线程共享的区域是方法区,实质上方法区也是堆的一个逻辑部分,它主要用来存储类信息、常量、静态变量等,在方法区中,还有一个运行时常量池,字符串常量一般存放在常量池中(String s=“abc”)
而线程独立的区域有程序计数器区域,这里主要记录当前线程的字节码指令地址。
另一个线程独立的区域是栈,我们一般说的栈大多指的是虚拟机栈,它是Java方法执行的一个内存模型,每个方法对应一个栈桢,栈桢中保存了这个方法中的局部变量变表(方法中的引用地址保存在这里),操作数栈,动态链接,方法出口等,方法的调用、销毁过程也就对应了栈桢入栈出栈的过程。本地方法栈的作用和虚拟机栈差不多,只是它执行的是Native方法。
是它执行的是Native方法。
此外,JVM还需要管理非JVM运行时数据区的 直接内存,在 JDK 1.4 中新加入 NIO (New Input/Output) 类,引入了一种基于通道(Channel)和缓存(Buffer)的 I/O 方式,它可以使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。可以避免在 Java 堆和 Native 堆中来回的数据耗时操作。