RFR: JDK-8262074: Consolidate the default value of MetaspaceSize [v2]

Coleen Phillimore coleenp at openjdk.java.net
Thu Feb 25 23:40:45 UTC 2021


On Tue, 23 Feb 2021 07:47:59 GMT, Thomas Stuefe <stuefe at openjdk.org> wrote:

>> I was looking at whether the default values for MetaspaceSize (the initial threshold to start off a metaspace-motivated GC) still make sense after JEP-387.
>> 
>> The default is dependent on compiler tier and bitness. It is also spread across all platforms.
>> 
>> In addition to that, it also may get modified after Metaspace::ergo_initialize() in client-compiler-emulation-mode:
>> 
>> https://github.com/openjdk/jdk/blob/2b00367e1154feb2c05b84a11d62fb5750e46acf/src/hotspot/share/compiler/compilerDefinitions.cpp#L194-L196
>> 
>> which is unexpected and causes confusion (eg JDK-8261907, JDK-8261907).
>> 
>> The reasons for this seem to originate from PermGen times:
>> https://mail.openjdk.java.net/pipermail/hotspot-runtime-dev/2021-February/045536.html
>> 
>> ----
>> 
>> Today, MetaspaceSize defaults to:
>> 
>> - no compiler (eg Zero):      **4M** (32bit)   **5.19M** (64bit)
>> - C1-only build:  	   **12M**
>> - C1+C2 build (standard):    **16M** 	(32bit) **20,75M** (64bit)
>> 
>> I was surprised to see that they do not depend on any compiler *runtime* switches. It only depends on build time decisions.
>> 
>> ---
>> 
>> How much do we use? I analyzed a simple java app to see the difference VM settings make on initial metaspace consumption. Committed space, used in brackets:
>> 
>> 
>> (Note:                  (used)          committed
>> CDS on:
>> 
>> 64bit:       		(181,58 KB)     384 KB  (a)
>> 64bit tier1 only:       (170,04 KB)     384 KB
>> 64bit Xint:		(16,62 KB)      256 KB
>> 
>> 32bit    		(178 KB)        256 KB
>> 32bit tier1 only: 	(144 KB)        256 KB
>> 32bit Xint: 		(11 KB) (b)     128 KB  
>> 
>> CDS off:
>> 
>> 64bit:			(5,06 MB)       5.62 MB
>> 64bit tier1 only:       (5,00 MB)       5,56 MB
>> 64bit Xint:		(4,84 MB)       5.44 MB
>> 
>> 32bit    		(3,69 MB)       3.75 MB
>> 32bit tier1 only: 	(3,65 MB)       3.75 MB
>> 32bit Xint: 		(3,52 MB)       3.62 MB
>> 
>> Class space on/off
>> 
>> CDS off, 64bit, +CompressedClassPointers: 5.44M
>> CDS off, 64bit, -CompressedClassPointers: 5.38M
>> 
>> 
>> _Notes:
>> (a) Since JEP-387, with CDS=on, we pay very little committed footprint upfront (384K). For comparison, JDK 15 commits here 5.75M.
>> (b) The seemingly high difference between Xint and C1+C2 - 11K vs 178K - is misleading: All initial classes get compiled, but since most of their metadata live in CDS, not in Metaspace, all we allocate at the start are MethodCounters. Hence, with -Xint, we almost allocate nothing. That changes as soon as we start loading application classes._
>> 
>> Conclusions:
>> - CDS=off increases metaspace footprint by a flat amount, in my case ~5MB, which makes sense.
>> - Running with (any) compiler has not much influence once we start using Metaspace for real. The difference between C1-only and C1+C2 is neglectible, the difference between Xint and C1+C2 amounts to about 2% wrt to initial metaspace consumption.
>> - Running with or without compressed Klass pointers makes not much difference. With class space, we pay for certain overhead twice, but at this early stage this is not noticeable.
>> - The difference between 64bit and 32bit is more like 1.4-1.5, not the 1.3 factor we currently assume
>> 
>> -----
>> 
>> Proposal:
>> 
>> 1) I propose to make MetaspaceSize independent from compiler. For one, if the intention was to have a lower threshold with compilers deactivated, that has never worked. E.g. on 64bit we always had a threshold of 20.75MB regardless of Xint/TieredStopAtLevel. Even if it worked, the compiler does not make that much difference in metaspace footprint.
>> 
>> 2) I propose to slightly lower MetaspaceSize - on 32bit from 16M to 14M, on 64bit from 20.75M to 20M. This takes the slightly lower metaspace footprint since JEP 387 into account (less waste) and the scale I found to be higher than 1.3. 
>> 
>> This is all very cautious. For the standard VM, very little changes, so this is mainly a cleanup patch. We could probably tune MetaspaceSize down to much lower levels. And/or make size it differently depending on UseSharedSpaces. However, atm I don't have time to hunt regressions due to too early GCs.
>> 
>> -----
>> 
>> Tests: GA, nightlies at SAP
>
> Thomas Stuefe has updated the pull request incrementally with one additional commit since the last revision:
> 
>   Increase MetaspaceSize default

This looks good.  I appreciate the more conservative approach and doing this as a cleanup.

-------------

Marked as reviewed by coleenp (Reviewer).

PR: https://git.openjdk.java.net/jdk/pull/2675


More information about the hotspot-dev mailing list