我有一些library code使用 File.deleteOnExit()
。由于这段代码在我的应用程序中被多次调用,内存不断堆积在 DeleteOnExitHook
中。 。这会导致我的堆无限增长并最终导致 OutOfMemoryErrors
。由于该类完全受到包保护,因此似乎有一种简单的机制可以中间删除排队等待删除的文件。我可以用一些反射魔法把这个列表清空吗?
最佳答案
据我所知,你需要一个肮脏的黑客,所以这应该足够了。您需要恢复 files
字段值,以便正常关闭(或下次使用此黑客时)正常工作。
注意:将删除所有内容,包括其他库安排的文件。请务必检查它在您的情况下是否安全。
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)
迭代集合并手动删除文件,同时从集合中删除名称。这样您就可以决定自己删除哪些文件。
关于java - 通过 File.deleteOnExit 清理排队等待删除的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47792708/