什么是垃圾回收算法
1.垃圾回收算法,是JVM在执行回收垃圾的时候,根据不同的算法,来使用不同的方式来回收
常见的回收算法
1.复制算法
复制算法是在新生代开辟两块内存,在要回收的垃圾上,标记一下,发生GC的时候将垃圾清除了,然后由于不同的垃圾在不同的地方,导致内存排序的不规则和不放开插入新的内存对象,所以我们会拷贝对象到另一面内存里面去,去整理对象,这样就会消耗一面内存,
缺点:就是会闲置一面内存
2.标记清除算法(老年代垃圾回收算法)
标记清除算法,就是将需要,该回收的对象打一个标记,在进行GC的时候JVM查看改对象是否被引用和该对象是否可达,如果都不行那么,该对象会被回收掉
缺点:该算法的缺点是,会造成内存碎片
3.标记整理算法(老年代垃圾回收算法)
标记清除算法,就是将需要,该回收的对象打一个标记,在进行GC的时候JVM查看改对象是否被引用和该对象是否可达,如果都不行那么,该对象会被回收掉
缺点:解决了标记清除算法的 内存碎片问题
Eden和Survivor区的作用
Eden和两个Survivor默认比例是 8:1:1,这样的话,如果年轻代分配了1G内存,那么只会浪费100M的内存,内存的创建会在Eden里面,如果满了,那么会发生GC,Eden会把对象和Survivor的对象放置到另一个Survivor里面去,这样就只会限制一个Survivor了
4.触发YongGC的条件
1.新生代的Eden满了,会发生YongGC然后将Eden里面的垃圾回收,然后剩下的转移到Survivor里面,
5.触发YongGC会去检查老年代大小,涉及哪几个条件和步骤
1.在触发YongGC前期会去检查老年代大小,如果老年代大小,小于新生代所有对象大小,即YongGC后所有对象都是存活的,而且Survivor也放不下,也可以转移到老年代,但是老年代的空间太小放不下,就回去判断HandlePromotionFailture这个参数是否设置
1.如果设置了,就继续往下判断,老年代当前剩余内存大小是否大于,平均每次进入老年代的内存大小
2.如果没有设置,那么执行Full GC,但是Full GC通常是年轻代GC时间的十倍,有程序暂停的风险
3.如果设置了,就指向YongGC,但是有三种情况
3.1 发生GC后剩余对象大小,小于survivor内存大小,然后符合条件的对象直接进入老年代
3.2 发生GC后剩余对象大小,小于老年代的剩余内存,进入老年代的对象,那么直接进入老年代
3.3 如果发生GC后剩余内存大小,大于survivor内存大小,也大于老年代内存大小,那么直接执行fullGC
6.那些条件下YongGC对象会直接进入老年代
1.对象足够大,超过我们配置的大小
2.超过默认年龄15岁
3.survivor区域不能存放这一次YongGC的年轻代对象了