Профилирование Java char[] и строк

#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. @Питер: Ты прав. Я только что проверил источник… Приятно знать