summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndy Hanson <anhans@microsoft.com>2019-07-08 16:12:06 -0700
committerJan Kotas <jkotas@microsoft.com>2019-07-08 16:12:06 -0700
commit11137fbe46f524dfd6c2f7bb2a77035aa225524c (patch)
tree116160fa9d0ed8c8cb2fa1cb6ac407e476ab96cf
parent8749c016e520bcaa23c56a862fe5f57eba1b879b (diff)
downloadcoreclr-11137fbe46f524dfd6c2f7bb2a77035aa225524c.tar.gz
coreclr-11137fbe46f524dfd6c2f7bb2a77035aa225524c.tar.bz2
coreclr-11137fbe46f524dfd6c2f7bb2a77035aa225524c.zip
Return HardLimitBytes from GCMemoryInfo.TotalAvailableMemoryBytes (#25437)
* Add property HardLimitBytes to GCMemoryInfo This adds a new property HardLimitBytes. Unlike TotalAvailableMemoryBytes, this will reflect an explicitly set COMPLUS_GCHeapHardLimit. It will also reflect the fraction of a container's size that we use, where TotalAvailableMemoryBytes is the total container size. Normally, though, it is equal to TotalAvailableMemoryBytes. Fix #38821 * Remove HardLimitBytes; have TotalAvailableMemoryBytes take on its behavior * Fix typos * Separate total_physical_mem and heap_hard_limit so we can compute highMemoryLoadThresholdBytes and memoryLoadBytes * Do more work in gc.cpp instead of Gc.cs * Consistently end names in "Bytes"
-rw-r--r--src/System.Private.CoreLib/shared/System/GCMemoryInfo.cs7
-rw-r--r--src/System.Private.CoreLib/src/System/GC.cs39
-rw-r--r--src/gc/gc.cpp24
-rw-r--r--src/gc/gcimpl.h11
-rw-r--r--src/gc/gcinterface.h11
-rw-r--r--src/vm/comutilnative.cpp8
-rw-r--r--src/vm/comutilnative.h2
7 files changed, 57 insertions, 45 deletions
diff --git a/src/System.Private.CoreLib/shared/System/GCMemoryInfo.cs b/src/System.Private.CoreLib/shared/System/GCMemoryInfo.cs
index 72c2aca14d..850f1256eb 100644
--- a/src/System.Private.CoreLib/shared/System/GCMemoryInfo.cs
+++ b/src/System.Private.CoreLib/shared/System/GCMemoryInfo.cs
@@ -17,7 +17,12 @@ namespace System
public long MemoryLoadBytes { get; }
/// <summary>
- /// Total available memory for the GC to use when the last GC ocurred. By default this is the physical memory on the machine, but it may be customized by specifying a HardLimit.
+ /// Total available memory for the GC to use when the last GC ocurred.
+ ///
+ /// If the environment variable COMPlus_GCHeapHardLimit is set,
+ /// or "Server.GC.HeapHardLimit" is in runtimeconfig.json, this will come from that.
+ /// If the program is run in a container, this will be an implementation-defined fraction of the container's size.
+ /// Else, this is the physical memory on the machine that was available for the GC to use when the last GC occurred.
/// </summary>
public long TotalAvailableMemoryBytes { get; }
diff --git a/src/System.Private.CoreLib/src/System/GC.cs b/src/System.Private.CoreLib/src/System/GC.cs
index 89c277e544..e67c043e62 100644
--- a/src/System.Private.CoreLib/src/System/GC.cs
+++ b/src/System.Private.CoreLib/src/System/GC.cs
@@ -54,26 +54,28 @@ namespace System
public static class GC
{
[MethodImplAttribute(MethodImplOptions.InternalCall)]
- internal static extern void GetMemoryInfo(out uint highMemLoadThreshold,
- out ulong totalPhysicalMem,
- out uint lastRecordedMemLoad,
+ internal static extern void GetMemoryInfo(out ulong highMemLoadThresholdBytes,
+ out ulong totalAvailableMemoryBytes,
+ out ulong lastRecordedMemLoadBytes,
+ out uint lastRecordedMemLoadPct,
// The next two are size_t
- out UIntPtr lastRecordedHeapSize,
- out UIntPtr lastRecordedFragmentation);
+ out UIntPtr lastRecordedHeapSizeBytes,
+ out UIntPtr lastRecordedFragmentationBytes);
public static GCMemoryInfo GetGCMemoryInfo()
{
- GetMemoryInfo(out uint highMemLoadThreshold,
- out ulong totalPhysicalMem,
- out uint lastRecordedMemLoad,
- out UIntPtr lastRecordedHeapSize,
- out UIntPtr lastRecordedFragmentation);
+ GetMemoryInfo(out ulong highMemLoadThresholdBytes,
+ out ulong totalAvailableMemoryBytes,
+ out ulong lastRecordedMemLoadBytes,
+ out uint _,
+ out UIntPtr lastRecordedHeapSizeBytes,
+ out UIntPtr lastRecordedFragmentationBytes);
- return new GCMemoryInfo((long)((double)highMemLoadThreshold / 100 * totalPhysicalMem),
- (long)((double)lastRecordedMemLoad / 100 * totalPhysicalMem),
- (long)totalPhysicalMem,
- (long)(ulong)lastRecordedHeapSize,
- (long)(ulong)lastRecordedFragmentation);
+ return new GCMemoryInfo(highMemoryLoadThresholdBytes: (long)highMemLoadThresholdBytes,
+ memoryLoadBytes: (long)lastRecordedMemLoadBytes,
+ totalAvailableMemoryBytes: (long)totalAvailableMemoryBytes,
+ heapSizeBytes: (long)(ulong)lastRecordedHeapSizeBytes,
+ fragmentedBytes: (long)(ulong)lastRecordedFragmentationBytes);
}
[DllImport(JitHelpers.QCall, CharSet = CharSet.Unicode)]
@@ -541,13 +543,14 @@ namespace System
private static float GetMemoryLoad()
{
- GetMemoryInfo(out uint _,
+ GetMemoryInfo(out ulong _,
out ulong _,
- out uint lastRecordedMemLoad,
+ out ulong _,
+ out uint lastRecordedMemLoadPct,
out UIntPtr _,
out UIntPtr _);
- return (float)lastRecordedMemLoad / 100;
+ return (float)lastRecordedMemLoadPct;
}
private static bool InvokeMemoryLoadChangeNotifications()
diff --git a/src/gc/gc.cpp b/src/gc/gc.cpp
index f4d877fe88..f107b134ca 100644
--- a/src/gc/gc.cpp
+++ b/src/gc/gc.cpp
@@ -36814,17 +36814,19 @@ unsigned int GCHeap::GetCondemnedGeneration()
return gc_heap::settings.condemned_generation;
}
-void GCHeap::GetMemoryInfo(uint32_t* highMemLoadThreshold,
- uint64_t* totalPhysicalMem,
- uint32_t* lastRecordedMemLoad,
- size_t* lastRecordedHeapSize,
- size_t* lastRecordedFragmentation)
-{
- *highMemLoadThreshold = gc_heap::high_memory_load_th;
- *totalPhysicalMem = gc_heap::total_physical_mem;
- *lastRecordedMemLoad = gc_heap::last_gc_memory_load;
- *lastRecordedHeapSize = gc_heap::last_gc_heap_size;
- *lastRecordedFragmentation = gc_heap::last_gc_fragmentation;
+void GCHeap::GetMemoryInfo(uint64_t* highMemLoadThresholdBytes,
+ uint64_t* totalAvailableMemoryBytes,
+ uint64_t* lastRecordedMemLoadBytes,
+ uint32_t* lastRecordedMemLoadPct,
+ size_t* lastRecordedHeapSizeBytes,
+ size_t* lastRecordedFragmentationBytes)
+{
+ *highMemLoadThresholdBytes = (uint64_t) (((double)gc_heap::high_memory_load_th) / 100 * gc_heap::total_physical_mem);
+ *totalAvailableMemoryBytes = gc_heap::heap_hard_limit != 0 ? gc_heap::heap_hard_limit : gc_heap::total_physical_mem;
+ *lastRecordedMemLoadBytes = (uint64_t) (((double)gc_heap::last_gc_memory_load) / 100 * gc_heap::total_physical_mem);
+ *lastRecordedMemLoadPct = gc_heap::last_gc_memory_load;
+ *lastRecordedHeapSizeBytes = gc_heap::last_gc_heap_size;
+ *lastRecordedFragmentationBytes = gc_heap::last_gc_fragmentation;
}
int GCHeap::GetGcLatencyMode()
diff --git a/src/gc/gcimpl.h b/src/gc/gcimpl.h
index b1d4e07981..965bfa6987 100644
--- a/src/gc/gcimpl.h
+++ b/src/gc/gcimpl.h
@@ -171,11 +171,12 @@ public:
unsigned GetCondemnedGeneration();
- void GetMemoryInfo(uint32_t* highMemLoadThreshold,
- uint64_t* totalPhysicalMem,
- uint32_t* lastRecordedMemLoad,
- size_t* lastRecordedHeapSize,
- size_t* lastRecordedFragmentation);
+ void GetMemoryInfo(uint64_t* highMemLoadThresholdBytes,
+ uint64_t* totalAvailableMemoryBytes,
+ uint64_t* lastRecordedMemLoadBytes,
+ uint32_t* lastRecordedMemLoadPct,
+ size_t* lastRecordedHeapSizeBytes,
+ size_t* lastRecordedFragmentationBytes);
int GetGcLatencyMode();
int SetGcLatencyMode(int newLatencyMode);
diff --git a/src/gc/gcinterface.h b/src/gc/gcinterface.h
index 6d09a62824..062743ff37 100644
--- a/src/gc/gcinterface.h
+++ b/src/gc/gcinterface.h
@@ -605,11 +605,12 @@ public:
// lastRecordedMemLoad - physical memory load in percentage recorded in the last GC
// lastRecordedHeapSize - total managed heap size recorded in the last GC
// lastRecordedFragmentation - total fragmentation in the managed heap recorded in the last GC
- virtual void GetMemoryInfo(uint32_t* highMemLoadThreshold,
- uint64_t* totalPhysicalMem,
- uint32_t* lastRecordedMemLoad,
- size_t* lastRecordedHeapSize,
- size_t* lastRecordedFragmentation) = 0;
+ virtual void GetMemoryInfo(uint64_t* highMemLoadThresholdBytes,
+ uint64_t* totalPhysicalMemoryBytes,
+ uint64_t* lastRecordedMemLoadBytes,
+ uint32_t* lastRecordedMemLoadPct,
+ size_t* lastRecordedHeapSizeBytes,
+ size_t* lastRecordedFragmentationBytes) = 0;
// Gets the current GC latency mode.
virtual int GetGcLatencyMode() = 0;
diff --git a/src/vm/comutilnative.cpp b/src/vm/comutilnative.cpp
index 930905b780..bdb23923d6 100644
--- a/src/vm/comutilnative.cpp
+++ b/src/vm/comutilnative.cpp
@@ -877,15 +877,15 @@ UINT64 GCInterface::m_remPressure[NEW_PRESSURE_COUNT] = {0, 0, 0, 0}; // his
// (m_iteration % NEW_PRESSURE_COUNT) is used as an index into m_addPressure and m_remPressure
UINT GCInterface::m_iteration = 0;
-FCIMPL5(void, GCInterface::GetMemoryInfo, UINT32* highMemLoadThreshold, UINT64* totalPhysicalMem, UINT32* lastRecordedMemLoad, size_t* lastRecordedHeapSize, size_t* lastRecordedFragmentation)
+FCIMPL6(void, GCInterface::GetMemoryInfo, UINT64* highMemLoadThreshold, UINT64* totalAvailableMemoryBytes, UINT64* lastRecordedMemLoadBytes, UINT32* lastRecordedMemLoadPct, size_t* lastRecordedHeapSizeBytes, size_t* lastRecordedFragmentationBytes)
{
FCALL_CONTRACT;
FC_GC_POLL_NOT_NEEDED();
- return GCHeapUtilities::GetGCHeap()->GetMemoryInfo(highMemLoadThreshold, totalPhysicalMem,
- lastRecordedMemLoad,
- lastRecordedHeapSize, lastRecordedFragmentation);
+ return GCHeapUtilities::GetGCHeap()->GetMemoryInfo(highMemLoadThreshold, totalAvailableMemoryBytes,
+ lastRecordedMemLoadBytes, lastRecordedMemLoadPct,
+ lastRecordedHeapSizeBytes, lastRecordedFragmentationBytes);
}
FCIMPLEND
diff --git a/src/vm/comutilnative.h b/src/vm/comutilnative.h
index 6afbc5a45e..5267d6ef73 100644
--- a/src/vm/comutilnative.h
+++ b/src/vm/comutilnative.h
@@ -110,7 +110,7 @@ public:
static FORCEINLINE UINT64 InterlockedAdd(UINT64 *pAugend, UINT64 addend);
static FORCEINLINE UINT64 InterlockedSub(UINT64 *pMinuend, UINT64 subtrahend);
- static FCDECL5(void, GetMemoryInfo, UINT32* highMemLoadThreshold, UINT64* totalPhysicalMem, UINT32* lastRecordedMemLoad, size_t* lastRecordedHeapSize, size_t* lastRecordedFragmentation);
+ static FCDECL6(void, GetMemoryInfo, UINT64* highMemLoadThresholdBytes, UINT64* totalAvailableMemoryBytes, UINT64* lastRecordedMemLoadBytes, UINT32* lastRecordedMemLoadPct, size_t* lastRecordedHeapSizBytes, size_t* lastRecordedFragmentationBytes);
static FCDECL0(int, GetGcLatencyMode);
static FCDECL1(int, SetGcLatencyMode, int newLatencyMode);
static FCDECL0(int, GetLOHCompactionMode);