когда вызывается finalize при развертывании на tomcat - PullRequest
0 голосов
/ 23 июня 2011

Я создал простой класс Java следующим образом:

Я передаю содержимое в виде байтового массива и имени файла, и класс создает где-то TempFile.

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;

public class TempFile {

private byte[] content;
private File file;
private String fileName;

public TempFile(byte[] content, String fileName) 
        throws IOException {
    this.content = content;
this.fileName = fileName;
file = createTempFile();
}

private File createTempFile() 
        throws IOException {
    String tmpDir = System.getProperty("java.io.tmpdir");
    if(!tmpDir.endsWith("/") || !tmpDir.endsWith("\\"))
        tmpDir += "/";
    File tmpfile = new File(tmpDir + createUniqueName());
    while(tmpfile.exists())
        tmpfile = new File(tmpDir + createUniqueName());
    tmpfile.createNewFile();
    FileUtils.writeByteArrayToFile(tmpfile, content);
    return tmpfile;
}

@Override
protected void finalize() throws Throwable {
    try {
        if(file.exists() && file.canRead() && file.canWrite())
            file.delete();
    } catch(Throwable t) {
        t.printStackTrace();
    } finally {
        super.finalize();
    }
}

}

Я думал, что если бы я реализовал очистку в методе finalize, то временные файлы будут автоматически удалены, когда GC избавится от объекта.

Я попытался отладить это, но, похоже, метод finalizeне называется.

В чем причина?Может ли это быть потому, что я развертываю этот сервер Tomcat?

Приветствия

Ответы [ 2 ]

4 голосов
/ 23 июня 2011

Полагаться на finalize для очистки ресурсов - плохая идея. Вы (обычно) не можете контролировать, когда происходит сборка мусора и когда вызывается finalize. Фактически, JVM даже не гарантирует, что finalize когда-либо будет вызван, поэтому, если по какой-то причине это не так, ваши ресурсы вообще не будут очищены.

1 голос
/ 23 июня 2011

Не полагайтесь на финализатор (это один из элементов в эффективной Java).Вызвать очистку вручную.

...