22.Parallel GC、CMS GC、ZGC、Azul Pauseless GC最主要的不同是?背后的原理也请简单描述下?
参考: https://snailclimb.gitee.io/javaguide/#/docs/java/jvm/JVM垃圾回收?id=41-serial-收集器
GC类型 | 简单说明 | 背后的原理 |
---|---|---|
Serial | 最简单的收集器,单线程,stop the world | 简单而高效, 新生代采用复制算法,老年代采用标记-整理算法。 |
Parallel GC | 多线程版的收集器 | 并发收集,多线程 |
CMS GC | CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用. | “标记-清除”算法,并发收集、低停顿 |
G1收集器 | G1 (Garbage-First) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能特征. | G1 收集器在后台维护了一个优先列表,每次根据允许的收集时间,优先选择回收价值最大的 Region(这也就是它的名字 Garbage-First 的由来)。这种使用 Region 划分内存空间以及有优先级的区域回收方式,保证了 GF 收集器在有限时间内可以尽可能高的收集效率(把内存化整为零)。 |
ZGC | ZGC: 可扩展的低延迟的垃圾回收器 | 逻辑上一次ZGC分为Mark(标记)、Relocate(迁移)、Remap(重映射)三个阶段, 详见https://www.jianshu.com/p/4e4fd0dd5d25 |
23.请写一段程序,让其运行时的表现为触发5次ygc,然后3次fgc,然后3次ygc,然后1次fgc,请给出代码以及启动参数。
24. Go的Coroutine和Java的线程机制最主要的不同是?如果Java语言要透明的实现Coroutine,你觉得主要的难点是?
Java的线程机制主要还是基于Native Thread,Go的Coroutine是进程里自己管理的一种"Thread",所以在高并发的场景下,Coroutine可以有效的降低比较重的native的线程上下文切换,从而来提高并发处理能力。
但目前很多的Java版本的Coroutine实现都不是很透明,非常多的限制,导致Java很难用上,比较难的是Java里有很多类似synchronized、各种锁、BIO等造成Native Thread直接block住的地方,怎么让这些地方在Coroutine环境里也透明的不block native thread,是关键问题,感兴趣的大家可以关注下Openjdk的Project Loom,以及阿里的AJDK Coroutine Wisp。