判断Java中的对象是否存活
引用计数法
可达性分析
复制算法——适合新生代(存活率不高)
虚拟机把新生代分为了三部分: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区满了,所有对象被移动到老年代
优缺点
- 不会产生内存碎片
- 耗费内存空间
标记清除:适合老年代
标记清除算法就是当程序运行期间,若可以使用的内存被耗尽的时候,GC线程就会触发并将程序暂停,随后将要回收的对象利用可达性分析算法标记一边,最终统一回收这些对象,完成标记清理工作接下来便让应用程序恢复运行。
