本文主要是介绍分代回收算法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
对象分类
这种算法并不是一种新的算法,而是根据对象的存活周期的不同而将内存分为几块,分别是新生代、老年代和永久代。
新生代:朝生夕灭的对象(例如方法的局部变量等);
老年代:存活的比较久但还是要死的对象(例如缓存对象、单例对象等);
永久代:对象生成后几乎不灭的对象(例如加载过的类信息);
内存区域
新生代和老年代都在Java堆,永久代在方法区。
Java对象的回收
新生代:采用复制算法,新生对象一般存活率较低,因此可以不使用50%的内存空间作为空闲,一般的使用两块10%的内存。
作为空闲和活动区间,而另外80%的内存则是用来给新建对象分配内存的。一旦发生GC,将10%的活动区间与另外80%中存活的对象转移到10%的空闲空间,接下来,将之前90%的内存全部释放。以此类推,如图所示:
堆大小=新生代+老年代,新生代和老年代的比例为1:2,新生代细分为一块交大的Eden空间和两块较小的Survivor空间,分别被命名为from和to。
老年代:老年代中使用标记-清除或者标记-整理算法进行垃圾回收,回收次数相对较少,每次回收时间比较长。
方法区对象回收
永久代指的是虚拟机内存中的方法区,永久代垃圾回收 比较少,效率也比较低,但也必须进行垃圾回收,否则永久代内存不够用时仍然会抛出OutOfMemoryError异常。永久代也使用标记-清除或标记-整理算法进行垃圾回收。
这篇关于分代回收算法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!