8章ネイティブメモリのベストプラクティス

Javaアプリケーションが利用するメモリの中で、最も消費量が多いのはヒープです。しかし、JVMはネイティブメモリについてもかなりの量の割り当てと利用を行っています。7章では、プログラムの側から見た場合のヒープに対する効率的な管理について議論しました。一方、ヒープを適切に設定しオペレーティングシステム上のネイティブメモリとの間のインタラクションを管理するというのも、アプリケーションのパフォーマンスに大きな影響を与えます。

この章では、ネイティブメモリ(あるいはオペレーティングシステム上のメモリ)について上記のような側面を明らかにします。まずはJVMによるメモリの使用の全体像を示し、使用状況を監視してパフォーマンス上の問題点を探せるようにします。続いて、JVMとオペレーティングシステムのチューニングを通じてメモリの最適な使用を図ります。

8.1 合計メモリ使用量

ヒープは通常、JVMが使用するメモリの中で最も多くの部分を占めています。一方、JVMが内部処理のために使用しているメモリもあり、これがネイティブメモリと呼ばれます。JNIのmalloc()などのメソッドや、NIOではアプリケーションがネイティブメモリの割り当てを行うこともできます。ネイティブメモリとヒープの使用量を足したものが、アプリケーションの合計メモリ使用量(フットプリントとも呼ばれます)になります。

オペレーティングシステムの観点からは、この合計メモリ使用量がパフォーマンスにとって大きな意味を持ちます。物理メモリの空き容量が合計メモリ使用量に満たない場合、パフォーマンスが低下する可能性があります。必ずパフォーマンスが低下するというわけではなく、ネイティブメモリの中には起動時にしか使われないものもあります(クラスパスに含まれるJARファイルを読み込む際に割り当てられるメモリなど)。このようなメモリについては、スワップされても気にする必要はありません。また、ネイティブメモリの一部はシステム上の他のJavaプロセスと共有されます。Java以外のプロセスと共有されるネイティブメモリも少しですがあります。しかし多くの場合、よりよいパフォーマンスのためには合計メモリ使用量(と他のアプリケーションのための余裕)がマシン上の物理メモリの容量を超えないようにするべきです。 ...

Get Javaパフォーマンス now with O’Reilly online learning.

O’Reilly members experience live online training, plus books, videos, and digital content from 200+ publishers.