Почему профилировщик показывает большие количества символа [] экземпляры, когда я не создаю никого?

Я выполняю профиль NetBeans рекурсивной операции, которая включает создание класса с a java.lang.String поле. В списке классов, в дампе "кучи" профиля, количество полей String соответствует количеству классов, созданных как ожидалось, однако существует также подобное количество char[] экземпляры. Массивы символов составляют почти 70% использования памяти(!), пока поле String составляет приблизительно 7%.

Что продолжается здесь? И как я могу сократить количество char[] экземпляры?

Спасибо

8
задан MalcomTucker 31 December 2009 в 13:48
поделиться

4 ответа

Взгляните на исходный код Строки . Сам объект Строка содержит кэшированный хэш-код, подсчет количества символов (опять же, в целях оптимизации), смещение (так как String.substr() указывает на исходные строковые данные) и символьный массив, который содержит фактические строковые данные. Следовательно, ваши метрики показывают, что Строка потребляет относительно мало, но большая часть памяти берется подсимвольными массивами символов.

13
ответ дан 5 December 2019 в 08:24
поделиться

На графические массивы приходится почти 70%. использования памяти(!) в то время как Строковое поле составляет около 7%

Это тонкость профилирования памяти, известная как "сохраняемый размер" и "мелкий размер":

  • Мелкий размер относится к тому, сколько памяти занимает объект, не включая любые дочерние объекты, которые он содержит. В основном, это означает примитивные поля.
  • Retained size - это мелкий размер плюс размер других объектов, на которые ссылается объект, но только те другие объекты, на которые ссылается только этот объект (хитрое объяснение, простое понятие).

String - это идеальный пример. Она содержит несколько примитивных полей, плюс char[]. На char[] приходится подавляющее большинство использования памяти. Мелкий размер строки очень мал, но сохраненный размер намного больше, так как включает в себя char[].

Профилировщик NetBeans, вероятно, дает малый размер, что не очень полезная цифра, но которую легко вычислить. Сохраненный размер будет включать использование памяти char[] в использование памяти String, но вычисление сохраненного размера является вычислительно дорогостоящим, и поэтому профайлеры не смогут этого сделать, пока явно не попросят.

.
4
ответ дан 5 December 2019 в 08:24
поделиться

Строки поддерживаются массивами Char, поэтому я не думаю, что вы можете уменьшить количество экземпляров CHAR [], не уменьшая свои строки.

Вы пытались удалить некоторые строки, чтобы посмотреть, идет ли шар [], а также?

1
ответ дан 5 December 2019 в 08:24
поделиться

Класс String в Java-реализации Sun использует char [] для хранения символьных данных.

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

Следовательно, было бы трудно уменьшить количество создаваемых char [] , если только количество создаваемых экземпляров String не было уменьшено.

2
ответ дан 5 December 2019 в 08:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: