<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;">
Hi Jonathan,
<div><br>
</div>
<div>I’m currently working on automatic heap sizing for ZGC. My vision is that users shouldn’t have to set heap sizes.</div>
<div>Would love to see that in G1 as well. What you are describing sounds like it would do something similar.</div>
<div><br>
</div>
<div>Having said that, it seems like the concrete changes you are proposing for OpenJDK, would not actually</div>
<div>yield automatic heap sizing for the user. By the sound of it, you would need your special launcher</div>
<div>with an extra thread that contains the actual heap sizing policy. The proposed JVM changes are mostly for</div>
<div>being *able* to change the heap sizing policies externally, but without any policy shipped that actually</div>
<div>changes it.</div>
<div><br>
</div>
<div>While having a pluggable policy is great because anyone can put in their own favourite policy, there</div>
<div>is also an obvious disadvantage that 99.9% of deployments won’t have any special launcher or</div>
<div>supplier of an external heap sizing policy, or even know what we are talking about. Therefore,</div>
<div>unless we also ship the policies, I unfortunately think that limits the usefulness of the feature.</div>
<div>If, however, a policy was shipped so the heap can be sized automatically, I think that would make it</div>
<div>much more widely useful.</div>
<div><br>
</div>
<div>In my automatic heap sizing work, the goal is to ship both the mechanisms and the policies needed</div>
<div>to automatically size (and resize) the heap, adapting to changing load and environments. Are you</div>
<div>open to the idea of shipping a policy that actually changes the heap size as well? It would be great</div>
<div>to be aligned on this, I think.</div>
<div><br>
</div>
<div>Thanks,</div>
<div>/Erik<br id="lineBreakAtBeginningOfMessage">
<div><br>
<blockquote type="cite">
<div>On 13 Jun 2024, at 01:32, Jonathan Joo <jonathanjoo@google.com> wrote:</div>
<br class="Apple-interchange-newline">
<div>
<div dir="ltr"><span id="gmail-docs-internal-guid-12ca1fd3-7fff-d410-0ee1-5bb6cb9f0ed8">
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">Hello
 hotspot-dev and hotspot-gc-dev,</span></div>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">I'd
 like to reopen discussion on Adaptable Heap Sizing (AHS) for the G1 Garbage Collector, since we now have some time to dedicate to bringing this effort to the OpenJDK Community. Please see
</span><a href="https://mail.openjdk.org/pipermail/hotspot-gc-dev/2022-September/040096.html" style="text-decoration-line:none"><span style="font-size:11pt;font-family:Arial,sans-serif;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;text-decoration-line:underline;vertical-align:baseline">https://mail.openjdk.org/pipermail/hotspot-gc-dev/2022-September/040096.html</span></a><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">
 for the original thread.</span></div>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">The
 bullet points contained in the above link are still largely the same, and we have made significant improvements to the service over the past few years, and found success deploying it broadly across jobs internally. Now that we feel the feature has matured,
 we'd like to introduce it to the OpenJDK community in hopes that it can be adopted for broader use.</span></div>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">In
 short - the goal of Adaptable Heap Sizing is to improve memory usage and reduce OOMs for Java applications, especially those deployed in containerized environments. The key insights are as follows:</span></div>
<br>
<ol style="margin-top:0px;margin-bottom:0px">
<li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline; white-space: pre;">
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;vertical-align:baseline">Applications with
 low memory requirements but configured with high RAM often use RAM unnecessarily. We can utilize GC CPU overhead metrics to help guide heap sizing, allowing for RAM savings in these scenarios.</span></div>
</li><li dir="ltr" style="list-style-type: decimal; font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline; white-space: pre;">
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size:11pt;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;vertical-align:baseline">For Java applications
 running in containers, we can bound Java heap usage based on our knowledge of the current container memory usage as well as the current container size, to prevent container OOMs.</span></div>
</li></ol>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">The
 implementation of AHS currently involves some fairly lightweight changes to the JVM, through the introduction of two new manageable flags. They are essentially the same as these two (open feature requests): </span></div>
<ul style="margin-top:0px;margin-bottom:0px">
<li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline; white-space: pre;">
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><a href="https://bugs.openjdk.org/browse/JDK-8236073" style="text-decoration-line:none"><span style="font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;text-decoration-line:underline;vertical-align:baseline">https://bugs.openjdk.org/browse/JDK-8236073</span></a></div>
</li><li dir="ltr" style="list-style-type: disc; font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline; white-space: pre;">
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><a href="https://bugs.openjdk.org/browse/JDK-8204088" style="text-decoration-line:none"><span style="font-size:11pt;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;text-decoration-line:underline;vertical-align:baseline">https://bugs.openjdk.org/browse/JDK-8204088</span></a></div>
</li></ul>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">In
 addition, we have a separate thread (outside of the JVM, in our custom Java launcher) which reads in GC CPU overhead data and container information, and calculates appropriate values for these two flags. We call this the AHS worker thread, and this thread
 updates frequently (currently every second). The vast majority of the AHS logic is in this worker thread - the introduction of the new JVM flags above simply gives AHS a way to tune GC heuristics given this additional information.</span></div>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">Thomas
 Schatzl mentioned there is a </span><a href="https://bugs.openjdk.org/browse/JDK-8329758" style="text-decoration-line:none"><span style="font-size:11pt;font-family:Arial,sans-serif;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;text-decoration-line:underline;vertical-align:baseline">similar-sounding
 effort going on in ZGC</span></a><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">, and also
 there were folks outside of Google who expressed interest in this project, so I think it is an appropriate time to discuss this again on an open forum. Given the positive results we've had deploying AHS internally at Google, we feel this is a valuable feature
 to the broader Java community that should be able to be leveraged by all to achieve more stable and efficient Java heap behavior 🙂 </span></div>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">I'd
 appreciate hearing peoples' thoughts on this. Thank you!</span></div>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">~
 Jonathan</span></div>
<br>
<div style="line-height: 1.38; margin-top: 0pt; margin-bottom: 0pt;"><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">(P.S.
 For more information, a talk given about this project can be viewed </span><a href="https://www.youtube.com/watch?v=qOt4vOkk49k" style="text-decoration-line:none"><span style="font-size:11pt;font-family:Arial,sans-serif;background-color:transparent;font-variant-numeric:normal;font-variant-east-asian:normal;font-variant-alternates:normal;text-decoration-line:underline;vertical-align:baseline">here</span></a><span style="font-size: 11pt; font-family: Arial, sans-serif; background-color: transparent; font-variant-numeric: normal; font-variant-east-asian: normal; font-variant-alternates: normal; vertical-align: baseline;">,
 though it is somewhat dated.) </span></div>
</span><br class="gmail-Apple-interchange-newline">
</div>
</div>
</blockquote>
</div>
<br>
</div>
</body>
</html>