Java 8 メタスペースのメモリ管理に苦労しています。現在、RHEL で jdk 1.8_60 を使用しています。
これは私のTomcatクラスパスです:
/opt/java/jdk1.8.0_60/bin/java
-Djava.util.logging.config.file=/opt/apache/tomcat/apache-tomcat/conf/logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Xms1g
-Xmx16g
-XX:MetaspaceSize=128m
-XX:MaxMetaspaceSize=256m
-XX:+UnlockDiagnosticVMOptions
-XX:NativeMemoryTracking=summary
-Dorg.apache.cxf.stax.allowInsecureParser=1
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/opt/apache/tomcat/apache-tomcat/temp/heap.dump
-Xloggc:/opt/apache/tomcat/apache-tomcat/logs/gc.log
-XX:+PrintGC
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+UseGCLogFileRotation
-XX:GCLogFileSize=5m
-XX:NumberOfGCLogFiles=20
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=9999
-Dcom.sun.management.jmxremote.rmi.port=9998
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=localhost
-Djava.endorsed.dirs=/opt/apache/tomcat/apache-tomcat/endorsed
-classpath /opt/apache/tomcat/apache-tomcat/bin/bootstrap.jar:/opt/apache/tomcat/apache-tomcat/bin/tomcat-juli.jar
-Dcatalina.base=/opt/apache/tomcat/apache-tomcat
-Dcatalina.home=/opt/apache/tomcat/apache-tomcat
-Djava.io.tmpdir=/opt/apache/tomcat/apache-tomcat/temp
org.apache.catalina.startup.Bootstrap start
を実行するjcmd <PID> VM.native_memory summary.diff
と、クラス用に予約されたメモリ (メタスペース サイズと思われるもの) が 256m を超えていることが示されます (デフォルトの 1g のように見えます)。
- Java Heap (reserved=16777216KB, committed=5485568KB)
(mmap: reserved=16777216KB, committed=5485568KB)
- Class (reserved=1149430KB, committed=112886KB)
(classes #16384 +1)
(malloc=6646KB #23800)
(mmap: reserved=1142784KB, committed=106240KB)
- Thread (reserved=32005KB -2065KB, committed=32005KB -2065KB)
(thread #32 -2)
(stack: reserved=31868KB -2056KB, committed=31868KB -2056KB)
(malloc=101KB -7KB #161 -10)
(arena=36KB -2 #62 -4)
動的 WS 呼び出しにcxf動的クライアントを使用しているため、呼び出しごとに大量のクラスが生成されますが、このクラスがメタスペースから削除されることはないようです (ボタンをクリックしても、jvisualvm 内で gc を実行します)。最後にメタスペースがいっぱいになり、アプリケーションはOutOfMemoryException: Metaspaceで終了します
この構成でGC1も使用しまし-XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:+ParallelRefProcEnabled -XX:+AggressiveOpts
たが、役に立ちませんでした。
jvm にバグがあり、メタスペースのメモリ割り当てが誤って構成されている可能性はありますか (または、メタスペースを管理するためにこの値を使用します)。誰かがメタスペースのクリーンアップの問題を解決する方法を教えてもらえますか?
どうもありがとう