Как реализовать гарантированное завершение поведения объекта - PullRequest
0 голосов
/ 20 декабря 2011

Я хочу реализовать поведение на объекте, аналогичное гарантированному finalize () в языке Java.Я хочу, чтобы некоторые операторы выполнялись непосредственно перед сборкой мусора .Обратите внимание, что блок finally здесь бесполезен, так как finally выполняется сразу после блока try, что не является моим требованием.По сути, я хочу сериализовать объект непосредственно перед его выгрузкой из кучи JVM.Пожалуйста, сообщите.

Ответы [ 3 ]

1 голос
/ 20 декабря 2011

Нет способа реализовать метод finalize(), который будет выполняться , независимо от того, что , потому что JVM не гарантирует его вызова. Например, объекты, оставленные в куче при выходе из программы, могут никогда не вызывать свой метод finalize(), в зависимости от текущей JVM.

Как правило, не рекомендуется использовать finalize() для освобождения любых ресурсов, кроме памяти, а тем более делать что-либо кроме освобождения ресурсов. Если вы хотите сериализовать свои объекты, попробуйте выбрать другой момент времени.

Есть хорошая статья , в которой обобщено почти все, что вам нужно знать о финализаторах.

0 голосов
/ 20 декабря 2011

Вы можете добавить ловушку в JVM при выключении; см http://docs.oracle.com/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29

Вместе с фантомами от @ user949300, которые кажутся работоспособными. Однако хук должен хранить слабые ссылки на все объекты. Если вы создаете интерфейс Java-сервиса для ловушки, вы можете использовать его в конструкторах объектов. Но уродливо, не правда ли?

0 голосов
/ 20 декабря 2011

Я никогда не использовал фантомную ссылку (звучит как один из плохих фильмов о «Звездных войнах»), но похоже, что он может сработать.

«Фантомные эталонные объекты, которые ставятся в очередь после того, как сборщик определит, чтов противном случае их ссылки могут быть возвращены. Фантомные ссылки чаще всего используются для планирования действий по предварительной очистке более гибким способом, чем это возможно с механизмом финализации Java."

...