На размер пула строк влияет установка максимального размера кучи? - PullRequest
0 голосов
/ 05 апреля 2020

У меня есть приложение java, которое использует странное использование памяти, я заметил, что потребление памяти значительно превышает максимальный размер кучи (Xmx равно 800m, использование 1.4g).

Одним из недавних изменений, предшествовавших этому, было значительное увеличение числа используемых уникальных строк, поэтому я подумал, что, может быть, из-за того, что у меня много строк, которые используют много памяти вне кучи - возможно ли это?

I Я бегу java 11.

РЕДАКТИРОВАТЬ:

например, в этой статье он упоминает:

Когда мы создаем Строковый объект с использованием оператора new () всегда создает новый объект в динамической памяти. С другой стороны, если мы создаем объект с использованием строкового литерального синтаксиса, например «Baeldung», он может вернуть существующий объект из пула строк, если он уже существует.

Создание впечатления от 2 различных области - куча и пул строк.

Ответы [ 3 ]

2 голосов
/ 05 апреля 2020

В JDK, пул строк, который содержит интернированные строки, состоит из двух частей:

  1. Таблица ha sh, которая расположена вне кучи и содержит ссылки на интернированные строки. Эта область памяти отображается в отчете «Отслеживание собственной памяти» как «Таблица строк».
  2. Содержимое интернированных строк. Это обычные java.lang.String объекты в куче Java.

Итак, пул строк состоит из частей как в куче, так и вне кучи. Часть вне кучи, как правило, меньше, но она все равно может занять значительное количество дополнительной памяти, если приложения создают слишком много встроенных строк.

Используйте Отслеживание собственной памяти , чтобы найти количество памяти, используемой таблицей String.

См. этот ответ , чтобы найти другие причины, по которым процесс может занять гораздо больше памяти, чем -Xmx.

1 голос
/ 05 апреля 2020

Начиная с Java 7, пул строк является частью обычной кучи (см. здесь ). Таким образом, обычный размер кучи также ограничивает размер пула строк.

Реальная вещь, которую вы должны взять из этой статьи, заключается в том, что new String(...) всегда создает новый String объект, отличный от всех ранее созданных String объектов. Это не относится к объекту String, который соответствует строковому литералу.

Я заметил, что потребление памяти значительно превышает максимальный размер кучи (Xmx - 800 м, использование - 1,4 г ).

Объяснение этому заключается в том, что JVM использует различные способы использования памяти, которая не является частью обычной кучи. К ним относятся:

  • память для исполняемого файла JVM и его общих библиотек
  • память, используемая для библиотек собственного кода, загруженных приложением
  • сегменты памяти, используемые для Java потоки стеков
  • памяти, используемой для представления метапространства ... которая содержит скомпилированный JIT собственный код и т. д.,
  • память в «собственной» куче, выделенной собственным кодом; например, используя malloc.
  • памяти, выделенной для прямых буферов
0 голосов
/ 05 апреля 2020

Вы можете использовать https://visualvm.github.io/index.html для анализа и проверки, например, вашей занятой памяти и кучи.

...