本文是关于网易云课堂上《带你重新认识JVM》的简单笔记。
Java代码执行流程如下图:
方法区:包含类信息,常量,静态变量JIT编译后的代码,存在垃圾回收机制,回收效率低,可能存在OOM。
堆内存:存放对象实例,几乎所有对象和数组。
Java对象在内存中的布局:
1.在堆中存对象,存的是啥?
局部变量存在栈,对象字段存在于堆中
Teacher james = new Teacher();
jame.stu = new Student();
james存在于栈,而 jame.stu存在于堆中,如上图
2.堆内存中对象如何被回收
a.引用计数器法,缺陷:相互应用的情况
b.可达性分析算法,可达GC Roots
GC Roots:虚拟机栈,方法中静态熟悉引用对象(存在方法区),方法中常量引用对象,Native方法应用对象
虚拟机栈:线程中方法执行的模型,每个方法执行时,就会在虚拟机栈中新建一个栈帧,
方法从调用到执行的过程,对应着栈帧在虚拟机中入栈和出栈的过程,先进后出。
栈帧就是虚拟机栈中的一个元素,代表着一个方法的调用,比如main方法调用就相当一个栈帧。
栈帧中动态引用:共享区中对方法区中的引用
栈帧包含:本地变量表,操作数栈和其他栈信息,本地变量表用于代表变量,用于存放变量数据,操作数栈用于存放临时变量,用于存放目前需要操作的变量
线程是什么?代码流
程序计数器,用于记录CPU执行到代码哪个部分,方便多线程切换
Java类文件结构
Class文件结构,《深入理解Java虚拟机》第六章
Todo:
回收机制深入理解
《深入理解Java虚拟机》 学习