通过 File.deleteOnExit 清理排队等待删除的文件

Clean files queued for deletion through File.deleteOnExit

我有一些library code that uses File.deleteOnExit(). As this piece of code is called a lot in my application, memory keeps piling up in DeleteOnExitHook。这导致我的堆无限增长并最终导致 OutOfMemoryErrors。由于 class 完全受包保护,因此中间删除排队等待删除的文件的机制似乎很简单。我可以用一些反射魔法来清空这个列表吗?

据我了解,您需要一个肮脏的 hack,所以这就足够了。您需要恢复 files 字段值,以便正常关机(或下次使用此 hack 时)正常工作。

注意:将删除所有内容,包括其他图书馆安排的文件。请务必检查您的情况是否安全。

    java.lang.reflect.Method  run   = Class.forName ("java.io.DeleteOnExitHook").getDeclaredMethod ("runHooks");
    java.lang.reflect.Field   files = Class.forName ("java.io.DeleteOnExitHook").getDeclaredField  ("files");

    run.setAccessible (true);
    files.setAccessible (true);

    run.invoke (null);
    files.set (null, new java.util.LinkedHashSet <String> ());

或者,只需使用

检索预定的文件
    files.get (null)

重复集合并手动删除文件,同时删除集合中的名称。这样你就可以自己决定删除哪些文件了。