Подтвердить что ты не робот

Интернированные струны не в пергеном?

Я запустил команду jmap -heap в нашем исполняемом Java-приложении, и вот что я получил:

C:\Program Files\Java\jdk1.7.0_05\bin > jmap -heap 2384 Присоединение к процессу ID 2384, пожалуйста, подождите... Отладчик успешно подключен. Определен компилятор сервера.
Версия JVM - 23.1-b03

используя параллельные потоки в новом поколении.
используя распределение локальных потоков.
Параллельный Mark-Sweep GC

Конфигурация кучи:
  MinHeapFreeRatio = 40
  MaxHeapFreeRatio = 70
  MaxHeapSize = 1073741824 (1024,0 МБ)
  NewSize = 1310720 (1,25 МБ)
  MaxNewSize = 17592186044415 МБ
  OldSize = 5439488 (5.1875MB)
  NewRatio = 2
  SurvivorRatio = 8
  PermSize = 134217728 (128.0MB)
  MaxPermSize = 201326592 (192.0MB)
  G1HeapRegionSize = 0 (0.0MB)

Использование кучи:
Новое поколение (Eden + 1 Survivor Space):
  емкость = 228261888 (217.6875MB)
  used = 203794000 (194.3531036376953MB)
  free = 24467888 (23.334396362304688MB)
  89.28078260703775% использовано
Eden Space:
  емкость = 202964992 (193.5625MB)
  used = 198399360 (189.2083740234375MB)
  free = 4565632 (4.3541259765625MB)
  97.75053226913141% использовано
Из космоса:
  емкость = 25296896 (24.125MB)
  used = 5394640 (5.1447296142578125MB)
  free = 19902256 (18.980270385742188MB)
  21.325304100550518% использовано
Космос:
  емкость = 25296896 (24.125MB)
  used = 0 (0.0MB)
  free = 25296896 (24.125MB)
  0.0% использовано
одновременная генерация маркеров:
  емкость = 506445824 (482.984375MB)
  used = 159479408 (152.09141540527344MB)
  бесплатно = 346966416 (330.89295959472656MB)
  31.489924576809226% использовано
Пермское поколение:
  емкость = 134217728 (128.0MB)
  used = 72157448 (68.81470489501953MB)
  free = 62060280 (59.18529510498047MB)
  53.76148819923401% использовано

96874 интернированных строк, занимающих 89695496 байт.

Таким образом, похоже, что в 68 млн. пермгенов насчитывается около 89 мб интернированных строк. Существуют ли интернированные строки, которые не хранятся в Permgen?

4b9b3361

Ответ 1

От заметки о выпуске Java 7:

В JDK 7 интернированные строки больше не выделяются в постоянное поколение кучи Java, но вместо этого распределяются в основная часть кучи Java (известная как молодая и старая поколений) вместе с другими объектами, созданными приложением. Это изменение приведет к большему количеству данных, находящихся в основной куче Java, и меньше данных в постоянном поколении, и, следовательно, может потребоваться куча размеры для регулировки. Большинство приложений будут видеть только относительно небольшие различия в использовании кучи из-за этого изменения, но более крупные приложения которые загружают многие классы или используют метод String.intern() будут видеть более значительные различия.