1

いくつかのメモリリークを見つけるために、1つのJavaコードベースを確認しています。レビュー中に、次のシナリオが見つかりました。

  1. Class1のクラスがコードベースにあります。Class1には、いくつかのインスタンス変数といくつかの静的メンバーがあります。Class1のインスタンスを作成する他のいくつかのクラス。このシナリオはメモリリークにつながりますか?
  2. コードベースで使用可能なクラスClass2。いくつかのパブリック静的内部クラスがあります。そして、静的内部クラスのインスタンスは、他の静的内部クラスから作成しています。メモリリークにつながりますか?例えば、
Class2 {
  public static class Class3 {
  }
  public static class Class4 {
  }
  public static class Class3 {
      Class3 c = new Class3();
      //….
  }
  public static int doSomething1{
  }
  public static void doSomething2{
  }
  public void doSomething3{
  }

}

誰かが答えることができますか?

4

3 に答える 3

3

他のクラスのインスタンスを作成しても、それ自体でメモリリークが発生することはありません。

必要以上に参照を保持すると、メモリリークが発生します。

これらの参照は、明示的または暗黙的にすることができます。たとえば、非静的内部クラスのインスタンスを作成すると、外部インスタンスへの明示的な参照が存在しない場合でも、外部インスタンスへの参照が保持されます。

したがって、直接の質問に対する答えは明確です。多分。あなたは私たちにもっと情報を与える必要があります。

そして:メモリリークを見つけるための非常に優れたツールは、プロファイラーを使用することです。特にそれが大きなメモリリークの場合。

于 2011-10-05T07:14:23.573 に答える
1

一般的に、静的メンバーは、nullに設定するまで解放されません。インスタンス自体に到達できない場合、インスタンス変数が解放されます。静的内部クラスは通常のクラスとまったく同じであるため、上記の規則に従います。

非静的内部クラスは、@JoachimSauerによって記述されたとおりです。

psプロファイラーの使い方を学びましょう。残りのプログラミングライフに役立ちます:)

于 2011-10-05T07:21:52.343 に答える
1

メモリリークに問題がありました。同僚がメモリプロファイリングツールhttp://www.eclipse.org/mat/を推奨しました。

私はJavaマスターではなく、親密でもありません。しかし、私が行ったことは、プログラムがクラッシュする(メモリ不足)時期を監視してコードを実行し、コードを再度実行することでしたが、今回は、コマンドラインオプション-Xmxを使用して、プログラムがクラッシュすることがわかっています。

私も追加-XX:+HeapDumpOnOutOfMemoryErrorし、プログラムがクラッシュしたときに、プロファイリングツールを使用して、ヒープダンプのプロファイルを作成しました。

問題のある変数/オブジェクトを見つけることができました。お役に立てば幸いです。

于 2012-07-17T08:13:34.363 に答える