8042901: Allow com.sun.management to be in a different module to java.lang.management

Reviewed-by: mchung, dfuchs, erikj, jbachorik
This commit is contained in:
Shanliang Jiang 2015-04-17 10:53:31 +02:00
parent 32a8aa9ade
commit 38e3be4c28
14 changed files with 88 additions and 89 deletions

View file

@ -531,18 +531,17 @@
template(java_lang_management_ThreadState, "java/lang/management/ThreadState") \
template(java_lang_management_MemoryUsage, "java/lang/management/MemoryUsage") \
template(java_lang_management_ThreadInfo, "java/lang/management/ThreadInfo") \
template(sun_management_ManagementFactory, "sun/management/ManagementFactory") \
template(sun_management_Sensor, "sun/management/Sensor") \
template(sun_management_Agent, "sun/management/Agent") \
template(sun_management_DiagnosticCommandImpl, "sun/management/DiagnosticCommandImpl") \
template(sun_management_GarbageCollectorImpl, "sun/management/GarbageCollectorImpl") \
template(com_sun_management_internal_DiagnosticCommandImpl, "com/sun/management/internal/DiagnosticCommandImpl") \
template(com_sun_management_internal_GarbageCollectorExtImpl,"com/sun/management/internal/GarbageCollectorExtImpl") \
template(sun_management_ManagementFactoryHelper, "sun/management/ManagementFactoryHelper") \
template(getDiagnosticCommandMBean_name, "getDiagnosticCommandMBean") \
template(getDiagnosticCommandMBean_signature, "()Lcom/sun/management/DiagnosticCommandMBean;") \
template(getGcInfoBuilder_name, "getGcInfoBuilder") \
template(getGcInfoBuilder_signature, "()Lsun/management/GcInfoBuilder;") \
template(getGcInfoBuilder_signature, "()Lcom/sun/management/internal/GcInfoBuilder;") \
template(com_sun_management_GcInfo, "com/sun/management/GcInfo") \
template(com_sun_management_GcInfo_constructor_signature, "(Lsun/management/GcInfoBuilder;JJJ[Ljava/lang/management/MemoryUsage;[Ljava/lang/management/MemoryUsage;[Ljava/lang/Object;)V") \
template(com_sun_management_GcInfo_constructor_signature, "(Lcom/sun/management/internal/GcInfoBuilder;JJJ[Ljava/lang/management/MemoryUsage;[Ljava/lang/management/MemoryUsage;[Ljava/lang/Object;)V") \
template(createGCNotification_name, "createGCNotification") \
template(createGCNotification_signature, "(JLjava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/sun/management/GcInfo;)V") \
template(createDiagnosticFrameworkNotification_name, "createDiagnosticFrameworkNotification") \

View file

