第8章. ネイティブ・メモリーのベストプラクティス
この作品はAIを使って翻訳されている。ご意見、ご感想をお待ちしている:translation-feedback@oreilly.com
ヒープはJavaアプリケーションにおけるメモリの最大のコンシューマであるが、JVMは大量のネイティブ・メモリを割り当てて使用する。そして第7章では、プログラム的な観点からヒープを効率的に管理する方法について説明したが、ヒープの構成と、それがオペレーティング・システムのネイティブ・メモリとどのように相互作用するかは、アプリケーションの全体的なパフォーマンスにおけるもう1つの重要な要素である。Cプログラマはネイティブ・メモリーの一部をCヒープと呼ぶ傾向があるため、ここで用語の衝突がある。 Java中心の世界観に合わせて、Javaヒープを指すにはヒープを使い、Cヒープを含むJVMの非ヒープ・メモリーを指すにはネイティブ・メモリーを使い続けることにする。
この章では、ネイティブ(or演算子)メモリーのこうした側面について議論する。まずJVMのメモリー使用全体の議論から始め、パフォーマンス上の問題がないか、その使用量をモニターする方法を理解することを目的とする。それから、最適なメモリー使用のためにJVMとオペレーティング・システムをチューニングする様々な方法について議論する。
フットプリント
ヒープは(通常)JVMが使用するメモリの最大量を占めるが、JVMは内部演算子にもメモリを使用する。 このヒープ以外のメモリがネイティブ・メモリである。ネイティブ・メモリーは、アプリケーションで(JNI呼び出しによって)確保することもできる。malloc()
や同様のメソッドを呼び出したり、NIO(New I/O)を使用したりすることで)。JVMが使用するネイティブ・メモリーとヒープ・メモリーの合計が、アプリケーションのフットプリント合計となる。
演算子から見れば、このフットプリント合計が性能の鍵を握っている。アプリケーションのフットプリントの合計を含むのに十分な物理メモリが利用できない場合、パフォーマンスが低下する可能性がある。ここでの演算子は "かもしれない "である。ネイティブ・メモリの一部は起動時にのみ使用され(インスタンスンスンス、クラスパスにあるJARファイルのロードに関連するメモリ)、そのメモリがスワップアウトされても、必ずしも気づかれることはない。あるJavaプロセスが使用するネイティブ・メモリの一部は、システム上の他のJavaプロセスと共有され、より小さな一部は、システム上の他の種類のプロセスと共有される。 しかし、ほとんどの場合、最適なパフォーマンスを得るためには、すべてのJavaプロセスのフットプリントの合計が、マシンの物理メモリを超えないようにしたい(さらに、他のアプリケーションのために利用可能なメモリを残しておきたい)。
フットプリントの測定
プロセスの合計フットプリントを測定するには、オペレーティングシステム固有のツールを使う必要がある。Unixベースのシステムでは、top やps のようなプログラミングが、基本的なレベルでそのデータを表示してくれる。Windowsではperfmon
またはVMMapどのツールやプラットフォームを使うにせよ、プロセスの実際の割り当てメモリー(予約メモリーとは異なる)を見る必要がある。
割り当て済みメモリーと予約済みメモリーの区別は、JVM(とすべてのプログラミング)がメモリーを管理する方法の結果として生じる。 パラメーターで指定されるヒープを考えてみよう。 ...
Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access