Хук завершения работы - это путь, но имейте в виду, что нет никакой гарантии, что код действительно выполнен. Сбои JVM, сбои питания или простое «kill -9» в вашей JVM могут помешать очистке кода. Поэтому вы должны убедиться, что ваша программа остается в согласованном состоянии, даже если она была прервана внезапно.
Лично я просто использую базу данных для всех состояний хранения. Его модель транзакций гарантирует, что постоянное хранилище находится в нормальном состоянии независимо от того, что происходит. Они проводят годы, делая этот код безошибочным, так почему я должен тратить свое время на уже решенные проблемы.