0

私が作成したすべての Swing アプリケーションが、新しいオブジェクトを継続的に割り当てているように見えることに気付きました。

この小さなアプリケーションを考えてみましょう:

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings({ "javadoc", "serial" })
public class SwingTest extends JFrame {
    public static void main(String[] args) {
        new SwingTest().setVisible(true);
    }
    public SwingTest() {
        setTitle("SwingTest");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        panel.setPreferredSize(new Dimension(400, 400));
        setContentPane(panel);
        pack();
    }
}

多くのメモリを消費するとは思いませんが、VisualVM のヒープ グラフを見ると、メモリ使用量が絶えず増加してからリセットされていることがわかります。これは何が原因ですか?

4

2 に答える 2

2

私のマシンでコードをプロファイリングした結果は次のとおりです(Netbeansプロファイラーを使用して、Linux 3.1.1でOpenJDK 1.6.0_22 64ビット)

フラットなプロファイリング結果

それらの割り当てられたオブジェクトが何であるかを調べることをお勧めします。これを行うには、メモリ スナップショットを作成して比較します。

Netbeans プロファイラーは、VisualVM と同じコードベースであることに注意してください。

于 2012-11-15T13:44:03.860 に答える
1

Java が新しいオブジェクトを割り当てないようにして、ガベージ コレクションのコストを削減することは、Java が最初に構築された主な原則の 1 つに反します。いいえ、Swing が新しいオブジェクトを作成するのを防ぐ方法はありません。重要なオブジェクトがなければ、Swing はどのように機能しますか? オブジェクトを使用しない特別な操作モードはありません。

ガベージ コレクションのパフォーマンスが非常に重要である場合、Java は使用すべきテクノロジではありません。アプリケーションがタイム クリティカルな場合は、メモリ管理パフォーマンスなどを制御できる C またはその他の低レベル言語で記述します。

于 2012-11-15T12:51:18.597 に答える