0

EclipseIndigoを使用してJavaでアプリケーションを作成しています。Eclipseを使用して実行すると、タスクマネージャーはjavaw.exeが50MBのメモリを使用していることを示します。アプリケーションを実行可能な.jarとしてエクスポートし、.jarを実行すると、タスクマネージャーはjavaw.exeが500mbを使用していることを示します。どうしてこれなの?どうすればこれを修正できますか?

編集:Windows 7 64ビットを使用していますが、システムにJava1.7がインストールされていると表示されます。どうやらメモリの問題はwhileループが原因です。問題の原因となっているwhileループの内部を調べます。

編集:問題が見つかりました。whileループのある時点でBufferedImage、同じを置き換えるのではなく、作成された新しいインスタンスBufferedImage

4

3 に答える 3

0

それは最も奇妙に聞こえます。

私は2つの考えられる説明を考えることができます:

  • あなたは間違ったjavaw.exeインスタンスを見ました。おそらく、Eclipseを実行しているインスタンスを見たと思います...これは、それよりも大きいか、それよりも大きい可能性があります。

  • あなたは(どういうわけか)デフォルトで大きなヒープで実行するようにJavaを構成することに成功しました。Linuxでは、ラッパースクリプト、シェル関数、またはシェルエイリアスを使用してこれを行うことができます。あなたは少なくともそれらの最初のものをWindowsで行うことができます。

JARファイルそのものではないと思います。AFAIK、JARファイルにJVMパラメータを設定することはできません。どういうわけか、JARファイルに別のバージョンの何かを含めた可能性がありますが、それは少し難しいです...

これらのアイデアのいずれも役に立たない場合は、プロファイリングを試してください。


問題が見つかりました。同じBufferedImageを置き換える代わりに、whileループのある時点で新しいBufferedImageインスタンスが作成されました。

そうそう。BufferedImageは大量のヒープ外メモリを使用するため、慎重に管理する必要があります。

しかし、これは、アプリケーションに別のことをするように指示していない限り、アプリケーションがEclipseから起動したときよりもJARから実行したときに多くのメモリを使用した理由を説明していません。

于 2012-04-08T00:37:41.753 に答える
0

コードに関する追加の詳細がなければ、プロファイラーを使用して問題を分析することをお勧めします。YourKit と、NetBeans で利用できるものが非常に優れていることは知っています。

プロファイラーからアプリを実行したら、最初に、アプリケーションのパッケージによって作成されたオブジェクトとリスナーを確認する必要があります。問題がそこにない場合は、制御不能になっているものを特定するまで検索を他のパッケージに拡大し、それらのエンティティを処理するコードを調べます。

コードの特定の部分を複数回実行し、そのコードの実行が停止した後もメモリ使用率が表示される場合は、リークが発生している可能性があり、終了時に変数/リスナーを null にするか空にすることを検討してください。

これは良い出発点になるはずですが、結果を報告してください。ところで、使用しているオペレーティング システムと Java のバージョンを教えてください。

-- ルイス

于 2012-04-08T00:20:42.740 に答える
0

正確な答えを得るには、コードをプロファイリングする必要がありますが、私の経験から、似たようなものを目にすると、ガベージ コレクションと同一視することがよくあります。たとえば、私は同じジョブを実行し、1 つのジョブに 10 ギガを与え、他の 2 ギガを与えました..両方とも実行して完了しましたが、10 ギガの方がより多くのメモリを使用し (そしてより速く終了しました)、2 番目 (2 ギガ) のジョブはガベージが収集されたと思いますそれでも完了しましたが、メモリが少ないため少し時間がかかりました。私はJavaに少し慣れていないので、ガベージコレクションを想定しているかもしれませんが、あなたが話していることを見てきました。

コードをプロファイリングする必要があります (Java または visualVM に含まれている jconsole を確認してください)。

于 2012-04-08T00:26:04.303 に答える