1. Обзор
В нашей повседневной работе мы часто не заботимся о распределении внутренней памяти JVM.
Однако знание основ модели памяти JVM пригодится для оптимизации производительности и улучшения качества кода .
В этой статье мы рассмотрим хранилище JVM для статических методов и членов.
2. Классификация памяти JVM
Прежде чем углубляться в выделение памяти для статических членов, мы должны освежить наше понимание структуры памяти JVM.
2.1. Куча памяти
Куча памяти — это область данных времени выполнения, совместно используемая всеми потоками JVM для выделения памяти для всех экземпляров классов и массивов.
Java классифицирует память кучи на две категории — молодое поколение и старое поколение.
JVM внутренне разделяет молодое поколение на Eden и Survivor Space. Точно так же Tenured Space — это официальное название Старого Поколения.
Жизненный цикл объекта в куче памяти управляется автоматической системой управления памятью, известной как сборщик мусора .
Поэтому сборщик мусора может автоматически либо освобождать объект, либо перемещать его в различные разделы динамической памяти (от молодого к старому поколению).
2.2. Память без кучи
Память без кучи состоит в основном из области методов, в которой хранятся структуры классов, поля, данные методов и код для методов/конструкторов .
Подобно памяти кучи, все потоки JVM имеют доступ к области методов.
Область метода, также известная как постоянное создание (PermGen), логически считается частью памяти кучи, хотя более простые реализации JVM могут не выполнять сборку мусора.
Однако Java 8 удаляет пространство PermGen и вводит новое собственное пространство памяти с именем Metaspace .
2.3. Кэш-память
JVM резервирует область кэш-памяти для компиляции и хранения собственного кода, такого как внутренние структуры JVM и собственный код, созданный JIT-компилятором.
3. Хранение статических членов до Java 8
До Java 8 PermGen хранил статические члены , такие как статические методы и статические переменные. Кроме того, PermGen также хранит интернированные строки.
Другими словами, пространство PermGen хранит переменные и их технические значения, которые могут быть примитивами или ссылками.
4. Хранилище статических членов из Java 8 и выше
Как мы уже обсуждали, пространство PermGen заменено на Metaspace в Java 8 , что привело к изменению распределения памяти для статических элементов.
Начиная с Java 8, Metaspace хранит только метаданные класса, а память кучи хранит статические члены . Кроме того, куча памяти также обеспечивает хранение интернированных строк.
5. Вывод
В этой короткой статье мы рассмотрели хранилище JVM для статических членов.
Во-первых, мы быстро рассмотрели модель памяти JVM. Затем мы обсудили хранилище JVM для статических членов до и после Java 8.
Проще говоря, мы знаем, что статические члены были частью PermGen до Java 8 . Однако, начиная с Java 8, они являются частью динамической памяти .