jvm内存模型
简单的说一下JDK体系结构
- JDK
- Java Language
- Tools&Tool APIs
- JRE
- Deployment
- User Interface Toolkits
- Integration Libraries
- Other Base Libraries
- lang and util Base Libraries
- Java virtual Machine
再来一个熟悉的代码:
package com.dqsy.jvm;
public class Calculate {
public static int a=6;
public static User user=new User();
public void count() {
int a = 5;
int b = 6;
int sum = a + b;
System.out.println(sum);
}
public static void main(String[] args) {
Calculate calculate = new Calculate();
calculate.count();
System.out.println("执行结束");
}
}
jvm内存模型:
对以上图片进行详细描述
虚拟机栈(先进后出)
每个虚拟机栈都有一个独立的程序计数器、栈帧(一个方法对应一个栈帧)、本地方法栈。当线程每执行完一个方法时就会伴随着栈帧的出栈,即方法的销毁。
栈帧
每个方法对应一个栈帧,栈帧里面有成员变量表、操作数栈、动态链接、方法出口。
成员表量表
以数组的形式存储成员变量,里面有一个内置的对象this,数组角标为0,存储a、b、sum成员变量。
操作数栈
存储方法(栈帧)里面的成员变量的值(操作数),根据jvm汇编指令码,将操作数压入操作数栈之后会将操作数赋给成员变量表中对应的成员变量(出栈)
动态链接
在程序运行期间,将符号引用替换为内存中该符号存储地址的引用或句柄(直接引用)。
方法出口
例如以上代码,当运行主方法时 执行calculate.count(),方法出口会记录main()中代码执行的位置,当count()执行完毕之后,回到main()方法出口记录的代码位置,继续执行System.out.println(“执行结束”)。
本地方法栈
当线程执行的时候调用到本地方法(native)本地方法栈会给线程分配一块内存用以存储数据
程序计数器
记录jvm汇编指令码的行号,程序计数器是jvm虚拟机中唯一不存在内存溢出的内存
字节码执行引擎
字节码执行引擎执行已经加载到方法区中的字节码,监控jvm汇编指令码的指令,因此字节码执行引擎可以修改程序计数器,字节码执行引擎在jvm虚拟机进行垃圾回收时可在后台开启垃圾回收机制
堆
- 年轻代
- Eden区
- Survivor区
- Survivor0
- Survivor1
- 老年代
年轻代:老年代=1:2
Eden区:Survivor0:Survivor1=8:1:1
方法区
方法区中存储常量+静态变量+类信息,方法区中的元空间用的是直接内存,同时类信息的实现底层是c++,一个对象的对象头实际上是指向方法区中的类信息(c++),类信息指向堆中的java.lang.class的对象,间接表示java堆中的对象类型由java.lang.class的对象确定
初学Java请多指教!