Class AllocationMonitor
In order to keep track of allocated native memory, this class uses the GMP
fuctions mp_set_memory_functions and mp_get_memory_functions
(see the
Custom
Allocation page of the GMP manual). Since this slows down allocation, the
feature is normally disabled and may be enable by calling the
enable() static method.
It is important to enable allocation monitor when a program builds many big JGMP objects. In this case, since the size occupied by a JGMP object in the Java heap is only a fraction of the size occupied in native memory, the program may consume all the native memory without the JVM feeling the need to call the garbage collector to reclaim heap space. This may happen, in particular, when making use of the immutable API.
The current allocator has three tunables: allocationThreshold,
lowerThreshold and maxTimeout. Every allocation or
reallocation of native memory by the GMP library makes the allocated size
larger than the allocation threshold, causes a call to the Java garabage
collector. Then, we wait until the allocated memory falls below the lower
threshold, or until a timeout has expired. The length of the timeout is
dinamically computed by the allocation monitor, but it never exceed the value
of the maxTimeout tunable.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate static classThe custom allocator function.private static classThe custom deallocator.private static classThe custom reallocator. -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate static AllocFuncprivate static AllocFuncByReferenceprivate static AtomicLongThe amount of native memory allocated by GMP, as recorded by the allocation monitor.private static longThe allocation threshold.private static intThe debug level of the allocation monitor.private static FreeFuncprivate static FreeFuncByReferenceprivate static intKeep track of the number of times that GC has been called by the allocation monitor.private static longThe lower threshold.private static longThe maximum amount of memory allocated by GMP.private static intThe maximum delay for a single timeout step.private static ReallocFuncprivate static ReallocFuncByReferenceprivate static intThe current delay for a single timeout step.private static final intNumber of steps in which we divide the timeout interval. -
Constructor Summary
ConstructorsModifierConstructorDescriptionprivateA private constructor, since this class should never be instantiated. -
Method Summary
Modifier and TypeMethodDescription(package private) static voidcheckGC(long increase) Check if the garbage collector needs to be invoked, and update the numCrossed and allocation thresholds.private static voidPrint debugging information.static voiddisable()Disable the allocation monitor.static voidenable()Enable the allocation monitor.static longReturn the amount of native memory allocated by JGMP, as recorded by the allocation monitor.static longReturn the current allocation threshold.static intReturn the current debug level of the allocation monitor.static intReturn the number of times that GC has been called by the allocation monitor.static longReturn the current value of the lower threshold.static longReturn the maximum amount of memory ever allocated by the JGMP at the same moment, as recorded by the allocation monitor.static intReturn the current timeout value.static voidsetAllocationThreshold(long value) Set the current allocation threshold.static voidsetDebugLevel(int debugLevel) Set the debug level of the allocation monitor.static voidsetLowerThreshold(long value) Set the current value of the lower threshold.static voidsetTimeout(int value) Set the maximum timeout value.
-
Field Details
-
debugLevel
private static volatile int debugLevelThe debug level of the allocation monitor. -
allocatedSize
The amount of native memory allocated by GMP, as recorded by the allocation monitor. It is an `AtomicLong` since it might be increased concurrently by multple threads. -
allocationThreshold
private static volatile long allocationThresholdThe allocation threshold. -
lowerThreshold
private static volatile long lowerThresholdThe lower threshold. -
TIMEOUT_STEPS
private static final int TIMEOUT_STEPSNumber of steps in which we divide the timeout interval.- See Also:
-
maxStepTimeout
private static volatile int maxStepTimeoutThe maximum delay for a single timeout step. -
stepTimeout
private static volatile int stepTimeoutThe current delay for a single timeout step. -
gcCalls
private static volatile int gcCallsKeep track of the number of times that GC has been called by the allocation monitor. -
maxAllocatedSize
private static volatile long maxAllocatedSizeThe maximum amount of memory allocated by GMP. -
af
-
rf
-
ff
-
afpOld
-
rfpOld
-
ffpOld
-
-
Constructor Details
-
AllocationMonitor
private AllocationMonitor()A private constructor, since this class should never be instantiated.
-
-
Method Details
-
setDebugLevel
public static void setDebugLevel(int debugLevel) Set the debug level of the allocation monitor. The greater the value, the more debug messages are sent to the standard error. Zero and negative numbers mean that no debug messages are generated. -
getDebugLevel
public static int getDebugLevel()Return the current debug level of the allocation monitor. -
getAllocatedSize
public static long getAllocatedSize()Return the amount of native memory allocated by JGMP, as recorded by the allocation monitor. -
getAllocationThreshold
public static long getAllocationThreshold()Return the current allocation threshold. -
setAllocationThreshold
public static void setAllocationThreshold(long value) Set the current allocation threshold. This method also sets the default value for the lower threshold, which is 15/16 of the allocation threshold. -
getLowerThreshold
public static long getLowerThreshold()Return the current value of the lower threshold. -
setLowerThreshold
public static void setLowerThreshold(long value) Set the current value of the lower threshold. -
setTimeout
public static void setTimeout(int value) Set the maximum timeout value. The default value is 200 ms. -
getTimeout
public static int getTimeout()Return the current timeout value. -
getGcCalls
public static int getGcCalls()Return the number of times that GC has been called by the allocation monitor. -
getMaxAllocatedSize
public static long getMaxAllocatedSize()Return the maximum amount of memory ever allocated by the JGMP at the same moment, as recorded by the allocation monitor. -
debugInfo
private static void debugInfo()Print debugging information. -
checkGC
static void checkGC(long increase) Check if the garbage collector needs to be invoked, and update the numCrossed and allocation thresholds. -
enable
public static void enable()Enable the allocation monitor. Nothing happens if the monitor is already enabled. -
disable
public static void disable()Disable the allocation monitor. Nothing happens if the monitor is already disabled.
-