@ -455,12 +455,12 @@ void DCmdFactory::send_notification_internal(TRAPS) {
}
if (notif) {
Klass* k = Management::sun_management_ManagementFactoryHelper_klass(CHECK);
instanceKlassHandle mgmt_factory_helper_klass(THREAD, k);
Klass* k = Management::com_sun_management_internal_DiagnosticCommandImpl_klass(CHECK);
instanceKlassHandle dcmd_mbean_klass(THREAD, k);
JavaValue result(T_OBJECT);
JavaCalls::call_static(&result,
mgmt_factory_helper_klass,
dcmd_mbean_klass,
vmSymbols::getDiagnosticCommandMBean_name(),
vmSymbols::getDiagnosticCommandMBean_signature(),
CHECK);
@ -468,12 +468,9 @@ void DCmdFactory::send_notification_internal(TRAPS) {
instanceOop m = (instanceOop) result.get_jobject();
instanceHandle dcmd_mbean_h(THREAD, m);
Klass* k2 = Management::sun_management_DiagnosticCommandImpl_klass(CHECK);
instanceKlassHandle dcmd_mbean_klass(THREAD, k2);
if (!dcmd_mbean_h->is_a(k2)) {
if (!dcmd_mbean_h->is_a(k)) {
THROW_MSG(vmSymbols::java_lang_IllegalArgumentException(),
"ManagementFactory.getDiagnosticCommandMBean didn't return a DiagnosticCommandMBean instance");
"DiagnosticCommandImpl.getDiagnosticCommandMBean didn't return a DiagnosticCommandMBean instance");
}
JavaValue result2(T_VOID);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2011, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -77,7 +77,7 @@ bool GCNotifier::has_event() {
static Handle getGcInfoBuilder(GCMemoryManager *gcManager,TRAPS) {
Klass* k = Management::sun_management_GarbageCollectorImpl_klass(CHECK_NH);
Klass* k = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK_NH);
instanceKlassHandle gcMBeanKlass (THREAD, k);
instanceOop i = gcManager->get_memory_manager_instance(THREAD);
@ -214,8 +214,8 @@ void GCNotifier::sendNotificationInternal(TRAPS) {
Handle objName = java_lang_String::create_from_str(request->gcManager->name(), CHECK);
Handle objAction = java_lang_String::create_from_str(request->gcAction, CHECK);
Handle objCause = java_lang_String::create_from_str(request->gcCause, CHECK);
Klass* k = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK);
Klass* k = Management::sun_management_GarbageCollectorImpl_klass(CHECK);
instanceKlassHandle gc_mbean_klass(THREAD, k);
instanceOop gc_mbean = request->gcManager->get_memory_manager_instance(THREAD);

View file

@ -64,18 +64,16 @@ PerfVariable* Management::_begin_vm_creation_time = NULL;
PerfVariable* Management::_end_vm_creation_time = NULL;
PerfVariable* Management::_vm_init_done_time = NULL;
Klass* Management::_diagnosticCommandImpl_klass = NULL;
Klass* Management::_garbageCollectorExtImpl_klass = NULL;
Klass* Management::_garbageCollectorMXBean_klass = NULL;
Klass* Management::_gcInfo_klass = NULL;
Klass* Management::_managementFactoryHelper_klass = NULL;
Klass* Management::_memoryManagerMXBean_klass = NULL;
Klass* Management::_memoryPoolMXBean_klass = NULL;
Klass* Management::_memoryUsage_klass = NULL;
Klass* Management::_sensor_klass = NULL;
Klass* Management::_threadInfo_klass = NULL;
Klass* Management::_memoryUsage_klass = NULL;
Klass* Management::_memoryPoolMXBean_klass = NULL;
Klass* Management::_memoryManagerMXBean_klass = NULL;
Klass* Management::_garbageCollectorMXBean_klass = NULL;
Klass* Management::_managementFactory_klass = NULL;
Klass* Management::_garbageCollectorImpl_klass = NULL;
Klass* Management::_gcInfo_klass = NULL;
Klass* Management::_diagnosticCommandImpl_klass = NULL;
Klass* Management::_managementFactoryHelper_klass = NULL;
jmmOptionalSupport Management::_optional_support = {0};
TimeStamp Management::_stamp;
@ -255,18 +253,18 @@ Klass* Management::sun_management_Sensor_klass(TRAPS) {
return _sensor_klass;
}
Klass* Management::sun_management_ManagementFactory_klass(TRAPS) {
if (_managementFactory_klass == NULL) {
_managementFactory_klass = load_and_initialize_klass(vmSymbols::sun_management_ManagementFactory(), CHECK_NULL);
Klass* Management::sun_management_ManagementFactoryHelper_klass(TRAPS) {
if (_managementFactoryHelper_klass == NULL) {
_managementFactoryHelper_klass = load_and_initialize_klass(vmSymbols::sun_management_ManagementFactoryHelper(), CHECK_NULL);
}
return _managementFactory_klass;
return _managementFactoryHelper_klass;
}
Klass* Management::sun_management_GarbageCollectorImpl_klass(TRAPS) {
if (_garbageCollectorImpl_klass == NULL) {
_garbageCollectorImpl_klass = load_and_initialize_klass(vmSymbols::sun_management_GarbageCollectorImpl(), CHECK_NULL);
Klass* Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(TRAPS) {
if (_garbageCollectorExtImpl_klass == NULL) {
_garbageCollectorExtImpl_klass = load_and_initialize_klass(vmSymbols::com_sun_management_internal_GarbageCollectorExtImpl(), CHECK_NULL);
}
return _garbageCollectorImpl_klass;
return _garbageCollectorExtImpl_klass;
}
Klass* Management::com_sun_management_GcInfo_klass(TRAPS) {
@ -276,20 +274,13 @@ Klass* Management::com_sun_management_GcInfo_klass(TRAPS) {
return _gcInfo_klass;
}
Klass* Management::sun_management_DiagnosticCommandImpl_klass(TRAPS) {
Klass* Management::com_sun_management_internal_DiagnosticCommandImpl_klass(TRAPS) {
if (_diagnosticCommandImpl_klass == NULL) {
_diagnosticCommandImpl_klass = load_and_initialize_klass(vmSymbols::sun_management_DiagnosticCommandImpl(), CHECK_NULL);
_diagnosticCommandImpl_klass = load_and_initialize_klass(vmSymbols::com_sun_management_internal_DiagnosticCommandImpl(), CHECK_NULL);
}
return _diagnosticCommandImpl_klass;
}
Klass* Management::sun_management_ManagementFactoryHelper_klass(TRAPS) {
if (_managementFactoryHelper_klass == NULL) {
_managementFactoryHelper_klass = load_and_initialize_klass(vmSymbols::sun_management_ManagementFactoryHelper(), CHECK_NULL);
}
return _managementFactoryHelper_klass;
}
static void initialize_ThreadInfo_constructor_arguments(JavaCallArguments* args, ThreadSnapshot* snapshot, TRAPS) {
Handle snapshot_thread(THREAD, snapshot->threadObj());

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -42,18 +42,16 @@ private:
static TimeStamp _stamp; // Timestamp since vm init done time
// Management klasses
static Klass* _diagnosticCommandImpl_klass;
static Klass* _garbageCollectorExtImpl_klass;
static Klass* _garbageCollectorMXBean_klass;
static Klass* _gcInfo_klass;
static Klass* _managementFactoryHelper_klass;
static Klass* _memoryManagerMXBean_klass;
static Klass* _memoryPoolMXBean_klass;
static Klass* _memoryUsage_klass;
static Klass* _sensor_klass;
static Klass* _threadInfo_klass;
static Klass* _memoryUsage_klass;
static Klass* _memoryPoolMXBean_klass;
static Klass* _memoryManagerMXBean_klass;
static Klass* _garbageCollectorMXBean_klass;
static Klass* _managementFactory_klass;
static Klass* _garbageCollectorImpl_klass;
static Klass* _diagnosticCommandImpl_klass;
static Klass* _managementFactoryHelper_klass;
static Klass* _gcInfo_klass;
static Klass* load_and_initialize_klass(Symbol* sh, TRAPS);
public:
@ -93,17 +91,15 @@ public:
static Klass* java_lang_management_MemoryPoolMXBean_klass(TRAPS);
static Klass* java_lang_management_MemoryManagerMXBean_klass(TRAPS);
static Klass* java_lang_management_GarbageCollectorMXBean_klass(TRAPS);
static Klass* sun_management_ManagementFactoryHelper_klass(TRAPS)
NOT_MANAGEMENT_RETURN_(NULL);
static Klass* sun_management_Sensor_klass(TRAPS)
NOT_MANAGEMENT_RETURN_(NULL);
static Klass* sun_management_ManagementFactory_klass(TRAPS)
NOT_MANAGEMENT_RETURN_(NULL);
static Klass* sun_management_GarbageCollectorImpl_klass(TRAPS)
static Klass* com_sun_management_internal_GarbageCollectorExtImpl_klass(TRAPS)
NOT_MANAGEMENT_RETURN_(NULL);
static Klass* com_sun_management_GcInfo_klass(TRAPS)
NOT_MANAGEMENT_RETURN_(NULL);
static Klass* sun_management_DiagnosticCommandImpl_klass(TRAPS)
NOT_MANAGEMENT_RETURN_(NULL);
static Klass* sun_management_ManagementFactoryHelper_klass(TRAPS)
static Klass* com_sun_management_internal_DiagnosticCommandImpl_klass(TRAPS)
NOT_MANAGEMENT_RETURN_(NULL);
static instanceOop create_thread_info_instance(ThreadSnapshot* snapshot, TRAPS);

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -98,8 +98,7 @@ instanceOop MemoryManager::get_memory_manager_instance(TRAPS) {
if (mgr_obj == NULL) {
// It's ok for more than one thread to execute the code up to the locked region.
// Extra manager instances will just be gc'ed.
Klass* k = Management::sun_management_ManagementFactory_klass(CHECK_0);
instanceKlassHandle ik(THREAD, k);
Klass* k = Management::sun_management_ManagementFactoryHelper_klass(CHECK_0);
Handle mgr_name = java_lang_String::create_from_str(name(), CHECK_0);
@ -110,7 +109,14 @@ instanceOop MemoryManager::get_memory_manager_instance(TRAPS) {
Symbol* method_name = NULL;
Symbol* signature = NULL;
if (is_gc_memory_manager()) {
Klass* extKlass = Management::com_sun_management_internal_GarbageCollectorExtImpl_klass(CHECK_0);
// com.sun.management.GarbageCollectorMXBean is in jdk.management module which may not be present.
if (extKlass != NULL) {
k = extKlass;
}
method_name = vmSymbols::createGarbageCollector_name();
signature = vmSymbols::createGarbageCollector_signature();
args.push_oop(Handle()); // Argument 2 (for future extension)
} else {
@ -118,6 +124,8 @@ instanceOop MemoryManager::get_memory_manager_instance(TRAPS) {
signature = vmSymbols::createMemoryManager_signature();
}
instanceKlassHandle ik(THREAD, k);
JavaCalls::call_static(&result,
ik,
method_name,

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2014, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -86,7 +86,7 @@ instanceOop MemoryPool::get_memory_pool_instance(TRAPS) {
if (pool_obj == NULL) {
// It's ok for more than one thread to execute the code up to the locked region.
// Extra pool instances will just be gc'ed.
Klass* k = Management::sun_management_ManagementFactory_klass(CHECK_NULL);
Klass* k = Management::sun_management_ManagementFactoryHelper_klass(CHECK_NULL);
instanceKlassHandle ik(THREAD, k);
Handle pool_name = java_lang_String::create_from_str(_name, CHECK_NULL);

View file

@ -58,9 +58,11 @@
*/
import com.oracle.java.testlibrary.*;
import com.sun.management.HotSpotDiagnosticMXBean;
import java.lang.management.ManagementFactory;
import static com.oracle.java.testlibrary.Asserts.*;
import sun.hotspot.WhiteBox;
import sun.management.ManagementFactoryHelper;
public class TestSmallHeap {
@ -69,7 +71,9 @@ public class TestSmallHeap {
int pageSize = wb.getVMPageSize();
int heapBytesPerCard = 512;
long expectedMaxHeap = pageSize * heapBytesPerCard;
String maxHeap = ManagementFactoryHelper.getDiagnosticMXBean().getVMOption("MaxHeapSize").getValue();
String maxHeap
= ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class)
.getVMOption("MaxHeapSize").getValue();
assertEQ(Long.parseLong(maxHeap), expectedMaxHeap);
}
}

View file

@ -33,14 +33,15 @@
* @run main/othervm -XX:G1HeapRegionSize=64m -Xmx256m TestG1HeapRegionSize 33554432
*/
import sun.management.ManagementFactoryHelper;
import com.sun.management.HotSpotDiagnosticMXBean;
import com.sun.management.VMOption;
import java.lang.management.ManagementFactory;
public class TestG1HeapRegionSize {
public static void main(String[] args) {
HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
HotSpotDiagnosticMXBean diagnostic =
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
String expectedValue = getExpectedValue(args);
VMOption option = diagnostic.getVMOption("UseG1GC");

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2015,Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -21,7 +21,6 @@
* questions.
*/
import sun.management.ManagementFactoryHelper;
import com.sun.management.HotSpotDiagnosticMXBean;
import com.sun.management.VMOption;
@ -31,6 +30,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import com.oracle.java.testlibrary.*;
import java.lang.management.ManagementFactory;
import sun.hotspot.WhiteBox;
class DetermineMaxHeapForCompressedOops {
@ -43,7 +43,8 @@ class DetermineMaxHeapForCompressedOops {
class TestUseCompressedOopsErgoTools {
private static long getCompressedClassSpaceSize() {
HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
HotSpotDiagnosticMXBean diagnostic =
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
VMOption option = diagnostic.getVMOption("CompressedClassSpaceSize");
return Long.parseLong(option.getValue());
@ -174,4 +175,3 @@ class TestUseCompressedOopsErgoTools {
return expect(flags, false, false, 0);
}
}

View file

@ -34,11 +34,11 @@
* TestHumongousShrinkHeap
*/
import com.sun.management.HotSpotDiagnosticMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage;
import java.util.ArrayList;
import java.util.List;
import sun.management.ManagementFactoryHelper;
import static com.oracle.java.testlibrary.Asserts.*;
public class TestHumongousShrinkHeap {
@ -83,9 +83,11 @@ public class TestHumongousShrinkHeap {
"committed free heap size is not less than committed full heap size, heap hasn't been shrunk?%n"
+ "%s = %s%n%s = %s",
MIN_FREE_RATIO_FLAG_NAME,
ManagementFactoryHelper.getDiagnosticMXBean().getVMOption(MIN_FREE_RATIO_FLAG_NAME).getValue(),
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class)
.getVMOption(MIN_FREE_RATIO_FLAG_NAME).getValue(),
MAX_FREE_RATIO_FLAG_NAME,
ManagementFactoryHelper.getDiagnosticMXBean().getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue()
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class)
.getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue()
));
}

View file

@ -39,10 +39,10 @@ import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage;
import java.util.ArrayList;
import java.util.List;
import sun.management.ManagementFactoryHelper;
import static com.oracle.java.testlibrary.Asserts.*;
import com.oracle.java.testlibrary.ProcessTools;
import com.oracle.java.testlibrary.OutputAnalyzer;
import com.sun.management.HotSpotDiagnosticMXBean;
public class TestShrinkDefragmentedHeap {
// Since we store all the small objects, they become old and old regions are also allocated at the bottom of the heap
@ -144,9 +144,11 @@ public class TestShrinkDefragmentedHeap {
"committed free heap size is not less than committed full heap size, heap hasn't been shrunk?%n"
+ "%s = %s%n%s = %s",
MIN_FREE_RATIO_FLAG_NAME,
ManagementFactoryHelper.getDiagnosticMXBean().getVMOption(MIN_FREE_RATIO_FLAG_NAME).getValue(),
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class)
.getVMOption(MIN_FREE_RATIO_FLAG_NAME).getValue(),
MAX_FREE_RATIO_FLAG_NAME,
ManagementFactoryHelper.getDiagnosticMXBean().getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue()
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class)
.getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue()
);
}

View file

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -25,14 +25,11 @@
* Common helpers for TestSummarizeRSetStats* tests
*/
import sun.management.ManagementFactoryHelper;
import com.sun.management.HotSpotDiagnosticMXBean;
import com.sun.management.VMOption;
import com.oracle.java.testlibrary.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.lang.Thread;
import java.lang.management.ManagementFactory;
import java.util.ArrayList;
import java.util.Arrays;
@ -74,7 +71,8 @@ public class TestSummarizeRSetStatsTools {
// the VM is currently run using G1GC, i.e. trying to test G1 functionality.
public static boolean testingG1GC() {
HotSpotDiagnosticMXBean diagnostic = ManagementFactoryHelper.getDiagnosticMXBean();
HotSpotDiagnosticMXBean diagnostic =
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class);
VMOption option = diagnostic.getVMOption("UseG1GC");
if (option.getValue().equals("false")) {
@ -150,4 +148,3 @@ public class TestSummarizeRSetStatsTools {
}
}
}

View file

@ -33,8 +33,8 @@ import com.oracle.java.testlibrary.DynamicVMOption;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryUsage;
import java.util.ArrayList;
import sun.management.ManagementFactoryHelper;
import static com.oracle.java.testlibrary.Asserts.assertLessThan;
import com.sun.management.HotSpotDiagnosticMXBean;
public class TestDynShrinkHeap {
@ -63,9 +63,11 @@ public class TestDynShrinkHeap {
"committed free heap size is not less than committed full heap size, heap hasn't been shrunk?%n"
+ "%s = %s%n%s = %s",
MIN_FREE_RATIO_FLAG_NAME,
ManagementFactoryHelper.getDiagnosticMXBean().getVMOption(MIN_FREE_RATIO_FLAG_NAME).getValue(),
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class)
.getVMOption(MIN_FREE_RATIO_FLAG_NAME).getValue(),
MAX_FREE_RATIO_FLAG_NAME,
ManagementFactoryHelper.getDiagnosticMXBean().getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue()
ManagementFactory.getPlatformMXBean(HotSpotDiagnosticMXBean.class)
.getVMOption(MAX_FREE_RATIO_FLAG_NAME).getValue()
));
}