2

私は現在、約 20 ミリ秒ごとに非常に高速に実行する必要があるアプリケーションを開発しています (そうです、そもそも Java を使用するべきではありませんでした)。コードを最適化するために多くの作業を行ったので、計算が貪欲になりすぎないようにしました。ただし、これまで見てきたように、GUI とメモリの最適化に十分な努力を払っていない可能性があります。アプリケーションは必要な速度で実行できますが、1 ~ 2 分後に大幅に速度が低下し、メモリの問題が示唆されます。

NetBeans でプロファイラーを実行したところ、メモリのほとんどがjavax.swing.text.GapContent$MarkData

Googleで検索したところ、その問題を解決するのに役立つ理解できるものはほとんどありませんでした。それで、私を助けることができる人はいますか?私の最初の推測では、ガベージ コレクターが未使用のオブジェクトを消去するのに十分な時間実行されていないということです...しかし、それ以上の手がかりはありません。

ここに画像の説明を入力

4

3 に答える 3

3

プロファイリングを採用するのは正しいことです。Profile > Profile Project > CPUホットスポットを見つけてターゲットにするために使用します。

スローダウンは、反復ごとにデータベースとの接続を閉じたり開いたりする関数が原因でした。

この関連SwingWorkerに示すように、バックグラウンドでデータベースにクエリを実行し、イベント ディスパッチ スレッドprocess()で結果を取得するために使用することを検討してください。

于 2013-05-24T01:07:20.010 に答える
2

あなたが「メモリビルドアップ」と呼んでいるものはわずか600Kbです。この 600Kb に問題がある場合は、Java と Swing の選択について質問します。

数百メガバイトのログ メッセージを生成するアプリケーションがあります。あなたのGUIアプリケーションは多少似ていると思います。アプリにはおそらく、ログを表示する JTextPane があります。アプリが実行されると、JTextPane にメッセージが追加されます。
JTextPane で使用される Document 実装はPlainDocumentです。
おそらく常に新しいログ メッセージを一番上か一番下だけに挿入しますが、PlainDocument の実装は汎用的です。基になるテキスト ストリームにギャップを配置し、変更をギャップに配置することで、ドキュメント内の任意の場所の変更をサポートします。アプリがドキュメントに新しいメッセージを挿入すると、多くのギャップが作成されます。
表示する実際のテキストはどこかに存在する必要があります。巨大なテキスト ペインを実装するためのより良い方法がおそらくありますが、デフォルトの JTextPane は、プロファイラーにはメモリ リークのように見えます。600kb のログ メッセージがある場合、少なくとも 600kb のメモリが必要になります。

于 2013-05-23T16:30:59.657 に答える
1

PlainDocumentJava コンソールはwithGapContent$MarkDataを使用し、大量のデータを含むコンソールを開くだけで、この「メモリ リーク」が発生することを知っておく必要があります。コンソールをクリアして、MarkData許容レベルに戻った回数を確認します。

于 2015-02-23T15:16:44.007 に答える