package com.jvm.jvmdemo.test;
/**
* @author :miaoqs
* @date :2019-10-30 09:58
* @description:
*/
public class GCCMSLogsTest {
/**
* 1M容量
*/
private static int size = 1024 * 1024;
public static void main(String[] args) {
byte[] a1, a2, a3, a4;
a1 = new byte[4 * size];
a1 = new byte[4 * size]; // 之前的 a1 = 4M 變成垃圾
a2 = new byte[4 * size];
// GC
a3 = new byte[4 * size];
a4 = new byte[8 * size];
a4 = null; // a4變成垃圾
// FULL GC
System.gc();
}
/**
* TODO 垃圾回收日誌
*
* VM options JVM 參數設置
* -Xms40M -Xmx40M -Xmn20M -XX:+PrintGCDetails -XX:+PrintGCDateStamps
* -XX:+UseConcMarkSweepGC
*
* TODO 在 Java 內存管理基礎一文中,已經知道 CMS 並非完全併發執行,僅第二個和第四個階段是併發執行的。
* 當使用 CMS 垃圾收集 器時,年輕代將採用並行,stop-the-world,
* 標記-複製的收集算法,老年代則採用併發-標記-清理(Concurrent Mark-Sweep)的收集算法,
* 該算法有利於降低應用暫定時間,可通過-XX:+UseConcMarkSweepGC 開啓。
*
* 2019-10-31T18:11:28.927-0800: [GC (Allocation Failure) 2019-10-31T18:11:28.927-0800:
* [ParNew: 15628K->777K(18432K), 0.0053739 secs] 15628K->8971K(38912K), 0.0054231 secs] [Times: user=0.01 sys=0.00, real=0.01 secs]
* TODO
* 15628K->777K(18432K) 新生代由 12M 變爲0M
* 15628K->8971K(38912K)堆內存由 12M 變爲8M,主要是a1 + a2 =8M 在老年代
* 2019-10-31T18:11:28.935-0800: [Full GC (System.gc()) 2019-10-31T18:11:28.935-0800:
* [CMS: 8194K->12861K(20480K), 0.0055566 secs] 21741K->12861K(38912K),
* TODO
* 8194K->12861K(20480K) 年老代由 8M變化爲12M
* 21741K->12861K(38912K)堆內存由 20M 變爲 12M
* [Metaspace: 3354K->3354K(1056768K)], 0.0056020 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]
*
* 2019-10-31T18:11:28.940-0800: [GC (CMS Initial Mark) [1 CMS-initial-mark: 12861K(20480K)] 12969K(38912K), 0.0001295 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]
* 2019-10-31T18:11:28.940-0800: [CMS-concurrent-mark-start]
*
* TODO GC 後的日誌
* Heap
* TODO GC後的年輕代 新生代被清空
* par new generation total 18432K, used 600K [0x00000007bd800000, 0x00000007bec00000, 0x00000007bec00000)
* eden space 16384K, 3% used [0x00000007bd800000, 0x00000007bd896238, 0x00000007be800000)
* from space 2048K, 0% used [0x00000007bea00000, 0x00000007bea00000, 0x00000007bec00000)
* to space 2048K, 0% used [0x00000007be800000, 0x00000007be800000, 0x00000007bea00000)
* TODO GC後的年老代 使用了 12M
* concurrent mark-sweep generation total 20480K, used 12861K [0x00000007bec00000, 0x00000007c0000000, 0x00000007c0000000)
* TODO GC後的元空間
* Metaspace used 3369K, capacity 4496K, committed 4864K, reserved 1056768K
* class space used 371K, capacity 388K, committed 512K, reserved 1048576K
*/
}