Я выполняю профиль NetBeans рекурсивной операции, которая включает создание класса с a java.lang.String
поле. В списке классов, в дампе "кучи" профиля, количество полей String соответствует количеству классов, созданных как ожидалось, однако существует также подобное количество char[]
экземпляры. Массивы символов составляют почти 70% использования памяти(!), пока поле String составляет приблизительно 7%.
Что продолжается здесь? И как я могу сократить количество char[]
экземпляры?
Спасибо
Взгляните на исходный код Строки . Сам объект Строка содержит кэшированный хэш-код, подсчет количества символов (опять же, в целях оптимизации), смещение (так как String.substr()
указывает на исходные строковые данные) и символьный массив, который содержит фактические строковые данные. Следовательно, ваши метрики показывают, что Строка потребляет относительно мало, но большая часть памяти берется подсимвольными массивами символов.
На графические массивы приходится почти 70%. использования памяти(!) в то время как Строковое поле составляет около 7%
Это тонкость профилирования памяти, известная как "сохраняемый размер" и "мелкий размер":
String - это идеальный пример. Она содержит несколько примитивных полей, плюс char[]
. На char[]
приходится подавляющее большинство использования памяти. Мелкий размер строки очень мал, но сохраненный размер намного больше, так как включает в себя char[]
.
Профилировщик NetBeans, вероятно, дает малый размер, что не очень полезная цифра, но которую легко вычислить. Сохраненный размер будет включать использование памяти char[]
в использование памяти String
, но вычисление сохраненного размера является вычислительно дорогостоящим, и поэтому профайлеры не смогут этого сделать, пока явно не попросят.
Строки поддерживаются массивами Char, поэтому я не думаю, что вы можете уменьшить количество экземпляров CHAR [], не уменьшая свои строки.
Вы пытались удалить некоторые строки, чтобы посмотреть, идет ли шар [], а также?
Класс String
в Java-реализации Sun использует char []
для хранения символьных данных.
Я считаю, что это можно проверить, не глядя на исходный код, используя отладчик для просмотра содержимого String
или используя отражение для просмотра внутреннего содержимого String
объект.
Следовательно, было бы трудно уменьшить количество создаваемых char []
, если только количество создаваемых экземпляров String
не было уменьшено.