Это просто дополнение к предыдущему ответу, которое является полностью правильным.
JDK 1.7 жалуется на использование sun.misc.Cleaner
, говоря, что классы в этом пространстве имен не являются формальной частью JDK,и может исчезнуть в будущем.Тем не менее, по состоянию на 1.7 они все еще присутствуют.
Если метод .clean()
недоступен, тогда использование System.gc()
может использоваться как запасной метод, однако это должно быть признано "взломом" ипоэтому необходимо соблюдать осторожность.
Хотя System.gc()
не может заставить закрытое отображение, на которое нет ссылок, на практике это часто приводит к очистке.Опыт работы с 32-битным Linux (и Solaris) показывает, что буферы освобождаются во время каждого теста во время первого или второго вызова System.gc()
.Тем не менее, поведение в Windows отличается.В большинстве случаев все сопоставления освобождаются к концу второго вызова на System.gc()
, но иногда для этого требуется 3 вызова.Есть все еще случаи, когда требуется больше вызовов, с требованием уменьшения количества вызовов по частоте.Это может быть обманчивым, поскольку тесты могут указывать на то, что 4 вызова - это все, что требуется, только для того, чтобы он не прошел через месяц.Тогда 5 вызовов могут казаться адекватными, что может привести к сбою в течение 6 месяцев.
Тестирование на предмет выпуска карты может быть выполнено с помощью блока try/catch
вокруг FileChannel.truncate()
с циклом дляповторите попытку в случае неудачи.Цикл не может быть бесконечным, поскольку существуют патологические случаи, когда конкретная конфигурация кучи приводит к тому, что сборщик мусора никогда не очищает отображение.Тем не менее, цикл около 10 будет охватывать почти все случаи.Если к этому моменту объект не исчез, то он никуда не денется, и приложение должно будет сдаться.Это может показаться неадекватным, но на практике это крайне маловероятно и будет проблемой только для JVM, которая не поддерживает очистители.