5

次のような静的メソッドを呼び出すと、次のようになります。

Something.action();

インスタンスが作成されないので、静的メソッドのクラスはどのくらいの期間メモリに保持されますか?

同じメソッドを呼び出すと、インスタンスが存在しないため、呼び出しごとにクラスが再ロードされますか?

また、呼び出されたときに個々の静的メソッドのみがロードされますか、それとも1つの静的メソッドのみが使用される場合でも、クラスのすべてのメソッドと静的メソッドがメモリにロードされますか?

4

4 に答える 4

11

permgenspaceのガベージコレクションを構成していない限り、クラスはvmが終了するまでメモリに残ります。フルクラスには、すべての静的メソッドがロードされます。

于 2008-11-18T12:30:31.600 に答える
4

そのクラスをロードしたクラスローダーがメモリにとどまるまで、クラスはメモリにとどまります。したがって、クラスがシステムクラスローダーからロードされる場合、私が知る限り、クラスがアンロードされることはありません。

クラスをアンロードする場合は、次のことを行う必要があります。

  1. カスタムクラスローダーを使用して、クラスとそのクラスを参照するすべてのクラスをロードします
  2. そのクラスを使い終わったら、そのクラスへのすべての参照を解放します。つまり、そのクラスのオブジェクトインスタンスが周囲にないことを確認します。
  3. それらのクラスをロードしたカスタムクラスローダーインスタンスを解放することにより、クラスとそれを参照するすべてのクラスをアンロードします。
于 2008-11-18T12:35:23.090 に答える
2

一部の構成では、呼び出しを行う前にクラスがロードされます。BES (Borland Enterprise Server) を使用しましたが、アプリケーションの起動時にすべての参照クラスが再帰的にロードされる Solaris 実動サーバーに問題がありました。つまり、アプリのメイン クラスが読み込まれたときに、アプリ サーバーはそのクラスのインポート セクションで参照されているすべてのクラスを ... 再帰的に読み込みました。

余談ですが、非常にメモリに制約のある環境で実行している場合や、大量の不要なクラスをロードしている場合を除き、メモリにロードされたクラスのメモリ使用量についてあまり気にする必要はありません。

于 2008-11-18T12:46:03.097 に答える
1

呼び出し元クラスがロードされるときに、Somethingクラスがロードされる必要があります。そして、krosenvoldが言ったように、VMが終了するまでそこにとどまります。

于 2008-11-18T12:35:32.497 に答える