Java虚拟机基本结构

JAVA内存模型

Java Memory Model 定义了JAVA虚拟机与堆的工作方式,和线程间通信有关,即线程间共享变量会在堆中存储,每个线程的私有区保存副本。

JAVA虚拟机运行时数据区

Java虚拟机基本结构

1.类加载系统:负责从文件、网络中加载类信息,将类信息存放入方法区,也可能存放运行时常量

2.所有线程共享

  • Java堆:存放Java对象的实例

  • 直接内存区:存放IO频繁的对象

  • 方法区:存放类信息

3.线程私有

  • Java栈:存放帧信息,栈帧:局部变量、操作数栈、帧数据区,与方法调用、返回相关

  • 本地方法栈:作用类似Java栈,用于本地方法(C)调用

  • 程序计数器:记录当前执行的指令,若为本地方法,显示undefined

4.执行引擎:负责解释执行Java字节码

Java堆

JAVA堆结构

所有新创建的对象均位于新生代,经历一次GC后,可能位于from、to区,当对象经历足够多GC后可能位于老年代

Java栈

调用新方法后,会有新栈帧入栈来保存该方法的数据,当该方法结束后会出栈

1.局部变量表:保存函数的参数及局部变量,当函数参数及局部变量过多时,栈中存放栈帧最大数量会减少,及函数嵌套调用次数减少,局部变量槽位可重用

2.操作数栈:保存计算的中间变量

3.帧数据区:保存正常方法返回、异常处理等的数据

栈上分配:对象经过逃逸分析后(未return 当前对象)可将对象保存在栈上,函数调用结束后回收。大对象不支持栈上分配,因栈空间有限

方法区

方法区保存类信息,JDK7以前属于永久区,空间有限,耗尽内存将出现内存溢出,在JDK8中,属于元数据区,不指定大小将可能耗尽所有可用系统内存