通过 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)
重复集合并手动删除文件,同时删除集合中的名称。这样你就可以自己决定删除哪些文件了。
我有一些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)
重复集合并手动删除文件,同时删除集合中的名称。这样你就可以自己决定删除哪些文件了。