谷本 心 in せろ部屋

はてなダイアリーから引っ越してきました

Day-2 : Where Does All the Native Memory Go?

ネイティブメモリに関するセッション。
最近、ネイティブメモリのリークを経験したばかりなので、
元々の予定を変更して、このセッションに参加しました。


で、内容なんですが、深く突っ込むというよりは
浅く、全体を押さえるという感じでしたね。
簡単に内容のダイジェストをメモしておきます。


まずJavaプロセスが確保するメモリ全体(= Virtual Memory)は
「User Memory」と「Kernel Memory」に大別できる。


大半の32bitOSは、Userが3GB、Kernelが1GBまで確保できる。
64bitOSになると、理論上は16EBだけど、現在は数百GB〜数TB程度までらしい。


また、
Javaが使うメモリは「アプリが使う」か「JRE自体が使う」かに大別できる。


アプリだけが使うのは、Heap、Threads、NIOのDirectByteBufferなど。
(逆に言えば、ThreadsやDirectByteBufferは直接Non-Heapを使うから要注意ですね)


アプリもJREも使うのが、クラスローディングやJNIなど。
(この辺りもよくメモリリークで話題になりますね)


JREだけが使うのが、JVM自身のメモリと、JITコンパイル時。
(この辺りのメモリリークに遭遇すると、相当苦しみますね)


さて、メモリが不足してしまうとどうなるのか。
エラーの出方、止まり方によって、症状を分類することができる。


アドレスできる領域がなくなると、OutOfMemoryErrorが発生する。
物理メモリが不足すると、VMM Page Outが発生する。
仮想メモリが不足すると、OOM Killer(Linux)や、Allocation Fail(Windows)が発生する。


メモリを解析するためのツールとして
Gabage Collection Memory Viewewや
Solarisでのpmap(説明されなかったけど、Linuxではmaps / smaps)
Windows向けのVMMap Toolというものがある。


、、、という感じで、ざざっと全体的なお話でした。
自社ではトラブルシュートグループに所属する身としては、
この中の一つでも知らなかったら大目玉・・・というレベルですね (^^;


先日、大目玉を食らったのは、内緒です :p