[External] : Re: VirtualMachineImpl.checkCatchesAndSendQuitTo leaks file handles
Laurence Cable
larry.cable at oracle.com
Fri May 30 15:02:52 UTC 2025
Ive already done it...
On 5/30/25 4:58 AM, Philippe Marschall wrote:
> 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 <kustos at gmx.net>
>>>> *Sent:* Thursday, May 29, 2025 5:47 PM
>>>> *To:* Kevin Walls <kevin.walls at oracle.com>; serviceability-
>>>> dev at openjdk.java.net <serviceability-dev at 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
>>>
>>
>
More information about the serviceability-dev
mailing list