image.png

判断Java中的对象是否存活

引用计数法

jdk1.1 后已经弃用

可达性分析

复制算法——适合新生代(存活率不高)

虚拟机把新生代分为了三部分:1个Eden区和2个Survivor区(分别叫from和to),默认比例为8:1:1。

一般情况下,新创建的对象都会被分配到Eden区(一些大对象特殊处理),这些对象经过第一次Minor GC后,如果仍然存活,将会被移到Survivor区。对象在Survivor区中每熬过一次Minor GC,年龄 +1,当它的年龄增加到一定程度时(默认是 15 ,通过-XX:MaxTenuringThreshold来设定参数),就会被移动到年老代中。

复制算法的基本思想就是将内存分为两块(8:1:1),每次只用其中一块(from),当这一块内存用完,就将还活着的对象复制到另外一块to上面。

在GC未开始的时候,对象只会存在Eden区和from区,to区是空的,紧接着GC开始,Eden区所有的存活对象都会被复制到to区(年龄为1),而在from区要根据他们的年龄决定去向,如果年龄达到15则被移动到old区,如果年龄没有达到15则加1复制到
to区,现在Eden区和from区的对象都有了去向,然后就会被清空(Eden、from为空,to不空)。
这时from区和to区会转换角色,也就是说Eden区和to为空,from区不空,往Eden区新建对象,则Eden也不空了,同GC未开始的状态一样。
[

](https://blog.csdn.net/q961250375/article/details/107859902)
当to区满了,所有对象被移动到老年代

优缺点

  1. 不会产生内存碎片
  2. 耗费内存空间

    标记清除:适合老年代

    标记清除算法就是当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会触发并将程序暂停,随后将要回收的对象利用可达性分析算法标记一边,最终统一回收这些对象,完成标记清理工作接下来便让应用程序恢复运行。

标记压缩:适合老年代

image.png

优缺点

  1. 没有内存随便
  2. 需要移动对象的成本,效率也不高

    标记-清除-压缩

  3. 标记清除

  4. 但只有当多次多次GC后才进行压缩