Могут ли загрузчики классов или классы быть мертвыми в JVM? - PullRequest
0 голосов
/ 23 января 2020

Может ли загрузчик классов или класс быть мертвым в JVM? Я читал блог Oracle - Сборка мусора и метасоль . Автор написал, что сборщик мусора вызывается в метапространстве, когда максимальный размер достигается в результате мертвых загрузчиков классов и классов, сборщиков мусора

Я хотел понять, что объекты становятся недоступными, то же самое можно применять к загрузчикам классов и классам. ? Если да, то как.

1 Ответ

4 голосов
/ 23 января 2020

Я хотел понять, что объекты становятся недоступными. Может ли это быть применимо и к загрузчикам классов и классам?

Да, загрузчики классов и классы могут стать недоступными при определенных обстоятельствах.

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

  • Существует множество путей достижимости, включая

    • из класса в родительский загрузчик классов
    • из загрузчика классов в каждый загруженный класс
    • из класса в каждый класс, который зависит от
    • от каждого объекта до его класса и
    • от каждого вызова метода в стеке потока до класса, который определяет метод.

Короче говоря, если приложение может найти или использовать (загруженный) класс или загрузчик классов, это достижимо. В противном случае он нам недоступен.

Если да, то как.

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

(За исключением того, что его труднее достичь, поскольку многие пути достижимости находятся за кулисами, а код приложения не может их напрямую сломать. Отсюда и проблема в приложениях, которые широко используют динамической c загрузки классов, динамических c прокси и т. п. может страдать от утечек метапространства.)

...