每一个方法都会开辟一个栈帧
3、程序计数器:如果正在执行的是 Native 方法,这个计数器的值则为 (Undefined)。此内存区域是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域。
4、1.7永久代1.8后的元空间JDK7 之前(永久代)用于存储已被虚拟机加载的类信息、常量、字符串常量、类静态变量、即时编译器编译后的代码等数据。
jdk1.8后移除了(永久代)取代它的被称为元空间,
元空间和永久代的区别是:元空间不在虚拟机内存,使用的是本地内存(直接内存)
6.1、局部变量表和操作数栈
6.2、动态链接
句柄链接
句柄池实现思路
直接连接
直接指针实现思路
比较:
使用句柄的最大好处是存储的是稳定的句柄地址,在对象移动(GC)是只改变实例数据指针地址, 自身不需要修改。
直接指针访问的最大好处是速度快,节省了一次指针定位的时间开销。
如果是对象频繁 GC 那么句柄方法好,如果是对象频繁访问则直接指针访问好。
6.3、方法出口
7、堆:对象回收
如何识别回收对像
8、栈中对象的引用:普通对象
打印new User的引用地址数据
数组对象会多一个length
打印10长的数组,分配10个空对象
关于对象头Mark Word(重)
9、Class的加载方式双亲委派机制
10、对象的引用(1) 强引用 (Strong Reference)
当内存空间不足时,Java虚拟机宁愿抛出OutOfMemoryError,也不会随意回收这个对象,如果不使用这个1对象的时候,可以显式它的引用赋值为null,这样就会被垃圾回收器回收。
(2) 软引用(Soft Reference)
(3) 弱引用(Weak Reference)
只要发现只有弱引用的对象就会立即回收,eg.ThreadLocalMap
(4) 虚引用(Phantom Reference)
2.3 GC算法(1)标记清除算法:
分为标记和清除两个阶段,首先先标记所有要回收的对象,在标记完成之后统一回收被标记的对象。缺点是效率低和会产生大量不连续的内存碎片
(2)复制算法:
主要用于新生代的回收,把内存划分成大小相等的两块,每次只使用其中的一块,每次把GC后存活的对象复制到另一块上,然后清理已经使用过的内存。优点是效率高和实现简单
(3)标记整理算法:
主要用于老年代的回收,先标记需要回收的对象,然后将存活的对象移向一端,然后直接清理掉边界外的内存