サーブレットコンテナにデプロイされたアプリケーションから直接的または間接的に登録されたMBeanを処理するかどうか、またはどのように扱うべきか疑問に思っています。JMX:サーブレットコンテナでClassloaderのメモリリークを防ぐ方法は?
ほとんどの場合、あなたが使用している場合
が使用
ManagementFactory.getPlatformMBeanServer()
をMBeanServerFactory.createMBeanServer()
を使用して、独自のMBeanServer
を作成して登録するために使用することができますMBeanServer
を取得するための2つのオプションがあります最初のオプションは、すべてのMBeanの登録を解除するのが簡単です: Jus呼び出しはMBeanServer.releaseMBeanServer(myMBeanServer)
です。
しかし、多くのサードパーティアプリケーションで頻繁に使用される第2のオプションはどうですか? (さらに、これはSun/Oracleの推奨方法です)。
プラットフォームMBeanServer
が使用されているため、サーブレットコンテキストが破棄されたときに登録抹消されませんが、悪化してもWebアプリケーションクラスローダーへの参照が保持されます。
結果として、Webアプリケーションのすべての静的参照は解放されず、リークが発生します。
これをテストしたい場合:静的に参照され、oracle jdbcドライバ(プラットフォームMBeanサーバーを使用して診断MBeanを登録する)を使用する100MBの配列を割り当てる単純なWebアプリケーションをデプロイするだけです。風邪。アプリケーションを停止して再起動します。これを繰り返すと、OutOfMemoryError
が表示されます。
質問:
は、私は、一般的に、これらの問題に対処するために持っているか、それはサーブレットコンテナおよび/またはサードパーティのライブラリの問題ですか?
によってクラスがロードされる
MBeanServer
のすべてのMBeanを取得する方法はありますか?これを防ぐにはどうすればよいですか?登録されたすべてのMBeanをプラットフォーム
MBeanServer
に追跡し、contextDestroyed()
の間に登録を解除する必要がありますか?
はたぶんhttp://stackoverflow.com/questions/386892/is-it-necessary-to-unregister-an-mbean-from-the-platform-mbean-server – nfechner