0

問題:

「クライアント」を生成する JTabbedPane があります。各クライアントは、URLClassLoader を使用して jar ファイルからロードされたアプレットのインスタンスです。基本的に、各タブにはゲーム アプレットが含まれています。

タブが生成されるたびに、タスク マネージャーは、使用中のメモリ量が増加していることを示します。それは結構です。ただし、タブを閉じると、アプレットは停止して破棄されますが、タスク マネージャーによるメモリ使用量は同じままです。

保証されていない System.gc を呼び出してみましたが、まったく何もしません! アプレットへのすべての参照を無効にしようとしましたが、それでも何もしません。

可能であれば私の解決策:

すべてのタブには、ゲームを実行する独自の JVM/プロセスがあります。タブが閉じられると、アプレットは停止して破棄され、プロセス/JVM が停止しているため、プロセス/JVM によって使用されたメモリが OS に返されますか?

どうすればそのようなことができますか?JTabbedPane の各タブで Jar を実行したり、Jar を実行する新しい JVM を作成したりすることはできますか?

そうでない場合、閉じたすべてのタブのメモリをクリアするにはどうすればよいですか?

4

1 に答える 1

2
  1. まず、仕事に適したツールを使用してください。Process Manager は、独自のメモリを管理する JVM について何も知りません。VisualVM の最新バージョンをダウンロードし、VisualGC プラグインをインストールします。Process Manager で推測するのではなく、実際に何が起こっているかを調べます。実際にメモリを回収していない場合は、VisualVM のメモリ プロファイラーまたは Plumbr などのツールを使用してください。

  2. 手順 1 でメモリ リークが明らかにならない限り、メモリについて心配する必要はありません :) メモリに制約のあるシステムを使用している場合は、適切な Xmx 値を設定してください。また、最新の Oracle JRE には G1GC ガベージ コレクタ オプションが含まれています。この GC は、アプリケーションが大きなヒープを必要としなくなったときに、ヒープ サイズを自動的に減らします。(少なくとも) 次のオプションを使用してアプリを実行してみてください。

    • -XX:+UseAdaptiveSizePolicy
    • -XX:+UseAdaptiveGCBoundary
    • -XX:+UseCompressedOops
    • -XX:+UseG1GC

幸運を!

于 2013-05-28T02:08:15.207 に答える