JVM内存区域类别

时间:2021-12-19 20:50:09

以一个图整体概括java虚拟机运行时数据区(引自JVM高级特效与最佳实践)

JVM内存区域类别

 

从图中我们可以看出,分为方法区,虚拟机栈,本地方法栈,堆,程序计数器。

程序计数器: 

  程序计数器主要作用是用于记录程序的执行位置,即该线程执行到那个指令。对于多线程,经常会有上下文切换,那么每个线程必须有它独有的程序计数器,也就是说程序计数器是线程私有的模块。有一种情况,当执行本地方法时。程序计数器为空(因为计数器记录的是编译后的java指令,本地方法不在内).

虚拟机栈:

  我们经常把java内存分为堆和栈,栈指的就是虚拟机栈。虚拟机栈是线程私有的,与线程的生命周期相同。描述的是java方法执行的内存模型:描述从一个方法的入口,局部变量,操作,动态链接,以及出口的一个过程。虚拟机栈存放了了boolean,int,double等基本类型的数据以及对象的引用。

本地方法栈:

  本地方法栈和虚拟机栈相似,虚拟机栈执行的是虚拟机代码,本地方法栈执行的是native方法。

堆:

  堆是虚拟机中内存最大的一块区域,主要储存java对象。是被所有线程共享的区域。同时也是垃圾回收器的主要区域,堆中分为几个部分,比如初生代,年老代等,主要是方便GC回收。

方法区:

  方法区放到主要内容是类的加载信息,常量,静态变量。一般不受GC管理,中间储存常量的叫常量池。

除此之外,还有一个内存叫直接内存。

直接内存:

  直接内存并不是java虚拟机内存的一部分,不受java堆大小的限制。直接与内存交互,比如java.nio的内存映射,就是用的直接内存,速度比java.io要快。当然太大也会引起内存泄漏,毕竟和机器的内存有关。