Перейти к основному содержимому

Хранилище JVM для статических членов

· 3 мин. чтения

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, они являются частью динамической памяти .