#java #string #memory-leaks #profiling
#java #строка #утечки памяти #профилирование
Вопрос:
Я профилирую приложение и заметил, что 52% (195 МБ) памяти используется char[]
и 20% используется String
. Это большой проект с большим количеством зависимостей, и я только что его увидел, поэтому у меня есть пара связанных вопросов, которые помогут мне начать работу:
String s = "some text"
Создает ли символ[]?
Я заметил, что есть сотни String s = new String("some text")
без видимой причины. Это виновник?
Комментарии:
1. так это
new String("aa")
или просто"aa"
?2. Есть и то, и другое. Я бы предположил, что я мало что могу сделать с «aa», но, возможно, использование новой строки («aa») неверно и может быть оптимизировано.
Ответ №1:
Создает ли строка s = «некоторый текст» символ[]?
Это не создает никаких объектов.
Я заметил, что есть сотни строк s = new String(«некоторый текст») без видимой причины. Это виновник?
Это создает копию строки и, возможно, символа[] (два объекта). Копия берется только в том случае, если строка представляет подстроку другой строки.
Я бы удостоверился, что у вас есть версия Java, которая поддерживает -XX: UseCompressedStrings
это, включена по умолчанию в более поздних версиях Java и позволяет использовать JVM byte[]
вместо char[]
того, который может быть вдвое меньше.
Однако в наши дни 400 МБ не так уж велики, и покупка большего объема памяти может быть самым простым решением. Вы можете получить 16 ГБ всего за 120 долларов.
Комментарии:
1. ( 1) Посмотрев на код JDK6, я сомневаюсь, что
new String("some text")
это скопировалоchar[]
бы . Я почти уверен, что он будет использовать ту же ссылку на массив.2. Я тоже был бы удивлен копированием
char[]
. Если неизменяемая строка реализована правильно, в этом не должно быть необходимости…3.
new String()
не требуется в 99,9% случаев.4. @LukasEder,
char[]
можно скопировать, но не в этом случае.5. @Питер: Ты прав. Я только что проверил источник… Приятно знать