3

重複の可能性:
Java-文字列がインターンされているかどうかを教えてください。

jvmによって内部化された文字列のリストが必要です。これは、リテラルであるため、メソッドinternが呼び出されたためです。どうすれば生成できますか?

4

2 に答える 2

1

次のように、インターンされたすべての文字列の合計サイズを取得できます。

$ jmap -permstat 543
Attaching to process ID 543, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 19.1-b02-334
14584 intern Strings occupying 1603648 bytes.
finding class loader instances ..Warning: skipping invalid TLAB for thread t@44819
...
于 2011-05-25T22:47:31.457 に答える
1

どうすれば生成できますか?

実行中のプログラム内ではできません。インターンされた文字列プールを反復するための API はありません。


理論的には、デバッグ エージェントを介して実行できます。それには以下が含まれます:

  1. 到達可能なオブジェクトをトラバースして、すべてのStringインスタンスを見つけます。
  2. それぞれについて、かどうかをテストしますstr == str.intern()

ただし、このプロセスにはコストがかかり、不必要にインターンされた多数の文字列で文字列プール (permgen ヒープ) が汚染されます。さらに、これはすべてのアプリケーション スレッドがデバッグ エージェントによって停止された場合にのみ機能するため、アプリケーションはこのアプローチを使用して独自の文字列プールを調べることはできません。

于 2011-05-25T23:09:14.700 に答える