Области памяти Java в Java 8 - PullRequest
       67

Области памяти Java в Java 8

0 голосов
/ 08 декабря 2018

Я много читал об областях памяти Java, но похоже, что это просто беспорядок.Главным образом из-за введения новой MetaSpace области вместо PermGen в java8.И теперь есть вопросы:

  1. Какие области heap включает в java8 +?
  2. Где методы и переменные static хранятся до java8 и java8 +?
  3. Хранит ли MetaSpace что-либо, кроме информации метаданных класса?
  4. Зависит ли структура областей памяти от реализации JVM?

Спасибо заваши ответы.

1 Ответ

0 голосов
/ 13 декабря 2018
Зависит ли структура областей памяти от реализации JVM?

Абсолютно.PermGen или Metaspace - это просто детали реализации конкретной JVM.Следующие ответы касаются HotSpot JVM, эталонной реализации виртуальной машины Java SE.

  1. Какие области включает куча в java8 +?

По вышеуказанной причине правильнее было бы сказать «в JDK 8», а не «в Java 8».

Структура Java Heap зависит от выбранного алгоритма GC.Например, с помощью Parallel GC и CMS куча делится на старое и молодое поколения, где последнее состоит из рая и двух пространств выживших.

Куча G1 делится на области одинакового размера.Куча Epsilon GC представляет собой единый монолитный участок.И так далее.

Где статические методы и переменные хранятся до java8 и java8 +?

Методы (как статические, так и нестатические) находятся в Metaspace в JDK 8 или в PermGen до JDK 8Не уверен, что вы подразумеваете под «переменными»: значения полей находятся в Java Heap, метаданные полей (имена, типы, смещения) находятся в Metaspace.

Хранит ли MetaSpace что-либо, кроме информации метаданных класса?

В Metaspace хранятся следующие элементы:

  • Классы (их внутреннее представление)
  • Символы (имена и подписи)
  • Примитивные массивы (например, метаданные поля представляются в виде массива беззнаковых шорт)
  • Методы и их байт-коды
  • Методсчетчики
  • Пулы констант и кэши CP
  • Аннотации

Все это можно считать "метаданными класса".

...