5

この質問は、前の質問に対して提供された回答の結果です。

何がヒープを消費しているかを調査するために、EclipseMATを使用するように依頼されました。以下は私の観察です(トップ消費者):

class sun.awt.SunToolkit                                 333.7 MB
com.tennisearth.service.impl.CacheManagerServiceImpl     136 MB
org.apache.jasper.servlet.JspServlet                     91.5 MB

の問題はすでに修正されていますが、のCacheManageServiceImplヘルプが必要ですSunToolkit

以下は、Imageオブジェクト(内部で使用するSunToolkit.imgCache)を作成するコードです。

Image img = new ImageIcon(imagePath).getImage();
int imageWidth = img.getWidth(null);
int imageHeight = img.getHeight(null);

Plzは、Imageオブジェクトは、後でいくつかのロジックで必要となる画像の幅/高さを取得するためにのみ作成されていることに注意してください。

SunToolkit画像のキャッシュを無効にする方法はありますか?さらに良いことに、このキャッシュをクリアする方法はありますか?または、この情報を取得するためのより良い方法はありますか?

参考までに、以下のコマンドを使用してjbossを実行しています(plzはヒープサイズの引数に注意してください)。

java -Dprogram.name=run.sh -server -Xms256m -Xmx1024m -XX:PermSize=64m -XX:MaxPermSize=256m -verbose:gc -Xloggc:/data1/logs/jboss/GC.log -XX:+HeapDumpOnOutOfMemoryError -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000 -Dorg.apache.catalina.STRICT_SERVLET_COMPLIANCE=false -Djava.net.preferIPv4Stack=true -Djava.library.path=/usr/local/java/jboss-4.2.2.GA/bin/native -Djava.endorsed.dirs=/usr/local/java/jboss-4.2.2.GA/lib/endorsed -classpath /usr/local/java/jboss-4.2.2.GA/bin/run.jar:/usr/local/java/jdk1.6.0_06/lib/tools.jar org.jboss.Main -c default -b <IP_ADDRESS> -Djboss.messaging.ServerPeerID=1

スミット

4

2 に答える 2

3

イメージキャッシュはSoftCacheという名前のクラスによって実装されているようで、そのドキュメントには次のように記載されています。

Mapインターフェイスのメモリに依存する実装。

SoftCacheオブジェクトはjava.lang.ref.SoftReferenceを使用して、メモリに依存する ハッシュマップを実装します。ガベージコレクターは、ある時点で、 SoftCacheエントリ内の値オブジェクトに強く到達できなくなったと判断した場合、値オブジェクトによって占有されていたメモリを解放するために、そのエントリを削除する場合があります。仮想マシンがをスローする前に、すべてのSoftCacheオブジェクトが完全にクリアされることが保証されます OutOfMemoryError

したがって、他の場所でメモリが必要になると自動的にクリアされるため、このキャッシュが使用するメモリについて心配する必要はありません。

編集:SyntaxT3rr0rによるコメントを読んだ後でもflush、画像を呼び出す価値があると思います。これがlargetメソッドの一部である場合は、画像をnullに設定するか、リファクタリングして、より早くスコープから外れるようにすることもできます。

もう1つの可能性は、ImageIOApiを試して幅と高さを取得することです。これは、画像タイプのImageReaderを取得することで可能になります。

于 2011-03-09T13:55:37.653 に答える
1

Imageオブジェクトが長期間スコープ内にとどまる可能性はありますか?たとえば、長期間実行されるコードブロックの外部スコープに含まれている場合、適切にガベージコレクションされない可能性があります。

場合によっては(まれに)、Imageオブジェクト参照を明示的にnullに設定すると便利な場合があります。これは、私が上で述べた場合にも当てはまります。詳細については、次の質問を参照してください。Javaでオブジェクトをnullに割り当てると、ガベージコレクションに影響しますか?

于 2011-03-09T13:27:22.827 に答える