我有一些使用library code的File.deleteOnExit()
。由于这段代码在我的应用程序中被大量调用,因此内存不断堆积在DeleteOnExitHook
中。这会导致我的堆无限增长并最终导致OutOfMemoryErrors
。由于该类完全受到包保护,因此中间删除排队删除的文件似乎很简单。我可以用一些反思魔法将这个空列表清空吗?
答案 0 :(得分:1)
据我所知,你需要一个肮脏的黑客,所以这应该足够了。您需要恢复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)
迭代集合并手动删除文件,同时删除集合中的名称。这样您就可以决定自己删除哪些文件。