<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
Thanks for the Answer Andy, I appreciate it.<br>
<br>
1. Java 20.0.1 and JavaFX 20.0.2<br>
<br>
2. I tried profiling the app, most of the time spent in loading a
stage is spent reading the FXML,<br>
I tried removing all the logic inside the controllers and the
initialize() methods and the loading time does not change.<br>
<br>
3. Yes, I tried using VisualVM and I noticed that the default GC
(G1) never returns memory to the OS even after a garbage collection.<br>
I switched to ZGC and the it works much much better. My stage was
consuming up to 500MB of heap, switching to ZGC it consume up to
180MB, <br>
don't ask me why, garbage collection is black magic for me.<br>
<br>
I can say that most of my memory problems has been solved by
switching from G1 to ZGC garbage collector <br>
but the loading time hasn't improved.<br>
<br>
I have plenty of time to preload the FXML because my app starts with
a tray icon, and the user can click the tray <br>
to open the settings if it needs it. The problem is that when the
user want to access the settings, loading that stage requires 1.8
seconds.<br>
<br>
Doing this during the app startup:<br>
<div style="background-color:#1e1f22;color:#bcbec4">
<pre style="font-family:'JetBrains Mono',monospace;font-size:9,8pt;"><span style="color:#c77dbb;font-style:italic;">log</span>.info(<span style="color:#6aab73;">"Preloading settings fxml"</span>);
<span style="color:#c77dbb;">stage</span>.setOpacity(<span style="color:#2aacb8;">0</span>);
<span style="color:#c77dbb;">stage</span>.show();
<span style="color:#c77dbb;">stage</span>.close();
<span style="color:#c77dbb;">stage</span>.setOpacity(<span style="color:#2aacb8;">1</span>);</pre>
</div>
seems to help a lot in the loading time of the stage but it so
ugly...<br>
<br>
Davide<br>
<br>
<br>
Il 26/08/2023 01:30, Andy Goryachev ha scritto:<br>
<blockquote type="cite"
cite="mid:DM5PR1001MB2172444E0E2530ED926468C7E5E3A@DM5PR1001MB2172.namprd10.prod.outlook.com">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style>@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:"Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}@font-face
{font-family:"Iosevka Fixed SS16";
panose-1:2 0 5 9 3 0 0 0 0 4;}@font-face
{font-family:"Times New Roman \(Body CS\)";
panose-1:2 11 6 4 2 2 2 2 2 4;}@font-face
{font-family:"Iosevka Fixed SS16 ";
panose-1:2 0 5 9 3 0 0 0 0 4;}@font-face
{font-family:"\@Yu Gothic";
panose-1:2 11 4 0 0 0 0 0 0 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:10.0pt;
font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}span.EmailStyle19
{mso-style-type:personal-reply;
font-family:"Iosevka Fixed SS16";
color:windowtext;}.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;
mso-ligatures:none;}div.WordSection1
{page:WordSection1;}</style>
<div class="WordSection1">
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">1. which version of jdk/jfx are you using?<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">2. have you tried profiling your application
during FXML loading?<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">3. have you tried looking at the heap allocation
(using VisualVM or a similar tool), to see where the bulk of
memory consumption is?<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16"">-andy<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16""><o:p> </o:p></span></p>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span
style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Davide
Perini <a class="moz-txt-link-rfc2396E" href="mailto:perini.davide@dpsoftware.org"><perini.davide@dpsoftware.org></a><br>
<b>Date: </b>Friday, August 25, 2023 at 16:16<br>
<b>To: </b>Andy Goryachev
<a class="moz-txt-link-rfc2396E" href="mailto:andy.goryachev@oracle.com"><andy.goryachev@oracle.com></a>, <a class="moz-txt-link-abbreviated" href="mailto:openjfx-dev@openjdk.org">openjfx-dev@openjdk.org</a>
<a class="moz-txt-link-rfc2396E" href="mailto:openjfx-dev@openjdk.org"><openjfx-dev@openjdk.org></a><br>
<b>Subject: </b>Re: [External] : Re: Preload fxml to
avoid slow show()<o:p></o:p></span></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span
style="font-size:11.0pt">I tried it, 99% of the heavy lift
comes from FXML load.<br>
I have 80Kb of FXML files, nothing particularly big,<br>
I measured the laoding time on a 13900K CPU and it requires
1.8s.<br>
<br>
Once loaded, I don't know how this is possible, my apps
sucks 100MB more RAM but after the first load,<br>
opening/closing the tab pane is much faster.<br>
<br>
I sincerely can't understand how a tabpane can suck 100MB od
RAM and how 80Kb of FXML can require almoast 2 seconds to
load<br>
on the world fastest consumer CPU (single thread).<br>
<br>
I see that there are dozens of similar threads on the
internet so this should be a known problem<br>
and at this point, I think that I'm out of luck.<br>
<br>
Thank you anyway,<br>
Davide<br>
<br>
<o:p></o:p></span></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Il
25/08/2023 23:55, Andy Goryachev ha scritto:<o:p></o:p></span></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 "">Another suggestion might be to load tabs
lazily. I don't think FXML "pre-loading" is possible.</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 ""> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 "">-andy</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 ""> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 ""> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 ""> </span><o:p></o:p></p>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span
style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">Davide
Perini <a href="mailto:perini.davide@dpsoftware.org"
moz-do-not-send="true">
<perini.davide@dpsoftware.org></a><br>
<b>Date: </b>Friday, August 25, 2023 at 14:31<br>
<b>To: </b>Andy Goryachev <a
href="mailto:andy.goryachev@oracle.com"
moz-do-not-send="true"><andy.goryachev@oracle.com></a>,
<a href="mailto:openjfx-dev@openjdk.org"
moz-do-not-send="true" class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a>
<a href="mailto:openjfx-dev@openjdk.org"
moz-do-not-send="true">
<openjfx-dev@openjdk.org></a><br>
<b>Subject: </b>[External] : Re: Preload fxml to avoid
slow show()</span><o:p></o:p></p>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><span
style="font-size:11.0pt">My tab pane is very complex with
a lot of tabs,
<br>
having an FXML is very welcomed.<br>
<br>
Thanks<br>
Davide</span><o:p></o:p></p>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Il
25/08/2023 16:45, Andy Goryachev ha scritto:</span><o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 "">You can try creating the scene graph
programmatically, thus avoiding FXML entirely.</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 ""> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 "">-andy</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 ""> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:11.0pt;font-family:"Iosevka Fixed
SS16 ""> </span><o:p></o:p></p>
<div style="border:none;border-top:solid #B5C4DF
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal" style="margin-bottom:12.0pt"><b><span
style="font-size:12.0pt;color:black">From:
</span></b><span style="font-size:12.0pt;color:black">openjfx-dev
<a href="mailto:openjfx-dev-retn@openjdk.org"
moz-do-not-send="true">
<openjfx-dev-retn@openjdk.org></a> on behalf
of Davide Perini <a
href="mailto:perini.davide@dpsoftware.org"
moz-do-not-send="true">
<perini.davide@dpsoftware.org></a><br>
<b>Date: </b>Friday, August 25, 2023 at 00:45<br>
<b>To: </b><a href="mailto:openjfx-dev@openjdk.org"
moz-do-not-send="true" class="moz-txt-link-freetext">openjfx-dev@openjdk.org</a>
<a href="mailto:openjfx-dev@openjdk.org"
moz-do-not-send="true">
<openjfx-dev@openjdk.org></a><br>
<b>Subject: </b>Preload fxml to avoid slow show()</span><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><span style="font-size:11.0pt">Hi,<br>
I have a tabpane with 15 tabs, every tab has his own
controller and it's <br>
pretty crowded.<br>
<br>
On a 13900K CPU, show() method requires more than
750ms,<br>
this feels laggy...<br>
<br>
After the first show() call, loading the tab pane is
much faster...<br>
<br>
Is there a way to "preload" an fxml?<br>
<br>
I tried to show() and hide() it immediately and it
seems to help,<br>
but what is the best way to do it?<br>
<br>
Thanks<br>
Davide</span><o:p></o:p></p>
</div>
</blockquote>
<p class="MsoNormal"><span style="font-size:11.0pt"> </span><o:p></o:p></p>
</blockquote>
<p class="MsoNormal"><span style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
</blockquote>
<br>
</body>
</html>