<html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"></head><body style="overflow-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;">This isn’t an area of the code that I’m familiar with. Searching for updateCachedBounds in the bug database shows that there’s some history here so maybe someone with more experience can chime in.<br id="lineBreakAtBeginningOfMessage"><div><br><blockquote type="cite"><div>On Mar 28, 2025, at 11:06 AM, Christopher Schnick <crschnick@xpipe.io> wrote:</div><br class="Apple-interchange-newline"><div>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<div><p>So I tried various different things to reproduce it without the
StackOverflow, but no success so far. But I can definitely tell
you from many user issue reports that this issue frequently
happens. Looking at the logs when this happens, there were no
other exceptions reported when this happens.</p><p>It however doesn't leave the node in a bad state in most cases,
in production this exception usually only occurs once without the
same exception happening in later pulses. Having a loop of pulse
exceptions that happened with the JVM crash is rarer. It breaks
the layout however, so a restart is required.</p><p>I would already be happy with a simple index check to not throw
an OOB exception in the implementation, I don't think there's any
harm in that. While the StackOverflow is a very made-up case, I
think even for that it would be good if it wouldn't throw
exceptions in later pulses if you're looking for a justification
on why to implement an index check.<br>
</p>
<div class="moz-cite-prefix">On 28/03/2025 17:26, Martin Fox wrote:<br>
</div>
<blockquote type="cite" cite="mid:9F065E4B-F67A-40E2-9D3D-CAF9225CE191@gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<div>I’ve been able to reproduce this inside a debugger on my Mac
every eighth try or so.</div>
<div><br>
</div>
<div>I’m not sure what I’m seeing is all that helpful. Your
reproducing case is inducing a stack overflow exception. If the
exception occurs while Parent.updateCachedBounds is executing
the StackPane will be left in a bad state. This leads to the
dirtyChildrenCount exceeding the number of children and then
Parent.updateCachedBounds will start throwing the same AIOOBE on
every layout pulse.</div>
<div><br>
</div>
<div>At least in my debug runs it’s all about the timing of the
stack overflow. That probably doesn’t explain why your
production app is getting into the same bad state.</div>
<div><br>
</div>
<div>And you’re right, this has nothing to do with the Alert. I
was confused by the gap between when the exception occurs and
when it’s reported.</div>
<div><br>
</div>
<div>Martin</div>
<div><br>
<blockquote type="cite">
<div>On Mar 26, 2025, at 9:20 PM, Christopher Schnick
<a class="moz-txt-link-rfc2396E" href="mailto:crschnick@xpipe.io"><crschnick@xpipe.io></a> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<div><p>Interesting, that exception does not happen on my macOS
15.3 system. The reproducer somehow also doesn't seem to
trigger the IndexOutOfBoundsExceptions on macOS for me,
only on Windows so far. On Windows, the large alert is
shown as a broken stage with no content and controls for
me, which I guess is slightly better than an exception,
but also not ideal. So it seems like the reproducer
behavior depends a lot on the specific system.<br>
</p>
<div class="moz-cite-prefix">On 26/03/2025 19:35, Martin
Fox wrote:<br>
</div>
<blockquote type="cite" cite="mid:6532F614-D25B-4C55-9519-4DE1CD8629E0@gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
Christopher,
<div><br>
</div>
<div>Yes, there might be more than one issue here. On
the Mac the call to Stage.showAndWait is making its
way into the Mac glass code where an exception is
being thrown leading to another call to
Stage.showAndWait. I’ve attached the repeating block
below. I don’t see that pattern in the Windows stack
trace you provided.</div>
<div><br>
</div>
<div>Martin</div>
<div><br>
</div>
<div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
ParentBoundsBug.lambda$start$0(ParentBoundsBug.java:25)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
java.base/java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:663)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
java.base/java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:658)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/com.sun.glass.ui.Application.reportException" moz-do-not-send="true">javafx.graphics@25-internal/com.sun.glass.ui.Application.reportException</a>(Application.java:452)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/com.sun.glass.ui.mac.MacWindow._setBounds2" moz-do-not-send="true">javafx.graphics@25-internal/com.sun.glass.ui.mac.MacWindow._setBounds2</a>(Native
Method)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/com.sun.glass.ui.mac.MacWindow._setBounds" moz-do-not-send="true">javafx.graphics@25-internal/com.sun.glass.ui.mac.MacWindow._setBounds</a>(MacWindow.java:70)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/com.sun.glass.ui.Window.setBounds" moz-do-not-send="true">javafx.graphics@25-internal/com.sun.glass.ui.Window.setBounds</a>(Window.java:589)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/com.sun.javafx.tk.quantum.WindowStage.setBounds" moz-do-not-send="true">javafx.graphics@25-internal/com.sun.javafx.tk.quantum.WindowStage.setBounds</a>(WindowStage.java:304)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Window$TKBoundsConfigurator.apply" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Window$TKBoundsConfigurator.apply</a>(Window.java:1566)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Window.applyBounds" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Window.applyBounds</a>(Window.java:1424)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Window.adjustSize" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Window.adjustSize</a>(Window.java:327)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Window.sizeToScene" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Window.sizeToScene</a>(Window.java:284)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Window$12.invalidated" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Window$12.invalidated</a>(Window.java:1215)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.base@25-internal/javafx.beans.property.BooleanPropertyBase.markInvalid" moz-do-not-send="true">javafx.base@25-internal/javafx.beans.property.BooleanPropertyBase.markInvalid</a>(BooleanPropertyBase.java:110)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.base@25-internal/javafx.beans.property.BooleanPropertyBase.set" moz-do-not-send="true">javafx.base@25-internal/javafx.beans.property.BooleanPropertyBase.set</a>(BooleanPropertyBase.java:145)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Window.setShowing" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Window.setShowing</a>(Window.java:1235)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Window.show" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Window.show</a>(Window.java:1250)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Stage.show" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Stage.show</a>(Stage.java:272)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.graphics@25-internal/javafx.stage.Stage.showAndWait" moz-do-not-send="true">javafx.graphics@25-internal/javafx.stage.Stage.showAndWait</a>(Stage.java:427)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.controls@25-internal/javafx.scene.control.HeavyweightDialog.showAndWait" moz-do-not-send="true">javafx.controls@25-internal/javafx.scene.control.HeavyweightDialog.showAndWait</a>(HeavyweightDialog.java:162)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
<a class="moz-txt-link-abbreviated moz-txt-link-freetext" href="mailto:javafx.controls@25-internal/javafx.scene.control.Dialog.showAndWait" moz-do-not-send="true">javafx.controls@25-internal/javafx.scene.control.Dialog.showAndWait</a>(Dialog.java:347)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
ParentBoundsBug.lambda$start$0(ParentBoundsBug.java:25)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
java.base/java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:663)</div>
<div><span class="Apple-tab-span" style="white-space:pre"> </span>at
java.base/java.lang.ThreadGroup.uncaughtException(ThreadGroup.java:658)</div>
</div>
<div><br>
</div>
<div>
<div>
<blockquote type="cite">
<div>On Mar 26, 2025, at 10:49 AM, Christopher
Schnick <a class="moz-txt-link-rfc2396E" href="mailto:crschnick@xpipe.io" moz-do-not-send="true"><crschnick@xpipe.io></a>
wrote:</div>
<br class="Apple-interchange-newline">
<div>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<div><p>Hey Martin,<br>
<br>
thank you for looking into this. The initial
StackOverflow is a result of me forcing to
reproduce the bounds
IndexOutOfBoundsException. The StackOverflow
can be ignored, it was merely the best
method I found to transition the scene graph
into a state where the
IndexOutOfBoundsExceptions are thrown. The
OOBs are not thrown in every run though, it
sometimes takes a few tries. In our
production application, the same
IndexOutOfBoundsExceptions also occur
randomly without a previous exception. You
can probably also reproduce the
IndexOutOfBoundsExceptions without the
StackOverflow, but reproducing it was very
fragile, so I didn't look into it more.<br>
<br>
I don't think it has necessarily something
to do with the alert bounds as the
IndexOutOfBoundsException is also thrown if
you don't show an alert at all. The constant
IndexOutOfBoundsExceptions in combination
with the alert showAndWait was how our
application entered the original crashing
state. So the reproducer is more like a
two-in-one.<br>
<br>
Best<br>
Christopher Schnick<br>
</p>
<div class="moz-cite-prefix">On 26/03/2025
18:33, Martin Fox wrote:<br>
</div>
<blockquote type="cite" cite="mid:9560C9BE-BC2F-4F0D-B914-425969699179@gmail.com">
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
Yes, thank you Christopher for providing a
reproducible test case!
<div><br>
</div>
<div>I was able to trigger the problem on my
Mac on the first try. Since I’m using a
modified version of JavaFX the system
didn’t crash but instead hit a Java stack
overflow error and produced a very long
stack trace.</div>
<div><br>
</div>
<div>At least on the Mac the problem seems
to be that you’re trying to pop an Alert
containing a long stack trace. While
trying to adjust the Alert’s bounds JavaFX
is throwing another exception but I’m not
sure why. I’ll continue to look into it.</div>
<div><br>
</div>
<div>Thanks again,</div>
<div>Martin</div>
<div>
<div>
<div><br>
<blockquote type="cite">
<div>On Mar 25, 2025, at 12:16 PM,
Andy Goryachev <a class="moz-txt-link-rfc2396E" href="mailto:andy.goryachev@oracle.com" moz-do-not-send="true"><andy.goryachev@oracle.com></a>
wrote:</div>
<br class="Apple-interchange-newline">
<div>
<meta charset="UTF-8">
<div class="WordSection1" style="page: WordSection1; caret-color: rgb(0, 0, 0); font-family: Optima-Regular; font-size: 14px; font-style: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration: none;">
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">Thank
you, Christopher, for
clarification!<o:p></o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"><o:p> </o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">Personally,
I would consider this to be
a problem with the
application design: the code
should limit the number of
alerts shown to the user.
Do you really want the user
to click through hundreds of
alerts?<o:p></o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"><o:p> </o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">Nevertheless,
you are right about the need
for the platform to
gracefully handle the case
of too many nested event
loops - by throwing an
exception with a meaningful
message, as Martin proposed
in<span class="Apple-converted-space"> </span><a href="https://github.com/openjdk/jfx/pull/1741" style="color: blue; text-decoration: underline;" moz-do-not-send="true" class="moz-txt-link-freetext">https://github.com/openjdk/jfx/pull/1741</a><o:p></o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"><o:p> </o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">Cheers,<o:p></o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">-andy<o:p></o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"><o:p> </o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"><o:p> </o:p></span></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"><o:p> </o:p></span></div>
<div id="mail-editor-reference-message-container">
<div>
<div>
<div style="border-width: 1pt medium medium; border-style: solid none none; border-color: rgb(181, 196, 223) currentcolor currentcolor; border-image: none; padding: 3pt 0in 0in;"><p class="MsoNormal" style="margin: 0in 0in 12pt; font-size: 10pt; font-family: Aptos, sans-serif;"><b><span style="font-size: 12pt;">From:<span class="Apple-converted-space"> </span></span></b><span style="font-size: 12pt;">Christopher Schnick <a class="moz-txt-link-rfc2396E" href="mailto:crschnick@xpipe.io" moz-do-not-send="true"><crschnick@xpipe.io></a><br>
<b>Date:<span class="Apple-converted-space"> </span></b>Tuesday, March 25, 2025 at
11:52<br>
<b>To:<span class="Apple-converted-space"> </span></b>Andy Goryachev <a class="moz-txt-link-rfc2396E" href="mailto:andy.goryachev@oracle.com" moz-do-not-send="true"><andy.goryachev@oracle.com></a><br>
<b>Cc:<span class="Apple-converted-space"> </span></b>OpenJFX <a class="moz-txt-link-rfc2396E" href="mailto:openjfx-dev@openjdk.org" moz-do-not-send="true"><openjfx-dev@openjdk.org></a><br>
<b>Subject:<span class="Apple-converted-space"> </span></b>Re: [External] : Re: JVM
crashes on macOS
when entering too
many nested event
loops<o:p></o:p></span></p>
</div><p>Hey Andy,<br>
<br>
so I think I was able to
reproduce this issue for
our application.<br>
<br>
There are two main
factors how this can
happen:<br>
- We use an alert-based
error reporter, meaning
that we have a default
uncaught exception
handler set for all
threads which will
showAndWait an Alert
with the exception
message<br>
- As I reported
yesterday with<span class="Apple-converted-space"> </span><a href="https://mail.openjdk.org/pipermail/openjfx-dev/2025-March/052963.html" style="color: blue; text-decoration: underline;" moz-do-not-send="true" class="moz-txt-link-freetext">https://mail.openjdk.org/pipermail/openjfx-dev/2025-March/052963.html</a>,
there are some rare
exceptions that can
occur in a normal event
loop without
interference of the
application, probably
because of a small bug
in the bounds
calculation code<br>
<br>
If you combine these two
factors, you will end up
with an infinite loop of
the showAndWait entering
a nested event loop, the
event loop throwing an
internal exception, and
the uncaught exception
handler starting the
same loop with another
alert. I don't think
this is a bad
implementation from our
side, the only thing
that we can improve is
to maybe check how deep
the uncaught exception
loop is in to prevent
this from occurring
indefinitely. But I
would argue this can
happen to any
application. Here is a
sample code, based on
the reproducer from the
OutOfBounds report from
yesterday:<o:p></o:p></p>
<div>
<pre style="margin: 0in; font-size: 8pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.application.Application;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.application.Platform;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.scene.Scene;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.scene.control.Alert;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.scene.control.Button;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.scene.layout.Region;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.scene.layout.StackPane;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.scene.layout.VBox;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">javafx.stage.Stage;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">java.io.IOException;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">import </span><span style="color: rgb(188, 190, 196);">java.util.Arrays;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(207, 142, 109);">public class </span><span style="color: rgb(188, 190, 196);">ParentBoundsBug </span><span style="color: rgb(207, 142, 109);">extends </span><span style="color: rgb(188, 190, 196);">Application {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(179, 174, 96);">@Override<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(179, 174, 96);"> </span><span style="color: rgb(207, 142, 109);">public void </span><span style="color: rgb(86, 168, 245);">start</span><span style="color: rgb(188, 190, 196);">(Stage stage) </span><span style="color: rgb(207, 142, 109);">throws </span><span style="color: rgb(188, 190, 196);">IOException {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> Thread.<i>setDefaultUncaughtExceptionHandler</i>((thread, throwable) -> {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> throwable.printStackTrace();<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">if </span><span style="color: rgb(188, 190, 196);">(Platform.<i>isFxApplicationThread</i>()) {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">var </span><span style="color: rgb(188, 190, 196);">alert = </span><span style="color: rgb(207, 142, 109);">new </span><span style="color: rgb(188, 190, 196);">Alert(Alert.AlertType.</span><i><span style="color: rgb(199, 125, 187);">ERROR</span></i><span style="color: rgb(188, 190, 196);">);<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> alert.setHeaderText(throwable.getMessage());<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> alert.setContentText(Arrays.<i>toString</i>(throwable.getStackTrace()));<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> alert.showAndWait();<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> } </span><span style="color: rgb(207, 142, 109);">else </span><span style="color: rgb(188, 190, 196);">{<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(122, 126, 133);">// Do some other error handling for non-platform threads<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(122, 126, 133);"> // Probably just show the alert with a runLater()<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(122, 126, 133);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(122, 126, 133);"> // For this example, there are no exceptions outside the platform thread<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(122, 126, 133);"> </span><span style="color: rgb(188, 190, 196);">}<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> });<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(122, 126, 133);">// Run delayed as Application::reportException will only be called for exceptions<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(122, 126, 133);"> // after the application has started<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(122, 126, 133);"> </span><span style="color: rgb(188, 190, 196);">Platform.<i>runLater</i>(() -> {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> Scene scene = </span><span style="color: rgb(207, 142, 109);">new </span><span style="color: rgb(188, 190, 196);">Scene(createContent(), </span><span style="color: rgb(42, 172, 184);">640</span><span style="color: rgb(188, 190, 196);">, </span><span style="color: rgb(42, 172, 184);">480</span><span style="color: rgb(188, 190, 196);">);<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(199, 125, 187);">stage</span><span style="color: rgb(188, 190, 196);">.setScene(scene);<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(199, 125, 187);">stage</span><span style="color: rgb(188, 190, 196);">.show();<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(199, 125, 187);">stage</span><span style="color: rgb(188, 190, 196);">.centerOnScreen();<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> });<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> }<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">private </span><span style="color: rgb(188, 190, 196);">Region </span><span style="color: rgb(86, 168, 245);">createContent</span><span style="color: rgb(188, 190, 196);">() {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">var </span><span style="color: rgb(188, 190, 196);">b1 = </span><span style="color: rgb(207, 142, 109);">new </span><span style="color: rgb(188, 190, 196);">Button(</span><span style="color: rgb(106, 171, 115);">"Click me!"</span><span style="color: rgb(188, 190, 196);">);<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">var </span><span style="color: rgb(188, 190, 196);">b2 = </span><span style="color: rgb(207, 142, 109);">new </span><span style="color: rgb(188, 190, 196);">Button(</span><span style="color: rgb(106, 171, 115);">"Click me!"</span><span style="color: rgb(188, 190, 196);">);<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">var </span><span style="color: rgb(188, 190, 196);">vbox = </span><span style="color: rgb(207, 142, 109);">new </span><span style="color: rgb(188, 190, 196);">VBox(b1, b2);<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> b1.boundsInParentProperty().addListener((observable, oldValue, newValue) -> {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(199, 125, 187);">vbox</span><span style="color: rgb(188, 190, 196);">.setVisible(!</span><span style="color: rgb(199, 125, 187);">vbox</span><span style="color: rgb(188, 190, 196);">.isVisible());<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> });<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> b2.boundsInParentProperty().addListener((observable, oldValue, newValue) -> {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(199, 125, 187);">vbox</span><span style="color: rgb(188, 190, 196);">.setVisible(!</span><span style="color: rgb(199, 125, 187);">vbox</span><span style="color: rgb(188, 190, 196);">.isVisible());<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> });<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> vbox.boundsInParentProperty().addListener((observable, oldValue, newValue) -> {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(199, 125, 187);">vbox</span><span style="color: rgb(188, 190, 196);">.setVisible(!</span><span style="color: rgb(199, 125, 187);">vbox</span><span style="color: rgb(188, 190, 196);">.isVisible());<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> });<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">var </span><span style="color: rgb(188, 190, 196);">stack = </span><span style="color: rgb(207, 142, 109);">new </span><span style="color: rgb(188, 190, 196);">StackPane(vbox, </span><span style="color: rgb(207, 142, 109);">new </span><span style="color: rgb(188, 190, 196);">StackPane());<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> stack.boundsInParentProperty().addListener((observable, oldValue, newValue) -> {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(199, 125, 187);">vbox</span><span style="color: rgb(188, 190, 196);">.setVisible(!</span><span style="color: rgb(199, 125, 187);">vbox</span><span style="color: rgb(188, 190, 196);">.isVisible());<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> });<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">return </span><span style="color: rgb(188, 190, 196);">stack;<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> }<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"><o:p> </o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> </span><span style="color: rgb(207, 142, 109);">public static void </span><span style="color: rgb(86, 168, 245);">main</span><span style="color: rgb(188, 190, 196);">(String[] args) {<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> <i>launch</i>();<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);"> }<o:p></o:p></span></pre>
<pre style="margin: 0in; font-size: 10pt; font-family: "Courier New"; background: rgb(30, 31, 34);"><span style="color: rgb(188, 190, 196);">}<o:p></o:p></span></pre>
</div><p><br>
If the same OutOfBounds
exception from the
reported I linked
happens in the bounds
calculation, which
happens approximately
1/5 runs for me, this
application will enter
new event loops until it
crashes. If the
OutOfBounds doesn't
trigger, it will just
throw a StackOverflow
but won't continue the
infinite loop of nested
event loops. So for the
reproducer it is
important to try a few
times until you get the
described OutOfBounds.<o:p></o:p></p><p>I attached the
stacktrace of how this
fails. The initial
StackOverflow causes
infinitely many
following exceptions in
the nested event loop.<o:p></o:p></p><p>Best<br>
Christopher Schnick<o:p></o:p></p>
<div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 12pt;">On 25/03/2025 18:28, Andy Goryachev wrote:<o:p></o:p></span></div>
</div>
<blockquote style="margin-top: 5pt; margin-bottom: 5pt;">
<div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">Dear
Christopher:</span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">Were
you able to root
cause why your
application enters
that many nested
event loops?</span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">I
believe a
well-behaved
application should
never experience
that, unless there
is some design
flaw or a bug.</span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">-andy</span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div id="mail-editor-reference-message-container">
<div>
<div>
<div style="border-width: 1pt medium medium; border-style: solid none none; border-color: rgb(181, 196, 223) currentcolor currentcolor; border-image: none; padding: 3pt 0in 0in;"><p class="MsoNormal" style="margin: 0in 0in 12pt; font-size: 10pt; font-family: Aptos, sans-serif;"><b><span style="font-size: 12pt;">From:<span class="Apple-converted-space"> </span></span></b><span style="font-size: 12pt;">Christopher Schnick<span class="Apple-converted-space"> </span><a href="mailto:crschnick@xpipe.io" style="color: blue; text-decoration: underline;" moz-do-not-send="true"><crschnick@xpipe.io></a><br>
<b>Date:<span class="Apple-converted-space"> </span></b>Monday, March 10, 2025 at
19:45<br>
<b>To:<span class="Apple-converted-space"> </span></b>Andy Goryachev<span class="Apple-converted-space"> </span><a href="mailto:andy.goryachev@oracle.com" style="color: blue; text-decoration: underline;" moz-do-not-send="true"><andy.goryachev@oracle.com></a><br>
<b>Subject:<span class="Apple-converted-space"> </span></b>[External] : Re: JVM crashes
on macOS when
entering too
many nested
event loops</span><o:p></o:p></p>
</div><p>Our code and
some libraries
do enter some
nested event
loops at a few
places when it
makes sense,
but we didn't
do anything to
explicitly
provoke this,
this occurred
naturally in
our
application.
So it would be
nice if JavaFX
could somehow
guard against
this,
especially
since crashing
the JVM is
probably the
worst thing
that can
happen.<br>
<br>
I looked at
the
documentation,
but it seems
like the
public API at
Platform::enterNestedEventLoop does not mention this.<br>
From my
understanding,
the method
Platform::canStartNestedEventLoop
is potentially
the right
method to
indicate to
the caller
that the limit
is close by
returning
false.<br>
And even if
something like
an exception
is thrown when
a nested event
loop is
started while
it is close to
the limit,
that would
still be much
better than a
direct crash.<br>
<br>
Best<br>
Christopher
Schnick<o:p></o:p></p>
<div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 12pt;">On 10/03/2025 18:51, Andy Goryachev wrote:</span><o:p></o:p></div>
</div>
<blockquote style="margin-top: 5pt; margin-bottom: 5pt;">
<div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">This
looks to me
like it might
be hitting the
(native)
thread stack
size limit.</span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">c.s.glass.ui.Application::enterNestedEventLoop()
even warns
about it:</span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; background: white;"><span style="font-family: "Iosevka Fixed SS16"; color: rgb(255, 38, 0);">
* An
application
may enter
several nested
loops
recursively.
There's no</span><o:p></o:p></div>
<div style="margin: 0in; background: white;"><span style="font-family: "Iosevka Fixed SS16"; color: rgb(255, 38, 0);">
* limit of
recursion
other than
that imposed
by the native
stack size.</span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";">-andy</span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div style="margin: 0in; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt; font-family: "Iosevka Fixed SS16";"> </span><o:p></o:p></div>
<div id="mail-editor-reference-message-container">
<div>
<div>
<div style="border-width: 1pt medium medium; border-style: solid none none; border-color: rgb(181, 196, 223) currentcolor currentcolor; border-image: none; padding: 3pt 0in 0in;"><p class="MsoNormal" style="margin: 0in 0in 12pt; font-size: 10pt; font-family: Aptos, sans-serif;"><b><span style="font-size: 12pt;">From:<span class="Apple-converted-space"> </span></span></b><span style="font-size: 12pt;">openjfx-dev<span class="Apple-converted-space"> </span><a href="mailto:openjfx-dev-retn@openjdk.org" style="color: blue; text-decoration: underline;" moz-do-not-send="true"><openjfx-dev-retn@openjdk.org></a><span class="Apple-converted-space"> </span>on behalf of Martin Fox<span class="Apple-converted-space"> </span><a href="mailto:martinfox656@gmail.com" style="color: blue; text-decoration: underline;" moz-do-not-send="true"><martinfox656@gmail.com></a><br>
<b>Date:<span class="Apple-converted-space"> </span></b>Monday, March 10, 2025 at
10:10<br>
<b>To:<span class="Apple-converted-space"> </span></b>Christopher Schnick<span class="Apple-converted-space"> </span><a href="mailto:crschnick@xpipe.io" style="color: blue; text-decoration: underline;" moz-do-not-send="true"><crschnick@xpipe.io></a><br>
<b>Cc:<span class="Apple-converted-space"> </span></b>OpenJFX<span class="Apple-converted-space"> </span><a href="mailto:openjfx-dev@openjdk.org" style="color: blue; text-decoration: underline;" moz-do-not-send="true"><openjfx-dev@openjdk.org></a><br>
<b>Subject:<span class="Apple-converted-space"> </span></b>Re: JVM crashes on macOS when
entering too
many nested
event loops</span><o:p></o:p></p>
</div>
<div><p class="MsoNormal" style="margin: 0in 0in 12pt; font-size: 10pt; font-family: Aptos, sans-serif;"><span style="font-size: 11pt;">Hi Christopher,<br>
<br>
I was able to
reproduce this
crash. I wrote
a small
routine that
recursively
calls itself
in a runLater
block and then
enters a
nested event
loop. The
program
crashes when
creating loop
254. I’m not
sure where
that limit
comes from so
it’s possible
that consuming
some other
system
resource could
lower it. I
couldn’t see
any good way
to determine
how many loops
are active by
looking at the
crash report
since it
doesn’t show
the entire
call stack.<br>
I did a quick
trial on Linux
and was able
to create a
lot more loops
(over 600) but
then started
seeing erratic
behavior and
errors coming
from the Java
VM. The
behavior was
variable
unlike on the
Mac which
always crashes
when creating
loop 254.<br>
<br>
Martin<br>
<br>
> On Mar 7,
2025, at 6:24</span><span style="font-size: 11pt; font-family: Arial, sans-serif;"> </span><span style="font-size: 11pt;">AM, Christopher Schnick<span class="Apple-converted-space"> </span><a href="mailto:crschnick@xpipe.io" style="color: blue; text-decoration: underline;" moz-do-not-send="true"><crschnick@xpipe.io></a><span class="Apple-converted-space"> </span>wrote:<br>
><span class="Apple-converted-space"> </span><br>
> Hello,<br>
><span class="Apple-converted-space"> </span><br>
> I have
attached a JVM
fatal error
log that
seemingly was
caused by our
JavaFX
application
entering too
many nested
event loops,
which macOS
apparently
doesn't like.<br>
><span class="Apple-converted-space"> </span><br>
> As far as
I know, there
is no upper
limit defined
on how often
an event loop
can be nested,
so I think
this is a bug
that can occur
in rare
situations.<br>
><span class="Apple-converted-space"> </span><br>
> Best<br>
>
Christopher
Schnick<hs_err_pid.txt></span></p>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<br>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
<br>
</blockquote>
</div>
</div></blockquote></div><br></body></html>