[External] : Re: Those memory footprint improvements in JDK 18
Thomas Schatzl
thomas.schatzl at oracle.com
Mon May 9 08:28:10 UTC 2022
Hi,
On 06.05.22 23:45, charlie hunt wrote:
> Yes, GC's internal data structures.
as Charlie said.
> How much reduction there will likely vary depending on the application
> (and G1 region size). The type of application that will experience
> larger reductions are those applications that have a large number of
> cross G1 region references. A cache like type of application usually has
> a large number of these since updates to the cache introduce new
> references to an older or longer lived object which is likely held in a
> different G1 region.
>
> On 5/6/22 4:36 PM, Stefan Reich wrote:
>> Ah, so the memory sections that are now smaller are basically the GC's
>> internal data structures, rather than the general heap?
Yes. Significantly so. There has been a presentation for Oracle
Developer Live in March that shows the progress in that area for such a
cache-like application at
https://inside.java/2022/05/02/odl-jdk8-to-jdk18-gc/ ; around 17:49 it
talks about memory footprint reductions for the G1 collector over time.
Just to make it clear: next to the application, this is highly dependent
on the garbage collector; e.g. Parallel GC needs memory roughly constant
equal to the "Floor" line on that blog, Serial GC roughly half of that.
With all their other tradeoffs of course wrt to latency/throughput.
As mentioned in that blog post at the very end, we are working on
something that might make G1 GC data structure overhead comparable to
Serial GC plus remembered sets (you can see the new "floor" for that
change by looking at the "Prototype (calculated)" line, the level in the
first ~50s). That change basically removes a constant amount that is
exactly 1.5% of Java heap memory size from gc data structure overhead.
Maybe that change makes JDK 19, as usual no guarantees.
>> That kind of puts things in perspective. Still a great improvement.
>> Has it been tested by how much the overall memory footprint of the JVM
>> decreases in larger benchmarks?
In JDK8 the rule-of-thumb was like that you probably need to consider
around 20% of Java heap, JDK 11 around 10% and with JDK 18 (probably)
around 5% for G1 GC data structures to be fairly safe for all but the
largest outliers with default ergonomics (i.e. that application we use
for demonstration purposes is on the upper end).
You *can* tune GC remembered set memory footprint quite a bit in earlier
releases, but there are also other changes in later JDKs that can't be
reproduced by some options. That blog contains a few posts about these.
Many (typically throughput-oriented) applications need (much) less
remembered set data structure memory though.
>>
>> On Fri, 6 May 2022 at 23:28, charlie hunt <charlie.hunt at oracle.com> wrote:
>>
>> Hi Stefan,
>>
>> The graph Thomas shows in his blog is the GC part of the NMT
>> output which does not include metadata.
>>
>> The GC part of NMT output includes native memory allocated on
>> behalf of the GC itself such as a card table or remembered set ..
>> those things that GC needs to do its work. The native memory
>> allocated for the Java heap are in the "Java Heap" section of the
>> NMT output. Class metadata is in the "Class" section of the NMT
>> output.
>>
>> There is a "Native Memory Tracking Memory Categories" table that
>> lists the sections / categories reported by NMT and a description
>> of each at:
>> https://docs.oracle.com/en/java/javase/17/troubleshoot/diagnostic-tools.html#GUID-5EF7BB07-C903-4EBD-A9C2-EC0E44048D37
That documentation isn't current for JDK 18 - there is a new category
for GC called "GCCardSet" that measures the memory overhead of the
so-called (G1) remembered set only as it is a significant part of it.
TL;DR: the previous "GC" category has been split into "GC" and
"GCCardSet" and need to be added together to be comparable with "GC" of
earlier versions.
I'll try to get the documentation updated for JDK 19 at least, possibly
JDK 18.
>>
>> hths,
>>
>> Charlie
>>
>> On 5/6/22 2:13 PM, Stefan Reich wrote:
>>> I'm right now just trying to get over how amazing this graph is:
>>> https://tschatzl.github.io/2022/03/14/jdk18-g1-parallel-gc-changes.html
>>> <https://urldefense.com/v3/__https://tschatzl.github.io/2022/03/14/jdk18-g1-parallel-gc-changes.html__;!!ACWV5N9M2RV99hQ!OKRokskrYA5lROK6mWSdvn5puKnqs34LsTUVTkWX2Rp65OYC5CRMO5pthP_bsdg-msr3P2Q6ag1T55XNqMseOt88jWtWJhKP$>
>>>
>>>
>>> 35-40% savings in memory use just by using JDK 18??? Who would
>>> have expected such a major improvement after 17 iterations of the
>>> language!
>>>
>>> Just so I'm sure I'm reading it correctly... the graph basically
>>> shows the Java heap's memory footprint in terms of committed
>>> native memory. Right?
>>>
>>> So it would include Eden, tenured generations, humongous objects,
>>> but not metadata and code. Is that correct?
>>>
>>> Basically tell me how much I should celebrate this. lol
>>>
>>> I did switch another small, pretty crammed (8 GB RAM) server over
>>> to JDK 18 and it does feel like there's a lot more memory
>>> available on it now and everything is a lot faster too.
>>>
>>> Cheers
>>> Stefan
>>>
Hth,
Thomas
More information about the hotspot-gc-use
mailing list