一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题
Scavenge GC(Minor GC): 一般情况下,当新对象生成(age=0),并且在Eden申请空间失败时,就会触发Scavenge GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区(age+1)。然后整理(其实是复制过去就顺便整理了)Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。因而,,一般在这里需要使用速度快、效率高的算法(即复制-清理算法),使Eden去能尽快空闲出来。Java 中的大部分对象通常不需长久存活,具有朝生夕灭的性质。 Full GC:对整个堆进行整理,包括Young、Tenured和Perm。Full GC因为需要对整个对进行回收,所以比Scavenge GC要慢,因此应该尽可能减少Full GC的次数。在对JVM调优的过程中,很大一部分工作就是对于FullGC的调节。 3.1 触发Full GC执行的场景 3.2 Young GC触发条件 3.3 新生对象GC收回流程 基于大多数新生对象都会在GC中被收回的假设。新生代的GC 使用复制算法,(将年轻代分为3部分,主要是为了生命周期短的对象尽量留在年轻代。老年代主要存放生命周期比较长的对象,比如缓存)。可能经历过程: 对象创建时,一般在Eden区完成内存分配(有特殊); 当Eden区满了,再创建对象,会因为申请不到空间,触发minorGC,进行young(eden+1survivor)区的垃圾回收; minorGC时,Eden和survivor A不能被GC回收且年龄没有达到阈值(tenuring threshold)的对象,会被放入survivor B,始终保证一个survivor是空的; 当做第3步的时候,如果发现survivor满了,将这些对象copy到old区(分配担保机制);或者survivor并没有满,但是有些对象已经足够Old,也被放入Old区 XX:MaxTenuringThreshold;(回顾下对象进入老年代的情况) 直接清空eden和survivor A; 当Old区被放满的之后,进行fullGC。 3.4 GC日志 GC日志相关参数: -XX:+PrintGC:输出GC日志 -XX:+PrintGCDetails:输出GC的详细日志 -XX:+PrintGCTimeStamps:输出GC的时间戳(以基准时间的形式) -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间 -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间 -XX:+PrintHeapAtGC:在进行GC的前后打印出堆的信息 -XX:+PrintTLAB:查看TLAB空间的使用情况 -XX:PrintTenuingDistribution:查看每次minor GC后新的存活周期的阈值 -XX:PrintReferenceFC:用来跟踪系统内的(softReference)软引用,(weadReference)弱引用,(phantomReference)虚引用,显示引用过程 案例分析: -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCApplicationConcurrentTime一起使用 (编辑:宣城站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |