在面试中通常会被问到,什么时候会进行Minor GC?什么时候FULL GC?
进行Minor GC
首先我们说说垃圾回收,jvm采用的垃圾回收规则采用的时 标记-复制法
一个Survivor以及两个Eden。
对象刚进来时会在S区,当S区满了后,无法创建对象时,会进行Minor GC,将存活的对象移动到一个Eden区。然后完成Minor Gc
进行Full Gc
继上,当MinorGc后,内存空出来后,对象进来后继续向S区以及E区创建对象。当对象满了后继续重复上述的操作。
然而,在每一次的MinorGc之前,会将对象的大小、年轻代剩余内存大小、老年代空余内存的大小进行对比
- 如果这个对象大于年轻代的空闲内存(即Survivor以及Eden)且小于老年代空闲,可以直接进行FullGc(因为极端情况下这批对象都存货的)
- 如果此对象大于老年代内存,则比较以往MinorGc后的平均存活对象大小:
1 .如果存活对象内存小于平均水平,且小于S区,直接进去S区。如果小于平均水平,且大于S区,直接进入老年代
2 .如果存活对象内存大于平均水平,之后判断,参数“-XX:-
HandlePromotionFailure”,是否设置,如果没设置直接进行Full Gc,如果设置了,则冒险进行MinorGc。MinorGc有几种情况: - 1 MinorGc后存货对象,小于S区。那么此时存活对象进入Survivor
区域即可。 - 2 Minor GC过后,剩余的存活对象的大小,是大于 Survivor区域的大小,但是是小于老年代可用内存大小的,此时就直接进入老年代即可。
- 3 大于老年代内存的,直接报内存溢出即可(即Handle Promotion Failure情况)。
如果要是Full GC过后,老年代还是没有足够的空间存放Minor GC过后的剩余存活对象,那么此时就会导致所谓的“OOM”内存溢出了
博客主要围绕Java面试中常问的Minor GC和Full GC触发时机展开。JVM采用标记 - 复制法进行垃圾回收,对象先进入S区,S区满时进行Minor GC。Full GC触发与对象大小、年轻代和老年代空闲内存等因素有关,若处理不当可能导致内存溢出。
1万+

被折叠的 条评论
为什么被折叠?



