java面试重点自记--垃圾回收GC

1.java对象创建过程

创建步骤

  1. step1 :类加载检查
    类加载检查
  2. step2:分配内存
    分配内存
    在这里插入图片描述
    内存分配并发问题(补充内容,需要掌握)
    内存分配并发问题
  3. step3:初始化零值
    初始化零值
  4. step4:设置对象头
    设置对象头
  5. step5:执行init方法
    执行init方法

2.对象的访问定位有哪两种方式?

对象定位方式
对象的访问定位
句柄方式
直接指针
直接指针

总结:

这两种对象访问⽅式各有优势。使⽤句柄来访问的最⼤好处是 reference 中存储的是稳定的句柄地址,在对象被移动时只会改变句柄中的实例数据指针,⽽ reference 本身不需要修改。使⽤直接指针访问⽅式最⼤的好处就是速度快,它节省了⼀次指针定位的时间开销。

3.JVM内存分配与回收

Java自动内存管理

1)堆空间的基本结构

对空间基本结构
修正

 修正

  • 动态年龄计算的代码如下:
uint ageTable::compute_tenuring_threshold(size_t survivor_capacity) {
	//survivor_capacity􀸎survivor􁑮􁳵􁌱􀥟􀩜
	size_t desired_survivor_size = (size_t)((((double)
	survivor_capacity)*TargetSurvivorRatio)/100);
	size_t total = 0;
	uint age = 1;
	while (age < table_size) {
		total += sizes[age];//sizes􀷄􁕟􀸎􀾯􀓻􀬙􁼻􀾧􀩒􁨝􀥟􀩜
		if (total > desired_survivor_size) break;
		age++;
	}
	uint result = age < MaxTenuringThreshold ? age : MaxTenuringThreshold;
	...
}

更新

2)堆内存中对象的分配基本策略

堆内存对象分配基本策略

1> 对象优先在eden区分配

对象优先在eden区分配
测试

public class GCTest {
	public static void main(String[] args) {
		byte[] allocation1, allocation2;
		allocation1 = new byte[30900*1024];
		//allocation2 = new byte[900*1024];
	}
}

测试
eden分配
allocation2
分配担保机制

public class GCTest {
	public static void main(String[] args) {
		byte[] allocation1, allocation2,allocation3,allocation4,allocation5;
		allocation1 = new byte[32000*1024];
		allocation2 = new byte[1000*1024];
		allocation3 = new byte[1000*1024];
		allocation4 = new byte[1000*1024];
		allocation5 = new byte[1000*1024];
	}
}

2> 大对象直接进入老年代

大对虾直接进入老年代

3> 长期存活的对象将进入老年代

长期存活的对象将进入老年代
在这里插入图片描述

4> 动态对象年龄判定

静态对象年龄判定
动态对象年龄判定
补充说明

5> 主要进行GC的区域

R大解释

  • List item

总结

在这里插入图片描述在这里插入图片描述

6> 判定对象是否死亡的两种方法

堆中几乎放着所有的对象实例,对堆垃圾回收前的第一步就是要判断哪些对象已经死亡(即不能再被任何途径使用的对象)

  1. 引用计数法
    引用计数法
  2. 可达性分析算法
    可达性分析
    可达性分析1

7> 强引用、软引用、弱引用、虚引用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 强引用(Strong Reference)
    强引用
  2. 软引用 (Soft Reference)
    软引用
  3. 弱引用 (Weak Reference)
    弱引用
  4. 虚引用 (Phantom Reference)
    虚引用
    区别注意

3)判断一个常量是废弃常量的策略

废弃常量

4)判断一个类是无用的类的策略

无用的类

5)垃圾收集有哪些算法,各自的特点?

1> 标记-清除算法

标记清除
内存整理

2> 复制算法

复制算法
复制算法图

3> 标记-整理算法

标记整理

4> 分代收集算法

分代收集算法

6)HotSpot为什么要分为新生代和老年代?

主要为了提升GC效率。上面提到的分代收集算法已经很好的解释了这个问题。

7)常见的垃圾回收器有哪些?

