Подтвердить что ты не робот

Какой инструмент отладки может перечислить строки, интернализированные?

Я ищу инструмент отладки, который может перечислить строки, которые были интернализованы? В идеале я хотел бы поместить отметку и иметь список строк, добавленных после этой метки.

Спасибо заранее.

4b9b3361

Ответ 1

Возможно, самый простой способ - использовать просмотрщик байт-кода. Любая строка, которая интернирована, будет присутствовать в константе_pool файла класса, в который включен литерал String. Например, в последнем файле класса из другого вопроса StackOverflow, на который я ответил, у меня был следующий литерал String в моем коде: "sun.awt.noerasebackground", Это отображается в постоянном пуле как тип 'String_info'. Проигрыватель байт-кода (и редактор, так что будьте осторожны!), Который я использую, это JBE. Загрузка JBE

Ответ 2

В недавней Hotspot VM интернированные строки выглядят так же, как и любые другие - единственное отличие состоит в том, что основной массив char отслеживается VM (я думал, что у него есть дополнительная ссылка JNI, но он не отображается на Дамп YourKit - будет интересно исследовать).

Тем не менее, Yourkit обеспечивает проверку памяти для дублированных строк, что, я считаю, делает то, что вам нужно. Если вы объедините его с "Trace Allocations", вы можете перейти прямо к коду, который выделил эти строки.

См. http://www.yourkit.com/docs/95/help/inspections_mem.jsp#duplicate_strings

-

Получение списка строк, добавленных между двумя моментами времени, проще:

  • Получите две кучи-дампы, используя jmap или ваш любимый профилировщик
  • Сделайте разницу кучи
  • Показать все экземпляры класса String

Должно быть выполнено с любым профилировщиком или даже с jhat (если вы достаточно терпеливы). Если вы используете YourKit, вы можете использовать функцию закладки и взять только один снимок кучи.