2

Java ゲーム アプリケーションでメモリ リークが発生しました。リークは、ボタンを押すたびに次の新しいインスタンスが作成されるため、このボタン アクション リスナーで複数回作成される新しいインスタンスから発生しますRegularMode

btnRegular.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        frame.remove(pane);
        gm = Gamemode.REGULAR;

        mode = new RegularMode(frame, WIDTH, HEIGHT);
    }
});

面白いことに、次のコードを使用してメモリ リークを修正しようとしています。

public static void initDisplay() {
    gm = Gamemode.NONE;
    mode.setRunning(false);
    frame.remove(mode.getPane());
    frame.add(pane);
    frame.validate();
    frame.repaint();
    mode = null; // THIS LINE
    frame.pack();
}

–しかし、それは機能しません。このタイプのメモリリークを解決する他の方法はありますか?

4

2 に答える 2

5

あなたが提供したコードがメモリリークを引き起こしているとどのように結論付けたのかわかりません。プロファイラーを使用して、現在ヒープにあり、蓄積されているオブジェクトを確認します。プロファイラーを検索するか、これを確認できます: http://jyops.blogspot.se/2012/09/java-memory-model-simplified.html

于 2013-11-02T22:09:53.577 に答える
0

System.gc()に設定modeした後にへの呼び出しを追加してみてくださいnull

また、デフォルトとは異なるガベージ コレクタを使用することもできます。これを行うには、アプリの実行時に-XX:[Garbage collector](例: -XX:ConcMarkSweep) を渡します。Eclipse を使用している場合は、プロジェクト構成 (JVM に渡す引数) でこれを設定する必要があります。利用可能なコレクターのリストはこちらにあります。

また、jvm が使用できるメモリ量の上限を増やすこともできます。デフォルトは 256mb などです。これを行うには、-Xmx 1024M (またはそのようなもの) を渡す必要があります。

お役に立てれば。

于 2013-11-02T22:10:56.583 に答える