M12i.

学術書・マンガ・アニメ・映画の消費活動とプログラミングについて

"JDK-6962931 : move interned strings out of the perm gen" の意味するところが判然としない

今現在.NETのCLR関連の資料を読んでいて、それと比較対象するためにJVMについての資料も漁っていたのですが、そのなかで「OracleのJDK7に同梱されたHotspot VMからinternされた文字列の格納先がPermanent領域から非PermanentなHeap領域に変更になった」という旨の表現を見つけました。

ソースを辿ろうとして見つけられた公式の資料としてはこちらの"Java Virtual Machine Enhancements in JDK 7"(JDK7におけるJVNの機能向上)からリンクされている"JDK-6962931 : move interned strings out of the perm gen"(JDK-6962931 : internされた文字列のPermanentヒープからの排除)です。ここで「現在は」(currently)と言っているのはJDK6以前のHotspotについてのもの:

Interned strings are currently stored in the permanent generation. A new approach for managing meta-data is being designed and it requires interned strings to live elsewhere in the the heap (young gen and/or old gen).

設計中の新しいメタデータ管理方式のためinternされた文字列の格納先は他の世代のヒープ(Young世代および/あるいはOld世代)に移す必要がある──ということはどういうことなのか? なぜそれが必要なのか? そしてそうすることでいわゆる「文字列定数プール」の性質がどう変化するのか? そこが判然としないのです。上記記事に関連する議論のなかに何かしら情報は転がっているかもしれませんが、読めていません。

おそらく確かだろうと思われるのはinternされた文字列の格納先が変わることで、それらの文字列オブジェクトに対するGCが従来よりは頻繁に、そしてより徹底して実施されるだろうということ。でもそれ以上はわかりません。もとより数あるJVMのうちの1つの実装にのみ関することですから、少なくともプログラマ・レイヤの人間があまり考えるべきことでもないでしょう。しかしそうではあってもinternされた文字列の扱いはOCJ-P(SJC-P)の参考書に書かれるくらい重要なテーマであるのも事実です。