2009-03-26 21 views
5

Websphere6.1、Solaris 10、JDK 1.5.0_13上のJava Webアプリケーションです。最大ヒープサイズは1024mに設定しました。 jmapは、ヒープ状態が正常であることを示します。ヒープメモリの使用量はわずか57%です。 OutOfMemoryはまったくありません。-Xmx1024mを使用したJavaプロセスは、3GB常駐メモリをどのように占有できますか?

しかし、このJavaプロセスではpsから非常に高いRSS(3GB)が見つかりました。 pmapは1.9Gのプライベートメモリのブロックを示します。

 
3785: /dmwdkpmmkg/was/610/java/bin/java -server -Dwas.status.socket=65370 -X 
Address Kbytes  RSS Anon Locked Pgsz Mode Mapped File 
... 
0020A000 2008 2008 2008  - 8K rwx-- [ heap ] 
00400000 1957888 1957888 1957888  - 4M rwx-- [ heap ] 
8D076000  40  40  40  - 8K rw--R [ stack tid=10786 ] 
... 

ネイティブコードではCヒープメモリリークですか?根本的な原因を見つけるにはどのようなアプローチが推奨されていますか?

答えて

4

このTroubleshooting Memory Leaks文書は、あなたの高いRSS、特に3.4項の問題を発見するのに役立つかもしれません。

Websphereを実行しているときに、おそらく-memorycheckをVM上で使用できます。詳細はhereを参照してください。

ネイティブコードでは必ずしもリークではありません。 hereと表示された場合、Solarisではファイルを開いたままにしておくと問題が発生する可能性があります。

これは単なるリンクとヒントですが、問題を追跡するのに役立つかもしれません。

+0

これらは参考になります。 -memorycheckはIBM JDKでのみ使用可能なようですが? SolarisにはIBM JDKはなく、SUN JDKだけです。 – gengmao

+0

わかりませんが、私はSolarisでの経験はありませんが、おそらくそうではありません...おそらく、IBM JDKはWebsphereと一緒にIBMから来ているようです。それが私の考えです。 – MicSim

1

JNIライブラリを使用していますか?私はネイティブコードがどのようにRAMを割り当てているのか分かりませんが、それは私が探し始めるところです。

2

ヒープサイズはJavaヒープサイズのままですが、プロセスの一部であるVMや他のライブラリがあります。

1024mのヒープサイズと "for(;;)"でHello Worldを実行し、それがどれくらいかかっているかを確認してください。それはあなたに全体的なメモリ使用量のベースラインを与えるはずです。

3

これは、ネイティブのメモリリークがない場合(非圧縮のZIPリソースなど)にも発生する可能性があります。

同じ問題が発生しました。これはglibcの既知の問題は、> = 2.10

治療法がMALLOC_ARENA_MAXをGoogle MALLOC_ARENA_MAX https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

を設定するか、見つけることがSO上でそれを検索については、このENV変数 export MALLOC_ARENA_MAX=4

IBMの記事を設定することです多くの参照。

あなたは、割り当てられたメモリの低断片化のために最適化することも同調するように他のmallocオプションをお勧めします:

# tune glibc memory allocation, optimize for low fragmentation 
# limit the number of arenas 
# requires glibc >= 2.16 since there was a bug in 
# MALLOC_ARENA_TEST parameter handling that cause MALLOC_ARENA_MAX not to work 
export MALLOC_ARENA_MAX=2 
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt" 
export MALLOC_MMAP_THRESHOLD_=131072 
export MALLOC_TRIM_THRESHOLD_=131072 
export MALLOC_TOP_PAD_=131072 
export MALLOC_MMAP_MAX_=65536 

あなたは、メモリの割り当てに関する情報を取得するためにネイティブmalloc_info関数を呼び出すことができます。 using JNA to call the native malloc_info methodの例を示します。

+0

ありがとうラリー!あなたの答えは非常に説得力があります。しかし、私はもうアプリケーションとsolaris envを持っていないので、元の質問は6年前に発生しました:)しかし、とにかく私に知らせてくれてありがとう。質問はしばらくの間不思議でした。 – gengmao

関連する問題