一.JAVA虚拟机内存模型概念
java虚拟机内存模型
二.从属于线程的内存区域(栈,计数器)
JVM的内存划分中,有部分区域是线程私有的,有部分是属于整个JVM进程;我们将这部分归为一类。
1.程序计数器(Program Countr Register),在JVM规范中,每个线程都有自己的程序计数器。这是一块比较小的内存空 间,存储当前线程正在执行的java方法的JVM指令地址,即字节码的行号。如果正在执行Native方法,则这个计数器为空。
2.java虚拟机栈(Java Virtal Machine Stack),同样也是属于线程私有区域,每个线程在创建的时候都会创建一个虚拟机 栈,生命周期与线程一致,线程退出时,线程的虚拟机栈也回收。虚拟机栈内部保持一个个的栈帧,每次方法调用都会进行 压栈,JVM对栈帧的操作只有出栈和压栈两种,方法调用结束时会进行出栈操作。该区域存储着局部变量表,编译时期可知 的各种基本类型数据,对象引用,方法出口等信息。
3.本地方法栈(Native Method Stock)与虚拟机栈类似,本地方法栈是在调用本地方法时使用的栈,每个线程都有一个本 地方法栈。
三.堆(heap)
堆(Heap),几乎所有创建的java对象实例,都是被直接分配到堆上的。堆被所有的线程所共享,在堆上的区域,会被垃圾回收器做进一步划分,例如新生代,老年代的划分。java虚拟机在启动的时候,可以使用“Xmx”之类的参数指定堆区域的大小。
四.方法区(Method Area)
方法区与堆一样,也是所有的线程所共享,存储被虚拟机加载的元(Meta)数据,包 括类信息、常量、静态变量、即时编译器编译后的代码等数据。
五.运行时常量池(Running-Time Constant Pool)
这是方法区的一部分。常量池主要存放两大类常量:
1. 字面量(Literal),如文本字符串、final 常量值。
2. 符号引用,存放了与编译相关的一些常量,因为Java不像C++那样有连接的过程, 因此字段方法这些符号引用在运行期就需要进行转换,以便得到真正的内存入口地址。
六.直接内存(Direct Memory)
直接内存并不属于 Java规范规定的属于 Java 虚拟机运行时数据区的一部分。Java 的 NIO可以使用 Native 方法直接在 java 堆外分配内存,使用DirectByteBuffer 对象作为这 个堆外内存的引用。