Java自动内存管理的核心是Java堆对象的分配和回收
Java的垃圾回收主要在Java堆中,也被成为GC堆,从垃圾回收的角度看,现在的垃圾收集器采用分代收集算法,因此Java堆也可以分为,新生代和老年代。新生代中可以分为Eden区、From Survivor、To Survivor。

对象优先在新生代的Eden区分配内存,大对象和长期存活的对象会进入老年代。

如何判断对象是否存活

1.引用计数法

2.可达性分析算法

垃圾回收算法

现在的垃圾收集器采用分代收集算法,为新生代和老年代采用不同的垃圾回收算法。
新生代主要采用复制法,老年代采用标记-整理法

垃圾回收算法包含:
标记-清除法
标记存活的对象,然后将没有标记的对象清除
复制法
新生代分为Eden区和From Survior、To Survivor区
分配内存时优先在Eden区分配,当需要进行垃圾回收时,将存活的对象复制到To Survivor区中,把其他的空间清理掉,并且交换From Survivor和To Survivor区
标记-整理法
标记存活的对象,并且将存活的对象向内存的一端进行移动。
减少内存碎片问题

垃圾收集器

Serial收集器

单线程收集,进行垃圾收集工作时,会暂停所有的工作线程,直到它收集结束。
新生代采用标记-复制法,老年代采用标记-整理法

ParNew收集器

多线程收集,是Serial收集器的多线程版本
新生代采用标记-复制法,老年代采用标记-整理法
是并发收集器

Parallel Scavenge 收集器

关注点是考虑吞吐量,如何高效的使用CPU
新生代采用标记-复制法,老年代采用标记-整理法

CMS收集器

是一种以获取最短回收停顿时间为目标的收集器,适合在注重用户体验的机器上使用。
CMS收集器是Hotspot虚拟机上第一个真正意义的并发收集器,做到了用户线程和垃圾收集线程并发工作
标记-清除法
优点:并发、停顿时间短
缺点:无法处理浮动垃圾、标记-清除法会导致大量内存碎片产生。
垃圾收集过程:
初始标记
并发标记
重新标记
并发清除

G1收集器

以最高概率满足GC的停顿时间短的需求下,还具备高吞吐量的特性。
特点:
并发和并行
分代收集
空间整合
可预测的停顿

每次根据允许停顿的时间,优先选择回收价值大的Region回收。

参考:

https://javaguide.cn/java/jvm/jvm-garbage-collection.html#_1-%E6%8F%AD%E5%BC%80-jvm-%E5%86%85%E5%AD%98%E5%88%86%E9%85%8D%E4%B8%8E%E5%9B%9E%E6%94%B6%E7%9A%84%E7%A5%9E%E7%A7%98%E9%9D%A2%E7%BA%B1
https://blog.csdn.net/yubujian_l/article/details/80804708
https://mp.weixin.qq.com/s/nSwNZpObWLGteG-v7n5PSw