2016-12-21 59 views
1

我運行於Java 8的服務器應用程序下面的標誌:爲什麼垃圾收集日誌Metaspace值與提供的標誌不同?

-XX:GCLogFileSize=2097152 -XX:InitialBootClassLoaderMetaspaceSize=33554432 -XX:InitialHeapSize=1610612736 -XX:MaxHeapSize=1610612736 -XX:MaxMetaspaceSize=1073741824 -XX:MetaspaceSize=536870912 -XX:NumberOfGCLogFiles=5 -XX:+PrintGC -XX:+PrintGCApplicationConcurrentTime -XX:+PrintGCApplicationStoppedTime -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintHeapAtGC -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseGCLogFileRotation -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC 

元空間起始值爲512M和最大值爲1GB。

在gc日誌中,我看到不同的元數據值比上面的標誌值。我的日誌樣品低於:

{Heap before GC invocations=1 (full 0): 
PSYoungGen  total 458752K, used 393216K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000) 
    eden space 393216K, 100% used [0x00000000e0000000,0x00000000f8000000,0x00000000f8000000) 
    from space 65536K, 0% used [0x00000000fc000000,0x00000000fc000000,0x0000000100000000) 
    to space 65536K, 0% used [0x00000000f8000000,0x00000000f8000000,0x00000000fc000000) 
ParOldGen  total 1048576K, used 0K [0x00000000a0000000, 0x00000000e0000000, 0x00000000e0000000) 
    object space 1048576K, 0% used [0x00000000a0000000,0x00000000a00003a0,0x00000000e0000000) 
Metaspace  used 26975K, capacity 54120K, committed 54400K, reserved 1114112K 
    class space used 3346K, capacity 4426K, committed 4480K, reserved 1048576K 
2016-12-21T16:41:10.569+0300: 1.423: [GC (GCLocker Initiated GC) [PSYoungGen: 393216K->29645K(458752K)] 393216K->29734K(1507328K), 0.0241803 secs] [Times: user=0.11 sys=0.00, real=0.02 secs] 
Heap after GC invocations=1 (full 0): 
PSYoungGen  total 458752K, used 29645K [0x00000000e0000000, 0x0000000100000000, 0x0000000100000000) 
    eden space 393216K, 0% used [0x00000000e0000000,0x00000000e0000000,0x00000000f8000000) 
    from space 65536K, 45% used [0x00000000f8000000,0x00000000f9cf3460,0x00000000fc000000) 
    to space 65536K, 0% used [0x00000000fc000000,0x00000000fc000000,0x0000000100000000) 
ParOldGen  total 1048576K, used 88K [0x00000000a0000000, 0x00000000e0000000, 0x00000000e0000000) 
    object space 1048576K, 0% used [0x00000000a0000000,0x00000000a00163b0,0x00000000e0000000) 
Metaspace  used 26975K, capacity 54120K, committed 54400K, reserved 1114112K 
    class space used 3346K, capacity 4426K, committed 4480K, reserved 1048576K 
} 

所以我的問題是,爲什麼我看不到512M的和1GB值在GC日誌元空間中。日誌值與標誌不直接相關嗎?

+1

我通常建議開發人員刪除他們不瞭解的所有選項。 JVM具有合​​理的默認值,假設知道比JVM更好的值是沒有意義的,甚至沒有理解該選項的實際含義。 – Holger

+0

問題是,如果我不設置元空間標誌,服務器會在啓動時出現很多完整的gc。我相信這是因爲metaspace變得完整了,因爲對於64位服務器來說,它的默認值是21mb。當我設置標誌時,完整的gc不會發生。我的問題解決了。但我仍然想了解日誌和標誌不一致。 –

+1

'-XX:MetaspaceSize'不指定初始大小,但是應該觸發gc的閾值。所以只要實際的元空間大小小於它,它就不會觸發gc。但是這個閾值並不是恆定的。在運行時期間,JVM可以根據實際使用情況選擇新值。但無論如何,爲什麼*啓動*時間*服務器*如此重要?調整長時間性能的參數不是更有意義嗎? – Holger

回答

0

「Advanced Garbage Collection Options」解釋:

-XX:MetaspaceSize = 大小

設置分配類的元數據空間的大小將觸發一個垃圾收集在第一時間,它是超標。垃圾收集的這個閾值根據使用的元數據量而增加或減少。默認大小取決於平臺。

換句話說,它不指定初始大小,但第一次GC門限,因此你的觀察,而實際元空間大小小於沒有一個完整的GC的行爲相匹配指定的大小。

一旦第一次超過閾值,JVM就可以根據實際使用情況選擇一個新的閾值。