常见的垃圾回收器
在这里插入图片描述

1> Serial 收集器

serial收集器
在这里插入图片描述

2> ParNew 收集器

ParNew收集器

在这里插入图片描述

3> Parallel Scavenge 收集器

parallel Scavenge

parallel Scavenge收集器
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4> Serial Old 收集器

serial old

5> Parallel Old 收集器

Parallel Old

6> CMS 收集器

CMS
标记过程
CMS线程
CMS缺点

7> G1 收集器

GF
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

8> ZGC收集器ZGC

新一代垃圾回收器ZGC的探索与实践

ZGC
在这里插入图片描述
ZGC
ZGC原理

ZGC只有三个STW阶段:初始标记,再标记,初始转移。其中,初始标记和初始转移分别都只需要扫描所有GC Roots,其处理时间和GC Roots的数量成正比,一般情况耗时非常短;再标记阶段STW时间很短,最多1ms,超过1ms则再次进入并发标记阶段。即,ZGC几乎所有暂停都只依赖于GC Roots集合大小,停顿时间不会随着堆的大小或者活跃对象的大小而增加。与ZGC对比,G1的转移阶段完全STW的,且停顿时间随存活对象的大小增加而增加。

  • ZGC关键技术

ZGC通过着色指针和读屏障技术,解决了转移过程中准确访问对象的问题,实现了并发转移。大致原理描述如下:并发转移中“并发”意味着GC线程在转移对象的过程中,应用线程也在不停地访问对象。假设对象发生转移,但对象地址未及时更新,那么应用线程可能访问到旧地址,从而造成错误。而在ZGC中,应用线程访问对象将触发“读屏障”,如果发现对象被移动了,那么“读屏障”会把读出来的指针更新到对象的新地址上,这样应用线程始终访问的都是对象的新地址。那么,JVM是如何判断对象被移动过呢?就是利用对象引用的地址,即着色指针。下面介绍着色指针和读屏障技术细节。

  • 着色指针:着色指针是一种将信息存储在指针中的技术。
    ZGC仅支持64位系统,它把64位虚拟地址空间划分为多个子空间,如下图所示:
    着色指针

    • 其中,[0~4TB) 对应Java堆,[4TB ~ 8TB) 称为M0地址空间,[8TB ~ 12TB) 称为M1地址空间,[12TB ~ 16TB) 预留未使用,[16TB ~ 20TB) 称为Remapped空间。
    • 当应用程序创建对象时,首先在堆空间申请一个虚拟地址,但该虚拟地址并不会映射到真正的物理地址。ZGC同时会为该对象在M0、M1和Remapped地址空间分别申请一个虚拟地址,且这三个虚拟地址对应同一个物理地址,但这三个空间在同一时间有且只有一个空间有效。ZGC之所以设置三个虚拟地址空间,是因为它使用“空间换时间”思想,去降低GC停顿时间。“空间换时间”中的空间是虚拟空间,而不是真正的物理空间。后续章节将详细介绍这三个空间的切换过程。
    • 与上述地址空间划分相对应,ZGC实际仅使用64位地址空间的第041位,而第4245位存储元数据,第47~63位固定为0。
      ZGC将对象存活信息存储在42~45位中,这与传统的垃圾回收并将对象存活信息放在对象头中完全不同。
      在这里插入图片描述
  • 读屏障:读屏障是JVM向应用代码插入一小段代码的技术。当应用线程从堆中读取对象引用时,就会执行这段代码。需要注意的是,仅“从堆中读取对象引用”才会触发这段代码。

Object o = obj.FieldA   // 从堆中读取引用,需要加入屏障
<Load barrier>
Object p = o  // 无需加入屏障,因为不是从堆中读取引用
o.dosomething() // 无需加入屏障,因为不是从堆中读取引用
int i =  obj.FieldB  //无需加入屏障,因为不是对象引用

ZGC中读屏障的代码作用:在对象标记和转移过程中,用于确定对象的引用地址是否满足条件,并作出相应动作。
ZGC 并发处理
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Changcc_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值