[Java] Освобождение памяти статического поля, выделен. в native-методе

nikola1956

Подскажите, пожалуйста, как можно в Java освободить память из-под статического поля какого-либо класса, которое является объектом, память для которого была выделена в нативном методе (реализованном на языке C/C++) ?
И вообще есть ли в Java некое подобие "колбэка", который Java-машина возвращает, когда освобождается память из-под статических полей "установленных" классов ?

SPARTAK3959

Память под статические поля выделяется при загрузке класса. Загрузкой класса всегда занимается java машина.
Память под java-объекты всегда выделяется java машиной.
Если поле хранит указатель на нативные данные, то и освобождать их надо соответствующими нативным методами. Если таких нет, то значит это сделать не возможно.

nikola1956

то и освобождать их надо соответствующими нативным методами. Если таких нет, то значит это сделать не возможно
Да, конечно, нативный метод, освобождающий память из-под объекта, есть, только хотелось бы вызвать его в тот момент, когда Java-машина начнет освобождать память из-под статических полей класса, а не тогда, когда сборщик мусора Java станет освобождать память из-под того или иного объекта этого класса, ибо желательно, чтобы статические поля класса оставались в памяти и не "перезагружались" даже тогда, когда ни одного объекта этого класса в данный момент в памяти нет.
В общем очень бы хотелось понять, как можно заполучить от Java-машины "колбэк" об освобождении памяти из-под статических полей класса, чтобы в нем вызвать нативный метод, освождающий память из-под нужного статического поля этого класса.

serega1604

ты статическое поле нейтивом в апп-сервере что-ли заполняешь, иначе какой смысл с этим возится?
я правильно понимаю, что ты хочешь аналог finalize, только для класса?

nikola1956

я правильно понимаю, что ты хочешь аналог finalize, только для класса?
Да, конечно :)
ты статическое поле нейтивом в апп-сервере что-ли заполняешь, иначе какой смысл с этим возится?
Нет-нет, я просто активно использую уже готовый сложный, эффективный, объемный и хорошо оптимизированный код на С++ в своем Java-приложении.

serega1604

>Нет-нет, я просто активно использую уже готовый сложный, эффективный, объемный и хорошо оптимизированный код на С++ в своем Java-приложении.
приложение серверное/десктопное?, работает 24/7 или запустят, поработают и выключат? запускается под аппсервером или standalone?
>Да, конечно :)
храни в статическом поле ссылку на синглтон, в синглтоне - нестатическое поле, полученное через native, в finalize синглтона - освобождай память.
ну или запускай с -Xnoclassgc, но это не всегда возможно.

katrin2201

Само статическое поле живет в ПермГене.
Память под него выделяется при загрузке класса.
Эта память становится мусором только если умирает класслоадер, который его загрузил. Подробнее тут.
Соответственно, чтобы это реализовать, надо будет как минимум подгружать твой класс в отдельном класслоадере. А колбэк вешать на файналайз класслоадера + умирание всех инстансов класса. Файналайз, кстати, плохой способ - PhantomReference лучше.
ЗЫ Чтобы мусор из пермгена был собран, нужен GC поддерживающий там сборку мусора. Например - Concurrent Mark-and-Sweep. Дефолтный афаир не собирает.

nikola1956

Соответственно, чтобы это реализовать, надо будет как минимум подгружать твой класс в отдельном класслоадере. А колбэк вешать на файналайз класслоадера + умирание всех инстансов класса. Файналайз, кстати, плохой способ - PhantomReference лучше.
Огромное спасибо ! Использование ClassLoader + PhantomReference — это как раз то, что я искал ! Начал потихоньку изучать материалы по работе с Java ClassLoader. Тема, оказывается, довольно-таки интересная :)

nikola1956

храни в статическом поле ссылку на синглтон, в синглтоне - нестатическое поле, полученное через native, в finalize синглтона - освобождай память.
Спасибо, постараюсь разобраться :)
Я, к сожалению, кроме MVC (Model-View-Controller других шаблонов проектирования на практике пока не использовал (или не отдавал себе отчета в том, что использовал :grin: ) .
Оставить комментарий
Имя или ник:
Комментарий: