<html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:ConsolasHigh;
        panose-1:2 11 6 9 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0cm;
        font-size:10.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:612.0pt 792.0pt;
        margin:70.85pt 70.85pt 70.85pt 70.85pt;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="FR" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal" style="margin-left:35.4pt"><span lang="EN-US" style="font-size:11.0pt;mso-fareast-language:EN-US"> </span><span lang="EN-US"><o:p></o:p></span></p>
<div>
<p class="MsoNormal" style="margin-left:35.4pt"><span lang="EN-US" style="font-size:11.0pt">> I will check if C2 helps, but afaik since it’s triggered when method is<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><span lang="EN-US" style="font-size:11.0pt">> used often (not because the method consumes significant memory), it’s<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><span lang="EN-US" style="font-size:11.0pt">> not ideal to count on it anyway. Moreover, I suspect it’s not documented<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left:35.4pt"><span lang="EN-US" style="font-size:11.0pt">> public behavior while lambda capture is well defined.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">I have checked the following example with (no debugger)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">--enable-preview<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">-XX:-TieredCompilation<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">-Xbatch<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">-Xcomp<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">-Xlog:nmethod+install<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">… to force C2, but the bigBuffer is still retained.<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">(Won’t C2 clear a stack ref only if it can be reused in the same scope for another java var?)<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Thanks<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt">Arnaud<o:p></o:p></span></p>
<div style="mso-element:para-border-div;border:none;border-bottom:solid windowtext 1.0pt;padding:0cm 0cm 1.0pt 0cm">
<p class="MsoNormal" style="border:none;padding:0cm"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
<p class="MsoNormal" style="background:white"><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">import
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">java.lang.management.ManagementFactory</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">;<br>
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">import </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:black">java.util.Timer</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">;<br>
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">import </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:black">java.util.TimerTask</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">;<br>
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">import </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:black">java.util.concurrent.ExecutionException</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">;<br>
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">import </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:black">java.util.concurrent.Executors</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">;<br>
<br>
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">public class
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">Main1 </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">{<br>
   </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">public static void
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#00627A">main</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">(</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">String</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">[]
 args) </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">throws
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">ExecutionException</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">,
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">InterruptedException
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">{<br>
      </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">var
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">timer </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">= </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">new
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">Timer();<br>
      </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">var
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">memBean </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">= </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">ManagementFactory</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.<i>getMemoryMXBean</i>();<br>
      </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">timer</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.schedule(</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">new
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">TimerTask</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">() {<br>
            </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#9E880D">@Override<br>
            </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">public void
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#00627A">run</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">() {<br>
               </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">System</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.<i>gc</i>();<br>
               </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">System</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.</span><i><span lang="EN-US" style="font-family:ConsolasHigh;color:#871094">out</span></i><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.println(</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#067D17">"---
 " </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">+ </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:#851691">memBean</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.getHeapMemoryUsage());<br>
            }<br>
         }, </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#1750EB">10</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">*</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#1750EB">1000</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">,
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#1750EB">10</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">*</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#1750EB">1000</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">);<br>
      <i>myApp</i>();<br>
   }<br>
<br>
   </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">private static void
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#00627A">myApp</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">()
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">throws </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:black">ExecutionException</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">,
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">InterruptedException
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">{<br>
      </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">var
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">executor </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">= </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">Executors</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.<i>newVirtualThreadPerTaskExecutor</i>();<br>
      </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">var
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">future </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">= </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">executor</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.submit(() -> {<br>
         </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">try
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">{<br>
            </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">System</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.</span><i><span lang="EN-US" style="font-family:ConsolasHigh;color:#871094">out</span></i><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.println(</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#067D17">"Starting
 work"</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">);<br>
            </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">var
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">bigBuffer </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">= </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">new byte</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">[</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#1750EB">1024
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">* </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:#1750EB">1024 </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">*
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#1750EB">1024</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">];<br>
            </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">System</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.</span><i><span lang="EN-US" style="font-family:ConsolasHigh;color:#871094">out</span></i><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.println(</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#067D17">"bigBuffer
 size: " </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">+
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">bigBuffer</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#871094">length</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">);<br>
            </span><i><span lang="EN-US" style="font-family:ConsolasHigh;color:#8C8C8C">// bigBuffer = null;<br>
            </span></i><i><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">slowIO</span></i><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">();<br>
         } </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">catch
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">(</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">InterruptedException
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">e) {<br>
            </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">throw new
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">RuntimeException(e);<br>
         }<br>
      });<br>
      </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">future</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.get();<br>
   }<br>
<br>
   </span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">private static void
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#00627A">slowIO</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">()
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#0033B3">throws </span>
<span lang="EN-US" style="font-family:ConsolasHigh;color:black">InterruptedException
</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">{<br>
      </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">System</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.</span><i><span lang="EN-US" style="font-family:ConsolasHigh;color:#871094">out</span></i><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.println(</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#067D17">"Starting
 slowIO"</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">);<br>
      </span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">Thread</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.<i>sleep</i>(</span><span lang="EN-US" style="font-family:ConsolasHigh;color:black">Long</span><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">.</span><i><span lang="EN-US" style="font-family:ConsolasHigh;color:#871094">MAX_VALUE</span></i><span lang="EN-US" style="font-family:ConsolasHigh;color:#080808">);<br>
   }<br>
}<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size:11.0pt"><o:p> </o:p></span></p>
</div>
</div>

<DIV>
Unless otherwise stated above:<BR>
<BR>
Compagnie IBM France<BR>
Siège Social : 17, avenue de l'Europe, 92275 Bois-Colombes Cedex<BR>
RCS Nanterre 552 118 465<BR>
Forme Sociale : S.A.S.<BR>
Capital Social : 664 069 390,60 €<BR>
SIRET : 552 118 465 03644 - Code NAF 6203Z<BR>
</DIV></body>
</html>