4

私は自分で作成したユーティリティを持っています。非常に小さな専用ユーティリティであるため、テスト中に 150 MB のメモリを使用していることに気付いたときは非常に驚きました。1MB のヒープ設定で実行しましたが、それでも 50MB 以上を占めていました。

プロファイリングを行い、どこが間違っていたのかを突き止めるために 1 日を費やした後、理論をテストすることにしました。私のユーティリティは独自のアプリケーションに接続します。この接続には、アプリケーション ベンダーが提供する外部ライブラリが必要です。

ライブラリを使用して小さな Hello World を書き、次のことに気付きました。

1) ベンダー ライブラリから新しいオブジェクトを宣言すると、すぐにメモリ使用量が 50MB (ほとんど permgen スペース) に増加します。

2) 実際にアプリケーション サーバーに接続しようとすると、メモリ使用量が 150MB に跳ね上がります。

私に関する限り、それはただのばかげたことです。

獣を手なずける方法が何かあるのだろうかと思っています。たぶん、必要のない、または参照されることのないことがわかっているクラスを何らかの形でアンロードします。ベンダーはすぐに物事を変えるつもりはありません。

または、必要な場合にのみベンダーのライブラリをロードするのはどうでしょうか? そうすれば、アプリサーバーとの通信中にメモリを消費するだけです。

4

1 に答える 1

4

JVM は、実際に使用するクラスのみをロードします。実際、実際に使用するメソッドのみをロードします。たとえば、使用していないメソッドにバイト コードのバグがある場合、それはわかりません。;)

ベンダー ライブラリのサイズを縮小する最善の方法は、ベンダーに改善を依頼するか、独自のライブラリを作成することです。

残念ながら、適切なアプリケーションの割り当ては、あまりリソー​​スに優しいものではありません。彼らの最優先事項は正確さです。:j

ところで: 150 MB のメモリのコストは約 6 ドルなので、それ以上の時間を修正に費やすことはありません。

于 2013-02-04T15:37:42.830 に答える