为什么一定要分代呢,如果不分代会怎么样
###确实没人说一定要分代。
分代理论是说大多数对象都是朝生夕亡,而只有少数对象是一直存活的。所以分代后可以便于对不同类型的对象进行管理从而得到自己想要的收益,比如吞吐量或者延迟。
但是分代之后需要解决跨代引用,分区比例等等的问题。解决这些也需要资源。
那么有些场景下没有那么多资源来解决,或者在本身只需要一次运行就可以退出(就不需要对象管理)。那就不需要引入分代。我记得java用的虚拟机里应该是有的,好像是eclipse开发的一个
1、年老代的对象一般都是从年轻代晋升上来的,说明不容易死,如果不分代,GC的效率就低了,低的原因是,每次GC需要把Eden+S0的对象复制到S1上去,不分代,Eden+S0就会很大,分代了,存活的对象就少了,减少了复制的内存大小。
2、不分代,每次标记垃圾的时候,就需要遍历所有的对象,分代了,只需要遍历年轻代的对象就行了,不需要遍历年老代的对象,是不是效率就高了,当然是YGC的时候。
3、减少了碎片,这个好理解吧,对象一直活着不死,所以碎片的概率就会增大。
我一直以为,对于虚拟机这类的底层应用来说,复杂度从来不是优先考虑的事情,所以分代应该和复杂度没有关系。
关注我的博客,获取更多Java编程知识: https://www.epoooll.com/
###为了职责更加清晰吧,就像区分新员工和老员工一样。一听说是老员工,心里也觉得靠谱多了,虽然不一定靠谱。不分代当然也可以,就是增加了维护成本和理解成本。说得抽象一点的化,解耦合,加聚合。
###首先,并不一定分代,比如最新的ZGC就不分代
分代只是众多算法的一种,而且要配合其他算法使用(比如新生代使用标记复制,老年代使用标记清除)
使用分代的优点是在很多场景下吞吐量更优,但是并不会缩短最大暂停时间
缺点是某些场景(比如大量大对象)下表现反而会变差
gc 是为了提高内存利用 避免内存泄露和溢出 分代是为了提高gc效率 也就是楼上所说的YGC 并不是每次GC都需要遍历所有对像