Как вы перечисляете строку, которая была интернализована в jvm?

Возможный дубликат:
Java - сообщите, если Строка интернирована?

Я хотел бы иметь список строк, которые были интернализованы jvm, либо потому, что они буквальны, либо потому, что метод intern при вызове на них. Как я могу его сгенерировать?


person Guillaume Coté    schedule 25.05.2011    source источник
comment
из любопытства: зачем вам это нужно?   -  person Bozho    schedule 26.05.2011
comment
Это не дубликат. первый вопрос о строке, второй о получении списка.   -  person Guillaume Coté    schedule 26.05.2011
comment
У меня проблема с нехваткой памяти в пространстве perm gen, наблюдение за добавленной строкой может помочь мне, почему perm gen так сильно растет в определенный момент.   -  person Guillaume Coté    schedule 26.05.2011
comment
Я добавил еще один связанный вопрос, так как он не был понят так, как я предполагал: stackoverflow.com/questions/6180006/   -  person Guillaume Coté    schedule 08.07.2011


Ответы (2)


Вы можете получить общий размер всех интернированных строк как:

$ 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
...
person Binil Thomas    schedule 25.05.2011
comment
Вопрос в списке, а не в количестве. - person Guillaume Coté; 26.05.2011

Как я могу его сгенерировать?

Вы не можете в работающей программе. Не существует API для повторения внутреннего пула строк.


Теоретически вы можете сделать это через агент отладки. Это будет включать:

  1. Обход доступных объектов для поиска ВСЕХ String экземпляров.
  2. Для каждого проверка на наличие str == str.intern().

Однако этот процесс будет дорогостоящим и загрязнит пул строк (кучу permgen) большим количеством строк, которые были интернированы без необходимости. Кроме того, это работает только тогда, когда все потоки приложения остановлены агентом отладки, поэтому приложение не может использовать этот подход для проверки собственного пула строк.

person Stephen C    schedule 25.05.2011
comment
Теоретически это выполнимо для небольшого приложения, но с огромным приложением произойдет сбой из-за нехватки памяти в perm gen space. Даже если я достаточно увеличу пространство perm gen, цель состоит в том, чтобы сравнить список в разных точках. Невозможно провести корректное сравнение, поскольку лекция меняет результат. - person Guillaume Coté; 26.05.2011