<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;">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 <andy.goryachev@oracle.com> 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;">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 <crschnick@xpipe.io><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 <andy.goryachev@oracle.com><br><b>Cc:<span class="Apple-converted-space"> </span></b>OpenJFX <openjfx-dev@openjdk.org><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;">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;"><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;"><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;"><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;"><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;"><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;"><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;"><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></body></html>