ホームページ >Java >&#&チュートリアル >Javaと消えた記憶の謎!
魔法の国 Java Land には、JVM ボットという名前の小さなロボットが住んでいました。 JVM ボットには、メモリを追跡するという非常に重要な仕事がありました。問題は、Java Land での思い出は大きなクッキーの瓶のようなもので、誰もがその一部を欲しがっていたということです。したがって、JVM ボットは全員に十分な量があることを確認する必要がありました。
JVM ボットには 3 つの特別なインジケーター - すべてのメモリを監視するツールがありました:
totalMemory - このインジケーターは、JVM ボットがすでに保持している Cookie (またはメモリ) の数を示しました。このメソッドは、JVM によって割り当てられた現在のメモリ量を表示します。これは、現在の負荷を理解するのに役立ちます。基本的に、totalMemory は、私たちがすでにポケットに入れて使用できるメモリの「予算」です。
freeMemory - これは、瓶の中に (既に持っていたメモリ内に) クッキーが何枚残っているかを彼に教えてくれました。このメソッドは、totalMemory 内でまだ使用できるメモリの量を示します。たとえば、totalMemory が 500 MB で freeMemory が 200 MB の場合、これは 300 MB がすでに使用されていることを意味します。この方法は、現在空きメモリがどのくらいあるのか、いつ最適化を検討すべきかを理解するのに役立ちます。
maxMemory - これはすべての指標の中で最大の指標です。これは、JVM ボットが持つことができる Cookie の最大数を示しました。いっぱいになっている場合は、それ以上 Cookie を追加することはできません。たとえば、最大値を 1024 MB に設定している場合、これが上限であり、これに達すると、JVM は仮想 Cookie (メモリ) の使用を開始し、パフォーマンスが著しく低下します。
以下は、JVM ボットがこれらのインジケーターをどのように使用できるかを示すコード例です:
public class MemoryExample { public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); // Получаем текущую память long totalMemory = runtime.totalMemory(); // Общее количество памяти long freeMemory = runtime.freeMemory(); // Свободная память long maxMemory = runtime.maxMemory(); // Максимально доступная память System.out.println("Общая память: " + totalMemory + " байт"); System.out.println("Свободная память: " + freeMemory + " байт"); System.out.println("Максимальная память: " + maxMemory + " байт"); } }
JVM ボットは、自分自身を Cookie (メモリ) の保護者であると考えることを好んでおり、そのインジケーターを使用して、残された貴重な残骸を監視しています。
ある晴れた日、JVM ボットは自分自身の仕事に専念し、インジケーターを監視していましたが、突然... バン!機敏な小さなアルゴリズム グレムリンがたくさん登場しました!これらのグレムリンは JVM ボットと同じくらいクッキーが大好きで、お腹が空いていました!
彼らは JVM ボットのクッキーをむさぼり始め、あちこちに噛みつきました。グレムリンがクッキーを食べたとき、JVM ボットの freeMemory インジケーターが急速に低下し始めました!
「いやぁ!」 JVM ボットはロボットの頭をこすりながら叫びました。 「このグレムリンがクッキーを食べすぎると、ジャワランドの残りの部分に十分なクッキーが残らなくなるでしょう!」
JVM ボットには素晴らしいアイデアがあります。彼は記憶メーターを使って、グレムリンがクッキーを何枚食べるかを調べます。
JVM ボットはまず freeMemory を調べて、グレムリンが食べ始める前に残っている Cookie の数を確認しました。
long initialFreeMemory = runtime.freeMemory(); System.out.println("Свободная память перед едой гремлинов: " + initialFreeMemory + " байт");
それから彼は言いました、「わかった、グレムリン、何ができるかやってみよう!」そしてクッキーを噛みちぎりながら自由に走らせましょう。
グレムリンが食べた後、JVM ボットは再度 freeMemory をチェックしました。
long remainingFreeMemory = runtime.freeMemory(); System.out.println("Свободная память после еды гремлинов: " + remainingFreeMemory + " байт");
最後に、JVM ボットは欠落している Cookie の数を計算するために計算を行いました。それはグレムリンが飲み込んだ記憶だった!
long consumedMemory = initialFreeMemory - remainingFreeMemory; System.out.println("Съеденная память: " + consumedMemory + " байт");
スーパー メモリ インジケーター JVM ボット!
すべてを追跡するために、JVM ボットは自身にメモリ インジケーターを構築しました。それは色付きのセクションが付いたクッキーの瓶のように見えました:
すでに食べられたクッキーは緑色 (メモリ使用済み)。
青色は瓶の中にまだ安全に残っているクッキー (空きメモリ)。
グレーは焼くことのないクッキー (最大メモリ)。
このようにして、JVM ボットはすべてを監視し、さらにクッキーを焼く時期が来たことを知らせることができます!
大きな赤いボタン「GC」 - JVM ボットの秘密兵器!
そして最後に、JVM ボットには GC (もちろんガベージ コレクションの略です!) と書かれた大きな赤いボタンがありました。これは彼のクッキーを剥くための緊急用ツールでした。事態が手に負えなくなり、グレムリンがあちこちに残骸を残していくと、JVM ボットがそのボタンを押して、おっと! - すべてのパンくずが消え、JVM ボットにクリーンで新鮮なメモリが再び残ります。
ガベージ コレクターを呼び出すコード例:
public class MemoryExample { public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); // Получаем текущую память long totalMemory = runtime.totalMemory(); // Общее количество памяти long freeMemory = runtime.freeMemory(); // Свободная память long maxMemory = runtime.maxMemory(); // Максимально доступная память System.out.println("Общая память: " + totalMemory + " байт"); System.out.println("Свободная память: " + freeMemory + " байт"); System.out.println("Максимальная память: " + maxMemory + " байт"); } }
JVM ボットからのヒント: メモリ グレムリンを制御する方法!
メモリを安全に保つために、JVM ボットにはいくつかのトリックがあります:
余分なパン粉を避けるため、測定前に GC ボタンを押してください。測定前にゴミを取り除くと、より正確な結果が得られます。もちろん、これは必ずしも必要というわけではありませんが、測定の精度を高めるのに役立ちます。
あまり頻繁に測定しないでください。 JVM ボットは、本当に必要な場合にのみ測定します (ループでの測定は避けてください)。そうしないと、インジケーターが消耗する可能性があります。ランタイムを通じてメモリに頻繁にアクセスすると、わずかな遅延が発生する可能性があります。代わりに、アルゴリズムの開始時と終了時に単一の測定を実行します。
誰もが理解できるように、メガバイト (MB) などのわかりやすい単位を使用してください。
アルゴリズムなどのコードの特定の部分がどれだけのメモリを消費するかを測定するには、ちょっとしたトリックが必要です。
コードを実行する前に初期メモリを測定します。
アルゴリズムを実行します。
実行後にメモリを測定します。
測定値間の差異を見つけます。
以下のコード例は、これを行う方法を示しています。
public class MemoryExample { public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); // Получаем текущую память long totalMemory = runtime.totalMemory(); // Общее количество памяти long freeMemory = runtime.freeMemory(); // Свободная память long maxMemory = runtime.maxMemory(); // Максимально доступная память System.out.println("Общая память: " + totalMemory + " байт"); System.out.println("Свободная память: " + freeMemory + " байт"); System.out.println("Максимальная память: " + maxMemory + " байт"); } }
したがって、JVM ボットは Java Land のヒーローとなり、どれだけ多くのグレムリンがそれを食べようとしても、みんなのクッキー (またはメモリ) を守りました。覚えておいてください: JVM ボットとそのメモリ インジケーターを使用すると、Java Land の全員に十分な Cookie が常に存在します。 ?
以上がJavaと消えた記憶の謎!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。