3

単一の JFrame インスタンスを作成して表示するこの単純な Java コードがあります。このリンクには、jconsole によって取得されたメモリ消費グラフのスクリーンショットが含まれています

ここに画像の説明を入力

私が心配しているのは、タスク マネージャーの java.exe で、メモリ使用量が 8 ~ 9 秒ごとに 4 ~ 5 kbs の割合で継続的に増加していることです。助けが必要

import javax.swing.*;

class MyGUI extends JFrame
{
    public void makeGUI()
    {
        setLayout(null);
        setSize(500, 200);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
}

public class Launcher
{
    public static void main(String []args)
    {
        SwingUtilities.invokeLater(new Runnable()
                    {
                       public void run()
                       {
                        new MyGUI().makeGUI();
                       }
                    });
    }
}
4

3 に答える 3

7

プロファイルは完全に正常に見えます。プログラムはオブジェクトを作成し、ガベージ コレクターは時々、アクセスできなくなったオブジェクトを削除してメモリを解放します。

重要な観察は、谷点が多かれ少なかれすべて同じレベルにあるため、コードにメモリ管理の問題があるようには見えないことです。

ヒープスペースの最大量をより低いレベルに設定することでピークの高さを減らすことができますが、とにかく5 MBはあまりありません...

于 2012-10-03T14:56:35.283 に答える
4

この記憶は、さまざまなUIイベント(マウスの動きなど)など、swingで使用されるオブジェクトの生成によるものだと思います。Swingは、すべてのイベントに対してオブジェクトを生成し、それらのイベントを処理するリスナーを呼び出す傾向があります。その後、これらのイベント関連オブジェクトは使用されなくなります(それらを参照し続ける場合を除く)。

これはメモリリークではなく、通常の動作です。実際、メモリ消費のスクリーンショットでは、ガベージコレクタがこれらのオブジェクトを解放すると、メモリが急激に低下します。

于 2012-10-03T14:58:44.423 に答える
0

Java は必要に応じてメモリを使用する傾向があります。ガベージ コレクションをあまり頻繁に行わないため、単純なプログラムでも実行中にサイズが自然に増加します。ほとんど見ないマイナーなイベントのクラスを作成する必要があるためです。

System.gc()Java に強制的にガベージ コレクションを実行させ、手動でメモリ使用量を減らしたい場合は、いつでも呼び出すことができますが、非常に慎重に使用する必要があります。

于 2012-10-03T15:04:18.013 に答える