2

メモリリークの可能性をトレースしていると、以下の現象にたどり着きました。Java 7 はインターンされた文字列または jmap を再利用していますか?

# jmap -ヒープ 9724 | grep インターン
プロセス ID 9724 にアタッチしています。お待ちください...
デバッガーが正常に接続されました。
サーバー コンパイラが検出されました。
JVM のバージョンは 23.3-b01 です
880048 バイトを占める 10526 個のインターン文字列。

# jmap -ヒープ 9724 | grep インターン
プロセス ID 9724 にアタッチしています。お待ちください...
デバッガーが正常に接続されました。
サーバー コンパイラが検出されました。
JVM のバージョンは 23.3-b01 です
878984 バイトを占める 10514 個のインターン文字列。

# jmap -ヒープ 9724 | grep インターン
プロセス ID 9724 にアタッチしています。お待ちください...
デバッガーが正常に接続されました。
サーバー コンパイラが検出されました。
JVM のバージョンは 23.3-b01 です
879720 バイトを占める 10519 個のインターン文字列。

環境: Linux バージョン 2.6.32-220.23.1.el6.centos.plus.x86_64 (mockbuild@c6b5.bsys.dev.centos.org) (gcc バージョン 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC ) ) #1 SMP Tue Jun 19 04:14:37 BST 2012

Java バージョン "1.7.0_07" Java(TM) SE ランタイム環境 (ビルド 1.7.0_07-b10) Java HotSpot(TM) 64 ビット サーバー VM (ビルド 23.3-b01、混合モード)

4

1 に答える 1

3

はいインターンされた文字列は回収されます。そして、その中で指定されているように、次のJava SE 7 Features and Enhancementsことが提案されています。

JDK 7 では、インターンされた文字列は、Java ヒープの永続的な世代に割り当てられなくなりましたが、代わりに、アプリケーションによって作成された他のオブジェクトと共に、Java ヒープの主要部分 (若い世代と古い世代として知られています) に割り当てられます。 . この変更により、メインの Java ヒープに存在するデータが増え、永続世代のデータが少なくなるため、ヒープ サイズの調整が必要になる場合があります。ほとんどのアプリケーションでは、この変更によるヒープ使用量の違いは比較的小さくなりますが、多くのクラスをロードしたり String.intern() メソッドを頻繁に使用する大規模なアプリケーションでは、より大きな違いが見られます。

于 2013-03-26T19:31:42.227 に答える