2017-08-05 85 views
1

我正在調試內存爲512M的Heroku dyno上的內存問題。經過大量的戳和刺激,我認爲我已經縮小到類空間沒有得到清理出於某種原因。下面是jcmd <pid> VM.native_memory summary輸出:Java - 高級保留空間內存不足

Java Heap (reserved=163840KB, committed=163840KB) 
    (mmap: reserved=163840KB, committed=163840KB) 


Class (reserved=1120210KB, committed=80466KB) 
    (classes #14208) 
    (malloc=2002KB #18418) 

    (mmap: reserved=1118208KB, committed=78464KB) 

Thread (reserved=26165KB, committed=26165KB) 
    (thread #45) 
    (stack: reserved=25776KB, committed=25776KB) 
    (malloc=144KB #222) 
    (arena=244KB #89) 

Code (reserved=256694KB, committed=42130KB) 
    (malloc=7094KB #10281) 
    (mmap: reserved=249600KB, committed=35036KB) 

GC (reserved=569KB, committed=569KB) 
    (malloc=29KB #279) 
    (mmap: reserved=540KB, committed=540KB) 

Compiler (reserved=217KB, committed=217KB) 
    (malloc=86KB #290) 
    (arena=131KB #3) 

Internal (reserved=3116KB, committed=3116KB) 
    (malloc=3084KB #16726) 
    (mmap: reserved=32KB, committed=32KB) 

Symbol (reserved=19560KB, committed=19560KB) 
    (malloc=15812KB #163798) 
    (arena=3748KB #1) 

Native Memory Tracking (reserved=3649KB, committed=3649KB) 
    (malloc=292KB #4629) 
    (tracking overhead=3357KB) 

Arena Chunk (reserved=198KB, committed=198KB) 
    (malloc=198KB) 

這裏是我的JAVA_OPTS

-Xmx160m 
-Xss512k 
-XX:MaxMetaspaceSize=128M 
-XX:NativeMemoryTracking=detail 
-XX:+UnlockDiagnosticVMOptions 
-XX:+UseSerialGC 

任何想法,爲什麼Class仍保留內存大於演出嗎?再次,我甚至不完全確定課堂空間是問題,所以任何幫助表示讚賞。

請注意,我正在使用一些Groovy代碼,這在類加載器領域可能相當嘈雜。

+0

看到這個問題https://stackoverflow.com/questions/31075761/java-8-reserves-minimum-1g-for-metaspace-despite-maxmetaspacesize我認爲你的問題是它的重複。 – Oleg

+0

@Oleg好的,但我沒有使用-XX:+ UseCompressedClassPointers或'-XX:+ UseCompressedOops',這會導致這個區域出現問題,根據https:/ /docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html#sthref66。我的問題是不同的,因爲'CompressedClassSpaceSize'不應該應用。 – Andy

+0

你能檢查'jcmd VM.flags'我認爲它們默認是開啓的。 – Oleg

回答

1

Java 8爲壓縮類指針保留1GB的內存。如果您希望它保留較少的內存,則可以使用CompressedClassSpaceSize jvm參數執行此操作。來自oracle的這個answer和這個guide的一些額外的細節。

請注意,從oracle指南看來,java看起來只有在UseCompressedOopsUseCompressedClassesPointers使用jvm參數時纔會保留1GB,但由於某些原因,他們決定不提及它們默認處於打開狀態。