serial old是一種垃圾回收器
serial old其實表示的是一種說法,老年代單線程回收。在不同的垃圾回收器中實現各部相同,現在有以下幾種實現g1MarkSweep,psMarkSweep,genMarkSweep。
parallel gc日志里的老年代名稱有時候會變
其實是老年代回收器不一樣。
老年代回收器為psMarkSweep的是叫PSOldGen。
老年代回收器為psParallelCompact的是叫ParOldGen。
每個版本的jvm默認垃圾回收算法不一樣,如果默認是-XX:+UseParallelOldGC,你自己雖然設置了-XX:+UseParallelGC。但是也會有是加了-XX:+UseParallelOldGC的效果。
full gc其實是minor gc,然后執行old gc。
其實full gc就是fullgc。是區別于minor gc,old gc。
full gc的算法其實很多
準確來說真的只有一種。標記-清除-壓縮。實現是有多種的。
cms的backgroud gc的時候只回收老年代。
這個也是有參數控制的。CMSScavengeBeforeRemark,默認是關閉的。
survivor 某個年齡對象達到survivor 區域的50%就發生晉升。
50%其實是一個參數控制的,TargetSurvivorRatio。默認50。
并不是某個年齡的對象大小達到。找出從1開始,累加和超過TargetSurvivorRatio的比值的那個年齡。從那個年齡開始以上的對象有資格晉升。需要和MaxTenuringThreshold對比找到小的那個年齡。
對象優先生成在eden
其實先的應該是棧上分配,其次是tlab(eden的一部分),然后嘗試大對象直接嘗試老年代的邏輯,如果不滿足,則在eden上分配。
直接內存和元數據區有關系
元數據區(1.6帶)概念上是非堆。直接內存是另外的區域,nio申請的就是這里的,有參數控制大小-XX:MaxDirectMemorySize,默認和堆的內存一樣大,并且和jni用的內存概念上也不是一回事。
parallel gc的時候就是先執行一次minor gc,然后再old gc
這是有個參數ScavengeBeforeFullGC老控制的。默認是打開的,日志內容輸出如下
[GC (System.gc()) [PSYoungGen: 1843K->776K(35840K)] 1843K->784K(117760K), 0.0022147 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
[Full GC (System.gc()) [PSYoungGen: 776K->0K(35840K)] [ParOldGen: 8K->637K(81920K)] 784K->637K(117760K), [Metaspace: 2658K->2658K(1056768K)], 0.0091183 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
當關閉掉的時候日志如下
[Full GC (System.gc()) [PSYoungGen: 1843K->0K(35840K)] [ParOldGen: 0K->637K(81920K)] 1843K->637K(117760K), [Metaspace: 2658K->2658K(1056768K)], 0.0101733 secs] [Times: user=0.03 sys=0.01, real=0.01 secs]
區別就是少了那次minor gc。而且后面都是fullgc。并不是old gc。
想要了解更多的java應用技術那家加入我們吧!