<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Hi Prasad,</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
1. The lambdas generated from Class::method, () -> {}, and instance::method are all from LambdaMetafactory (if you look at the BootstrapMethods attribute from javap -c -v output), so they always have the same behavior.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
2. For JDK 11, according to <a href="https://github.com/openjdk/jdk/pull/12493">https://github.com/openjdk/jdk/pull/12493</a> they were not strongly tied, but I personally don't know about the details back then.</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
<br>
</div>
<div class="elementToProof" style="font-family: Aptos, Aptos_EmbeddedFont, Aptos_MSFontService, Calibri, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0);">
Chen</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Prasad Velagapudi <prasad.velagapudi@servicenow.com><br>
<b>Sent:</b> Wednesday, June 12, 2024 10:35 AM<br>
<b>To:</b> Chen Liang <chen.l.liang@oracle.com><br>
<b>Subject:</b> [External] : Re: Lambda Classes reachability from GC roots in JDK11 and JDK17</font>
<div> </div>
</div>
<style>
<!--
@font-face
{font-family:Helvetica}
@font-face
{font-family:"Cambria Math"}
@font-face
{font-family:Calibri}
@font-face
{font-family:Aptos}
@font-face
{font-family:Menlo}
p.x_MsoNormal, li.x_MsoNormal, div.x_MsoNormal
{margin:0cm;
font-size:12.0pt;
font-family:"Aptos",sans-serif}
h3
{margin-right:0cm;
margin-left:0cm;
font-size:13.5pt;
font-family:"Aptos",sans-serif;
font-weight:bold}
span.x_Heading3Char
{font-family:"Aptos",sans-serif;
color:#0F4761}
p.x_xmsonormal, li.x_xmsonormal, div.x_xmsonormal
{margin:0cm;
font-size:11.0pt;
font-family:"Aptos",sans-serif}
p.x_xmsolistparagraph, li.x_xmsolistparagraph, div.x_xmsolistparagraph
{margin-top:0cm;
margin-right:0cm;
margin-bottom:0cm;
margin-left:36.0pt;
font-size:11.0pt;
font-family:"Aptos",sans-serif}
span.x_EmailStyle25
{font-family:"Aptos",sans-serif;
color:windowtext}
p.x_p1, li.x_p1, div.x_p1
{margin:0cm;
font-size:9.0pt;
font-family:Menlo}
p.x_p2, li.x_p2, div.x_p2
{margin:0cm;
font-size:9.0pt;
font-family:Menlo;
color:#7F0055}
p.x_p3, li.x_p3, div.x_p3
{margin:0cm;
font-size:9.0pt;
font-family:Menlo}
span.x_s1
{color:#7F0055}
span.x_s2
{color:#6A3E3E}
span.x_s3
{color:#0000C0}
span.x_s4
{color:black}
span.x_apple-tab-span
{}
span.x_apple-converted-space
{}
.x_MsoChpDefault
{font-size:10.0pt}
@page WordSection1
{margin:72.0pt 72.0pt 72.0pt 72.0pt}
div.x_WordSection1
{}
ol
{margin-bottom:0cm}
ul
{margin-bottom:0cm}
-->
</style>
<div lang="EN-IN" link="#467886" vlink="#96607D" style="word-wrap:break-word">
<div class="x_WordSection1">
<p class="x_MsoNormal"><span style="font-size:11.0pt">Thanks Chen for the reply..
</span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt">Just to clarify, my first question was on the lambda classes loaded from Lambda expressions(Lexical Lambdas), not the classes created from LambdaMetafactory.
</span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_p1"><span style="font-size:11.0pt; font-family:"Aptos",sans-serif">Suppose in this example the line
</span><b>StringFunction <span style="color:#6A3E3E">ask</span> = LambdaExpressionsUtil::<i>printLambdaTest</i>;
</b>generates a Lambda class. So, I am curious to know, does this lambda class is STRONGLY tied to defining class loader in JDK11?</p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal"><b><span style="font-size:11.0pt">Example</span></b><span style="font-size:11.0pt">1 ::</span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_p1"><span class="x_s1"><b>interface</b></span> StringFunction {</p>
<p class="x_p1"><span class="x_apple-tab-span"> </span><span class="x_apple-converted-space">
</span>String print(String <span class="x_s2">str</span>);</p>
<p class="x_p1">}</p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt">public class </span>LambdaExpressionsUtil<span style="font-size:11.0pt"> {</span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_p1" style="margin-left:36.0pt"><span class="x_s1"><b>public</b></span>
<span class="x_s1"><b>static</b></span> String printLambdaTest(String <span class="x_s2">
str</span>) {</p>
<p class="x_p1" style="margin-left:36.0pt"><span class="x_apple-tab-span">
</span>System.<span class="x_s3"><b><i>out</i></b></span>.println(<span class="x_s2">str</span>);</p>
<p class="x_p2" style="margin-left:36.0pt"><span class="x_apple-tab-span"><span style="color:black">
</span></span><b>return</b><span class="x_s4"> </span><span class="x_s2">str</span><span class="x_s4">;</span></p>
<p class="x_p3" style="margin-left:36.0pt"><span class="x_apple-tab-span">
</span></p>
<p class="x_p1" style="margin-left:36.0pt"><span class="x_apple-tab-span"> </span>
}</p>
<p class="x_MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt"> </span></p>
<p class="x_p1" style="margin-left:36.0pt"><span class="x_s1"><b>public</b></span>
<span class="x_s1"><b>static</b></span> <span class="x_s1"><b>void</b></span> main(String[]
<span class="x_s2">args</span>) <span class="x_s1"><b>throws</b></span> IllegalAccessException, LambdaConversionException, Throwable {</p>
<p class="x_p1" style="margin-left:36.0pt"> StringFunction <span style="color:#6A3E3E">
ask</span> = LambdaExpressionsUtil::<i>printLambdaTest</i>;</p>
<p class="x_p1" style="margin-left:36.0pt"> <span style="color:#6A3E3E">ask</span><span style="color:black">.print(</span><span style="color:#2A00FF">"Lambda Expression ask"</span><span style="color:black">);</span><span style="color:#2A00FF"></span></p>
<p class="x_MsoNormal" style="margin-left:36.0pt"><span style="font-size:11.0pt">}</span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt">}</span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal"><span lang="EN-US">Regards,</span></p>
<p class="x_MsoNormal"><span lang="EN-US">Prasad</span><span style="font-size:11.0pt"></span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<p class="x_MsoNormal"><span style="font-size:11.0pt"> </span></p>
<div id="x_mail-editor-reference-message-container">
<div>
<div style="border:none; border-top:solid #B5C4DF 1.0pt; padding:3.0pt 0cm 0cm 0cm">
<p class="x_MsoNormal" style="margin-bottom:12.0pt"><b><span style="color:black">From:
</span></b><span style="color:black">Chen Liang <chen.l.liang@oracle.com><br>
<b>Date: </b>Wednesday, 12 June 2024 at 8:52</span><span style="font-family:"Arial",sans-serif; color:black"> </span><span style="color:black">PM<br>
<b>To: </b>Prasad Velagapudi <prasad.velagapudi@servicenow.com><br>
<b>Subject: </b>Re: Lambda Classes reachability from GC roots in JDK11 and JDK17</span></p>
</div>
<div>
<h3><strong><span style="font-family:Helvetica; color:black; background:yellow">[External Email]</span></strong><span style="font-family:Helvetica"></span></h3>
<p class="x_MsoNormal"><span style="font-family:Helvetica"> </span></p>
<div class="x_MsoNormal" align="center" style="text-align:center"><span style="font-family:Helvetica">
<hr size="0" width="100%" align="center">
</span></div>
</div>
<div>
<p class="x_MsoNormal"><span style="color:black">Hello Prasad,</span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="color:black">I can confirm the first one is accurate for JDK 15 and later (see JEP 371: Hidden Classes). Lambda classes from LambdaMetafactory are strongly linked to the defining class (the lookupClass of the input Lookup)
and its class loader, and is intended to stay this way. Unfortunately I am not sure about the VM, hope someone can pick up the metaspace part of your question. But I've heard that since lambda classes are bounded to the lookup class loader, they use less memory
as they don't need to be tracked separately for garbage collection,</span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="color:black"> </span></p>
</div>
<div>
<p class="x_MsoNormal"><span style="color:black">-Chen</span></p>
</div>
<div class="x_MsoNormal" align="center" style="text-align:center">
<hr size="0" width="100%" align="center">
</div>
<div id="x_divRplyFwdMsg">
<p class="x_MsoNormal"><b><span style="font-size:11.0pt; font-family:"Calibri",sans-serif; color:black">From:</span></b><span style="font-size:11.0pt; font-family:"Calibri",sans-serif; color:black"> core-libs-dev <core-libs-dev-retn@openjdk.org> on behalf of
Prasad Velagapudi <prasad.velagapudi@servicenow.com><br>
<b>Sent:</b> Wednesday, June 12, 2024 9:37 AM<br>
<b>To:</b> core-libs-dev@openjdk.org <core-libs-dev@openjdk.org><br>
<b>Subject:</b> Re: Lambda Classes reachability from GC roots in JDK11 and JDK17</span>
</p>
<div>
<p class="x_MsoNormal"> </p>
</div>
</div>
<div>
<div>
<p class="x_xmsonormal">A gentle reminder on these questions… Could you please respond?</p>
<p class="x_xmsonormal"> </p>
<p class="x_xmsonormal">Regards,</p>
<p class="x_xmsonormal">Prasad.</p>
<p class="x_xmsonormal"> </p>
<div id="x_x_mail-editor-reference-message-container">
<div>
<div style="border:none; border-top:solid #B5C4DF 1.0pt; padding:3.0pt 0cm 0cm 0cm">
<p class="x_xmsonormal" 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">Prasad Velagapudi <prasad.velagapudi@servicenow.com><br>
<b>Date: </b>Thursday, 6 June 2024 at 8:10</span><span style="font-size:12.0pt; font-family:"Arial",sans-serif; color:black"> </span><span style="font-size:12.0pt; color:black">PM<br>
<b>To: </b>core-libs-dev@openjdk.org <core-libs-dev@openjdk.org><br>
<b>Subject: </b>Lambda Classes reachability from GC roots in JDK11 and JDK17</span></p>
</div>
<div>
<p class="x_xmsonormal"><span lang="EN-US">Hello Lambda Experts,</span></p>
<p class="x_xmsonormal"><span lang="EN-US"> </span></p>
<p class="x_xmsonormal"><span lang="EN-US">I am looking for clarifications on the following questions.</span></p>
<p class="x_xmsonormal"><span lang="EN-US"> </span></p>
<ol start="1" type="1" style="margin-top:0cm">
<li class="x_xmsolistparagraph" style="margin-left:0cm"><span lang="EN-US">I observed in my tests that lambda classes generated for inline lambda expressions (ex: LambdaUtil::print), are STRONGLY linked to defining class loader and never gets collected on GC.
This behaviour is same in both JDK11 and JDK17. Can you please confirm is this accurate?</span></li><li class="x_xmsolistparagraph" style="margin-left:0cm"><span lang="EN-US">Also, I observed that the lambda classes generated for inline lambda expressions (ex: LambdaUtil::print) not adding additional overhead to Metaspace in JDK17 compared to that of JDK11
. Can you please confirm is this accurate? </span></li></ol>
<p class="x_xmsonormal"><span lang="EN-US"> </span></p>
<p class="x_xmsonormal"><span lang="EN-US"> </span></p>
<p class="x_xmsonormal"><span lang="EN-US">Regards,</span></p>
<p class="x_xmsonormal"><span lang="EN-US">Prasad</span></p>
<p class="x_xmsonormal"> </p>
<p class="x_xmsonormal"> </p>
<div id="x_x_mail-editor-reference-message-container">
<div>
<div>
<p class="x_xmsonormal"> </p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>