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

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

对象分类

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

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

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

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

内存区域

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

java堆对象的回收

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

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

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

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


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

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

方法区对象回收

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

不够用时仍然会抛出OutOfMemoryError异常。永久代也使用“标记-清除”或者“标记-整理”算法进行垃圾回收。

结束语

        GC算法基本就是这些了,下一篇我们将一起讨论下有哪些GC算法的实现。


猜你喜欢

转载自blog.csdn.net/cool_summer_moon/article/details/80360600