Какой инструмент отладки может перечислить строки, интернализированные?
Я ищу инструмент отладки, который может перечислить строки, которые были интернализованы? В идеале я хотел бы поместить отметку и иметь список строк, добавленных после этой метки.
Спасибо заранее.
Ответ 1
Возможно, самый простой способ - использовать просмотрщик байт-кода. Любая строка, которая интернирована, будет присутствовать в константе_pool файла класса, в который включен литерал String. Например, в последнем файле класса из другого вопроса StackOverflow, на который я ответил, у меня был следующий литерал String в моем коде: "sun.awt.noerasebackground", Это отображается в постоянном пуле как тип 'String_info'. Проигрыватель байт-кода (и редактор, так что будьте осторожны!), Который я использую, это JBE. Загрузка JBE
Ответ 2
В недавней Hotspot VM интернированные строки выглядят так же, как и любые другие - единственное отличие состоит в том, что основной массив char отслеживается VM (я думал, что у него есть дополнительная ссылка JNI, но он не отображается на Дамп YourKit - будет интересно исследовать).
Тем не менее, Yourkit обеспечивает проверку памяти для дублированных строк, что, я считаю, делает то, что вам нужно. Если вы объедините его с "Trace Allocations", вы можете перейти прямо к коду, который выделил эти строки.
Получение списка строк, добавленных между двумя моментами времени, проще:
Получите две кучи-дампы, используя jmap или ваш любимый профилировщик
Сделайте разницу кучи
Показать все экземпляры класса String
Должно быть выполнено с любым профилировщиком или даже с jhat (если вы достаточно терпеливы). Если вы используете YourKit, вы можете использовать функцию закладки и взять только один снимок кучи.