8193072: File.delete() should remove its path from DeleteOnExitHook.files
Ivan Gerasimov
ivan.gerasimov at oracle.com
Mon Jul 8 20:35:35 UTC 2019
Hi Brian!
I believe this would introduce a behavior change in a scenario lile:
File f = ...;
f.deleteOnExit();
f.delete();
f.createNewFile();
I.e. when the with the same name is recreated. Current behavior is to
unlink such a file before exiting, no matter if it were explicitly
deleted and then recreated or not.
With kind regards,
Ivan
On 7/8/19 1:11 PM, Brian Burkhalter wrote:
> https://bugs.openjdk.java.net/browse/JDK-8193072 <https://bugs.openjdk.java.net/browse/JDK-8193072>
>
> There does appear to be a memory leak of sorts if one does something like
>
> —
>
> File[] files;
> for (int i = 0; i < largeNumber; i++) {
> files[i] = File.createTempFile(“blah”, null);
> files[i].deleteOnExit();
> }
>
> // do something
>
> for (int i = 0; i < largeNumber; i++) {
> files[i].delete();
> }
>
> // do something else before shutdown
>
> —
>
> The LinkedHashSet in DeleteOnExitHook will contain at least largeNumber Files until the VM shuts down even though the files were deleted.
>
> The potential change is included below. The additional call to DeleteOnExitHook.remove() in File.delete() does not appear to have a measurable performance impact, at least trivially and in isolation.
>
> Thanks,
>
> Brian
>
> --- a/src/java.base/share/classes/java/io/DeleteOnExitHook.java
> +++ b/src/java.base/share/classes/java/io/DeleteOnExitHook.java
> @@ -64,6 +64,15 @@
> files.add(file);
> }
>
> + static synchronized void remove(String file) {
> + if(files == null) {
> + // DeleteOnExitHook is running. Too late to remove a file
> + throw new IllegalStateException("Shutdown in progress");
> + }
> +
> + files.remove(file);
> + }
> +
> static void runHooks() {
> LinkedHashSet<String> theFiles;
>
> --- a/src/java.base/share/classes/java/io/File.java
> +++ b/src/java.base/share/classes/java/io/File.java
> @@ -1050,6 +1050,7 @@
> if (isInvalid()) {
> return false;
> }
> + DeleteOnExitHook.remove(path);
> return fs.delete(this);
> }
>
>
--
With kind regards,
Ivan Gerasimov
More information about the core-libs-dev
mailing list