public class Demo {
public static String name = "333";
public static void main(String[] args) {
Demo demo = new Demo();
demo.compute();
}
public void compute() {
int a=1;
int b=2;
int c=(a+b)*10;
}
}
1:类加载子系统(把.class文件加载到内存中)
主要有三个加载器:引导类加载器,扩展类加载器,应用程序加载器
2:运行时数据区
- 堆内存:对象信息
- 栈内存:方法,以及局部变量
- 方法区:类信息,常量和静态变量
- 程序计数器:当前线程运行到那个阶段,记录(因为cpu来回切换线程,每个线程执行一阶段时记录,为了当线程切换到时,知道该线程运行到哪一阶段,根据此记录继续执行)
- 本地方法栈:调用native方法时存的信息
3 :字节码执行引擎
(目前还不清楚)
4:栈内存
- 局部变量表:方法里面的变量 例: a,b,c
- 操作数栈 :存放变量值 例:1,2
- 动态链接:
- 方法出口:记录当前方法结束后,需要回到那个阶段继续执行 例:main方法调用compute方法,compute方法的 “方法出口”就是main的 demo.compute(); compute方法执行完,会在main方法继续执行
执行方法时:会在栈内存给该方法分配一个空间,叫做栈帧
1:eden : 数据先存入到eden区域
2:当eden第一次区域数据满,执行minor gc,清理eden区域, eden还有引用的数据,则先移动到s0(这次的数记录为a(+1)) (数据移动几次,记录几次。记录15直接移动到老年代)
3: 当eden第二次 区域数据满,执行minor gc. 清理eden区域,同时清理s0,s1. 清理s0区域数据,如果还有引用的数据 移动到s1(这次的数据 记录为s(+1)), eden还有引用的数据,则先移动到s0(这次的数记录为a(+2))
当执行gc是 所有用户线程暂停: