Java

JVM内存划分原因

2020-09-11  本文已影响0人  Djbfifjd

JVM的垃圾回收机制

JVM内存模型

一、堆区为什么要分为新生代和老年代?

因为有的对象寿命长,有的对象寿命短。应该将寿命长的对象放在一个区,寿命短的对象放在一个区。不同的区采用不同的垃圾收集算法。寿命短的区清理频次高一点,寿命长的区清理频次低一点。提高效率。

1️⃣为什么要有Survivor区?

如果没有Survivor区,那么Eden每次满了清理垃圾,存活的对象被迁移到老年区,老年区满了,就会触发Full GC,Full GC是非常耗时的,解决办法:
①增加老年代内存,那么老年代清理频次减少,但清理一次花费时间更长。
②减少老年代内存,老年代一次Full GC时间更少,频率增加。

都不行,只有再加一层Survivor。将Eden区满了的对象,添加到Survivor区,等对象反复清理几遍之后都没清理掉,再放到老年区,这样老年区的压力就会小很多。即Survivor相当于一个筛子,筛掉生命周期短的,将生命周期长的放到老年代区,减少老年代被清理的次数。

2️⃣为什么要加两个Survivor?

避免产生内存碎片。为了不产生内存碎片,才用复制算法,将Eden区和Survivor区存活的对象整齐的放到一个空的内存。因为生命周期一般都比较短,所以在存活对象不多的情况下,复制算法效率还是比较高的: 复制算法:

这样就需要一个空内存,而如果有三个区,这样就总可以保持一个是空的,这样清理垃圾的时候,就可以将存活对象全部都整齐的放到一个空的内存中,不产生内存碎片了。

二、JVM内存为什么要分成新生代、老年代、持久代。新生代中为什么要分成Eden和Survivor?

1、Minor GC是发生在新生代中的垃圾收集,采用的复制算法。
2、新生代中每次使用的空间不超过90%,主要用来存放新生的对象。
3、Minor GC每次收集后Eden区和一块Survivor区都被清空。
4、老年代中使用Full GC,采用的标记-清除算法。

类需要同时满足下面3个条件才能算是“无用的类”:
1、该类所有的实例都已经被回收,也就是Java堆中不存在该类的任何实例。
2、加载该类的ClassLoader已经被回收。
3、该类对应的java.lang.Class 对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法。

上一篇 下一篇

猜你喜欢

热点阅读