現在、Javaのネイティブメモリリークに問題があります。サーバーはかなり大きいです(40cpus、128GBのメモリ)。 Javaのヒープ・サイズは64Gです。大量のデータを約400スレッドの文字列に読み込み、数分後にメモリから捨てる、非常にメモリ集約的なアプリケーションを実行します。G1と大容量メモリでのJavaネイティブメモリリーク
したがって、ヒープは非常に速くいっぱいですが、ヒープ上のものは古くなり、非常に高速にGCすることができます。そこで、G1を使用して数分間STW休憩を持たないようにする必要があります。
これはうまくいくようです - ヒープはアプリケーションを数日間実行するのに十分な大きさですが、ここでは何も漏れません。とにかく、Javaプロセスは、すべての128Gが使用され、アプリケーションが割り振りに失敗してクラッシュするまで、時間とともに成長し、成長しています。
私は、最大でglibcの問題を含むネイティブのJavaメモリリークについてたくさん読んだことがあります。アリーナ(glibc 2.13で喘ぎがあるので、dist upgradeなしでMALLOC_ARENA_MAX = 1または4に設定すると修正できません)。
だから私たちは私たちを与えたものjemallocしようとしたためグラフ:INUSE空間
私はここで何が問題になるのではない、誰かがアイデアを持っていますか?
私たちのアプリを実行しているtomcatプロセスの環境パラメータとしてjemallocに "MELOC_CONF =" narenas:1 "を設定しても、それでも何とかglibcのmallocバージョンを使用できますか?
これは私たちのG1セットアップです、多分ここでいくつかの問題?
-XX:+UseCompressedOops
-XX:+UseNUMA
-XX:NewSize=6000m
-XX:MaxNewSize=6000m
-XX:NewRatio=3
-XX:SurvivorRatio=1
-XX:InitiatingHeapOccupancyPercent=55
-XX:MaxGCPauseMillis=1000
-XX:PermSize=64m
-XX:MaxPermSize=128m
-XX:+PrintCommandLineFlags
-XX:+PrintFlagsFinal
-XX:+PrintGC
-XX:+PrintGCApplicationStoppedTime
-XX:+PrintGCDateStamps
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintTenuringDistribution
-XX:-UseAdaptiveSizePolicy
-XX:+UseG1GC
-XX:MaxDirectMemorySize=2g
-Xms65536m
-Xmx65536m
ありがとうございました!
メモリ・オプティックでそれを見ることで、この問題を分析することは本当に難しいだろう。メモリ割り当て、GCスループット、CPU使用率をよりよく理解するために、Dynatraceなどのツールを使用してプロセスを監視するアドバイスがあります。 – Armaiti
私は今日、重い負荷と頻繁なSystem.gc()の使用でのみ発生したG1ネイティブメモリリークを分離しました。私はOS XでXCodeを使って、ネイティブヒープのデータが何百万と何百万という32バイトのmallocであることを最初に確認しました。そして、dtraceを使って32バイトのmallocの大半がG1に由来すると判断しました。 –