Should I open the PR? I think we're all pretty much in agreement regarding the fix.

Cheers
Philippe

On 29.05.25 20:59, Laurence Cable wrote:
ignore this... apologies

On 5/29/25 11:51 AM, Laurence Cable wrote:
https://github.com/openjdk/jdk/pull/25526

On 5/29/25 11:05 AM, Kevin Walls wrote:
OK thanks Philippe, and Larry -

I can't provoke a problem as it stands but yes it would be good to take the recommendation of the API Note, that should keep us efficient. 8-)

I created a JBS issue: https://bugs.openjdk.org/browse/JDK-8358088

Thanks!
Kevin
------------------------------------------------------------------------
*From:* Philippe Marschall <kus...@gmx.net>
*Sent:* Thursday, May 29, 2025 5:47 PM
*To:* Kevin Walls <kevin.wa...@oracle.com>; serviceability- d...@openjdk.java.net <serviceability-...@openjdk.java.net> *Subject:* [External] : Re: VirtualMachineImpl.checkCatchesAndSendQuitTo leaks file handles



On 29.05.25 12:21, Kevin Walls wrote:
> Hi --
>
> Just to be clear, is this an actual persistent leak that we can observe, or is it that we could close earlier with try-with-resources? > I'm not seeing a leak when calling a line like this over and over in a tight loop:
>    final var cmdline = Files.lines(path).findFirst();

I believe it is persistent until the Cleaner of FileChannel closes it.
The #line Javadoc [1] mentions the need to close

 > This method must be used within a try-with-resources statement or
 > similar control structure to ensure that the stream's open file is
 > closed promptly after the stream's operations have completed.

The Stream class Javadoc [2] explicitly mentions #lines as well

 > Generally, only streams whose source is an IO channel, such as those
 > returned by Files.lines(Path), will require closing. If a stream does
 > require closing, it must be opened as a resource within a
 > try-with-resources statement or similar control structure to ensure
 > that it is closed promptly after its operations have completed.

If I run something like the code below I get
java.nio.file.FileSystemException: marker: Too many open files. You can
also lower the number, set a breakpoint at System.out.println and check
/proc/<pid>/fd


Path marker = Path.of("marker");
if (!Files.exists(marker)) {
   Files.writeString(marker, "line1");
}
// usually over the max fd limit
int fileCount = 100_000;
// prevent streams from being garbage collected and cleaner to run and
close fd
List<Stream<?>> streams = new ArrayList<>(fileCount);
for (int i = 0; i < fileCount; i++) {
   Stream<String> stream = Files.lines(marker);
   streams.add(stream);
   Optional<String> firstLine = stream.findFirst();
   if (firstLine.isPresent()) {
     if (firstLine.get().hashCode() == 42) {
       System.out.println('x');
     }
   }
}
System.out.println(streams.hashCode());

  [1]
https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/ nio/file/Files.html#lines(java.nio.file.Path)
  [2]
https://docs.oracle.com/en/java/javase/24/docs/api/java.base/java/ util/stream/Stream.html

Regards
Philippe



Reply via email to