3

私は〜30クラスのJava / Swingアプリケーションを書いています。私の問題は、プログラムを実行すると150 Mを超えるメモリがロードされることですが、それは正常ですか?アプリケーションには4つのスレッドがあるため、いくつかのXMLファイルを解析し、いくつかのアイコンファイルをロードし、いくつかのJfreechatチャートを描画します。そうでない場合、アプリケーションが使用するメモリの量を最小限に抑えるにはどうすればよいですか?一部の変数に影響を与えてnullヘルプを表示していますか?XMLファイルを一度ロードしてすべてのアプリケーションライフサイクルヘルプで使用するのですか、それとも必要なときに毎回ロードする必要がありますか?私を助ける他のヒントはありますか?

PS:私のプログラムで使用されるメモリに影響を与える可能性がある場合に備えて、8Gメモリコンピュータを使用して開発を進めています。

編集:vilmantasがアドバイスするように、アプリケーションでこのコードを実行することにより、Linuxのtopコマンドからこの値を取得するため、プログラムが150MBすべてを占有していないように見えました。

   long free = Runtime.getRuntime().freeMemory();
   long total = Runtime.getRuntime().totalMemory();
   long max = Runtime.getRuntime().maxMemory();
   long used = total - free;

彼が占める占有量はそれよりはるかに少ない(〜40MB)ことがわかったので、「-Xmx40M」引数を指定して実行することにし、Topコマンドでメモリ使用量を40%以上削減します。JVM (私が知っているように)以来、残りのメモリを占有している問題は、彼自身のプロセスを持っていますか?適切でない値を選択すると、「-Xmx30M」引数を指定して実行すると、メモリ例外が発生する可能性があるため、この操作を自動化する方法**?**:

   Exception in thread "Thread-2" java.lang.OutOfMemoryError: Java heap space
4

4 に答える 4

4

です。これはJavaであり、通常はVM/GCが自動的に機能します。問題が発生した場合は、メモリ使用量について心配してください。
必要に応じて、何が起こっているのかを分析するのに役立つツールがいくつかあります。Javaのメモリ使用量を監視する方法は?

于 2012-04-18T10:47:49.883 に答える
3

参照変数のライフサイクルが参照インスタンスよりも大きい場合、変数をに設定するとnull、メモリリークを防ぐのに役立ちます。そのため、アプリケーションのライフサイクル全体を通じて保持する必要のある変数は、短時間使用される一時オブジェクトへの参照を保持しない方がよいでしょう。

XMLを1回だけロードするのが得意な場合は、XMLを1回だけロードすると役立ちます。つまり、アプリケーション以外の方法でXMLが変更され、更新を取得する必要がある場合は、XMLを再ロードする必要があります(非推奨のXML情報が不要になった場合は削除します)。

于 2012-04-18T10:51:52.643 に答える
2

http://www.eclipse.org/mat/のようなJavaメモリヒープアナライザーを使用して、メモリの大部分を消費するアプリケーションの部分を特定できます。次に、データ構造を最適化するか、データへのすべての参照をnullに設定して、データのリリース部分を決定できます。

不要になったデータへの意図しない参照は、「メモリリーク」とも呼ばれます。これらの参照をnullに設定すると、ガベージコレクタはJavaメモリヒープからガベージコレクタを削除します。

その線に沿って、WeakReferenceが役立つ場合があります。

于 2012-04-18T10:52:47.207 に答える
1

それらの150Mをどこで観察しますか?それはあなたのJVMプロセスがどれだけ占有しているのか(例えば、linux / unixのtopコマンドに表示されている)、それとも実際にアプリケーションによって使用されている(そして必要な)メモリですか?

アプリケーションの実行時に、次の4つの値を書き込んでみてください。

    long free = Runtime.getRuntime().freeMemory();
    long total = Runtime.getRuntime().totalMemory();
    long max = Runtime.getRuntime().maxMemory();
    long used = total - free;

「used」の値が150Mよりはるかに小さい場合は、「-Xmx30M」などのJava開始パラメーターを追加して、アプリケーションのヒープサイズを30MBに制限できます。このような場合でも、JVMプロセスは30MBを少し超える量を占めることに注意してください。

JVMによるメモリ使用量はやや注意が必要です。

于 2012-04-18T13:18:19.750 に答える