深入理解JVM--分代收集算法

  为什么把这一算法单独拿出来说呢?原因就是分代收集算法是现在的jvm采用的算法。

对象分类

        这种算法并不是一种新的算法,而是根据对象的存活周期的不同而将内存分为几块,分别为新生代、老年代和永久代。

        新生代:朝生夕灭的对象(例如:方法的局部变量等)。

        老年代:存活得比较久,但还是要死的对象(例如:缓存对象、单例对象等)。

        永久代:对象生成后几乎不灭的对象(例如:加载过的类信息)。

内存区域

        回想一下之前jvm对内存的划分,我们可能就已经猜到了,新生代和老年代都在java堆,永久代在方法区

java堆对象的回收

        现在,我们来看看分代收集算法是如何针对堆内存进行回收的。

        新生代:采用复制算法,新生代对象一般存活率较低,因此可以不使用50%的内存作为空闲,一般的,使用两块10%的内存

作为空闲和活动区间,而另外80%的内存,则是用来给新建对象分配内存的。一旦发生GC,将10%的活动区间与另外80%中存

活的对象转移到10%的空闲区间,接下来,将之前90%的内存全部释放,以此类推,下面还是用一张图来说明:

        解释下,堆大小=新生代+老年代,新生代与老年代的比例为1:2,新生代细分为一块较大的Eden空间和两块较小的Survivor空间,分别被命名为from和to。

        老年代:老年代中使用“标记-清除”或者“标记-整理”算法进行垃圾回收,回收次数相对较少,每次回收时间比较长。

方法区对象回收

        永久代指的是虚拟机内存中的方法区,永久代垃圾回收比较少,效率也比较低,但也必须进行垃圾回收,否则永久代内存

不够用时仍然会抛出OutOfMemoryError异常。永久代也使用“标记-清除”或者“标记-整理”算法进行垃圾回收
--------------------- 
原文:https://blog.csdn.net/cool_summer_moon/article/details/80360600 

“分代收集”算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成收集。而老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记-清理”或“标记-整理”算法来进行回收。
--------------------- 
原文:https://blog.csdn.net/wuzhiwei549/article/details/80563134 

猜你喜欢

转载自blog.csdn.net/u010002184/article/details/89343627
今日推荐