summaryrefslogtreecommitdiff
path: root/src/ToolBox
diff options
context:
space:
mode:
authorMaoni Stephens <Maoni0@users.noreply.github.com>2019-01-29 13:09:32 -0800
committerGitHub <noreply@github.com>2019-01-29 13:09:32 -0800
commited52a006c01a582d4d34add40c318d6f324b99ba (patch)
tree206844e7a9ececb7960a9cdd47e899718269644a /src/ToolBox
parent930abba4060fb528db2bb9835a1bc5a6e684bfec (diff)
downloadcoreclr-ed52a006c01a582d4d34add40c318d6f324b99ba.tar.gz
coreclr-ed52a006c01a582d4d34add40c318d6f324b99ba.tar.bz2
coreclr-ed52a006c01a582d4d34add40c318d6f324b99ba.zip
To support container scenario, 2 HardLimit configs are added - (#22180)
GCHeapHardLimit - specifies a hard limit for the GC heap GCHeapHardLimitPercent - specifies a percentage of the physical memory this process is allowed to use If both are specified, GCHeapHardLimit is checked first and only when it's not specified would we check GCHeapHardLimitPercent. If neither is specified but the process is running inside a container with a memory limit specified, we will take this as the hard limit: max (20mb, 75% of the memory limit on the container) If one of the HardLimit configs is specified, and the process is running inside a container with a memory limit, the GC heap usage will not exceed the HardLimit but the total memory is still the memory limit on the container so when we calculate the memory load it's based off the container memory limit. An example, process is running inside a container with 200mb limit user also specified GCHeapHardLimit as 100mb. if 50mb out of the 100mb is used for GC, and 100mb is used for other things, the memory load is (50 + 100)/200 = 75%. Some notes on these configs - + The limit is the commit size. + This is only supported on 64-bit. + For Server GC the minimum *reserved* segment size is 16mb per heap, this is to avoid the scenario where the hard limit is small but the process can use many procs and we end up with tiny segments which doesn't make sense. We then keep track of the committed on the segments so the total does not exceed the hard limit.
Diffstat (limited to 'src/ToolBox')
-rw-r--r--src/ToolBox/SOS/Strike/sos.def2
-rw-r--r--src/ToolBox/SOS/Strike/strike.cpp19
2 files changed, 11 insertions, 10 deletions
diff --git a/src/ToolBox/SOS/Strike/sos.def b/src/ToolBox/SOS/Strike/sos.def
index 0c47279d75..62560c09fe 100644
--- a/src/ToolBox/SOS/Strike/sos.def
+++ b/src/ToolBox/SOS/Strike/sos.def
@@ -23,11 +23,9 @@ EXPORTS
dumpdelegate=DumpDelegate
DumpDomain
dumpdomain=DumpDomain
-#ifdef TRACE_GC
DumpGCLog
dumpgclog=DumpGCLog
dlog=DumpGCLog
-#endif
DumpGCData
dumpgcdata=DumpGCData
dgc=DumpGCData
diff --git a/src/ToolBox/SOS/Strike/strike.cpp b/src/ToolBox/SOS/Strike/strike.cpp
index e2c77e47ba..2a24245ee0 100644
--- a/src/ToolBox/SOS/Strike/strike.cpp
+++ b/src/ToolBox/SOS/Strike/strike.cpp
@@ -9414,8 +9414,7 @@ DECLARE_API(DumpLog)
return Status;
}
-#ifdef TRACE_GC
-
+#ifndef FEATURE_PAL
DECLARE_API (DumpGCLog)
{
INIT_API_NODAC();
@@ -9428,6 +9427,10 @@ DECLARE_API (DumpGCLog)
}
const char* fileName = "GCLog.txt";
+ int iLogSize = 1024*1024;
+ BYTE* bGCLog = NULL;
+ int iRealLogSize = iLogSize - 1;
+ DWORD dwWritten = 0;
while (isspace (*args))
args ++;
@@ -9472,8 +9475,7 @@ DECLARE_API (DumpGCLog)
goto exit;
}
- int iLogSize = 1024*1024;
- BYTE* bGCLog = new NOTHROW BYTE[iLogSize];
+ bGCLog = new NOTHROW BYTE[iLogSize];
if (bGCLog == NULL)
{
ReportOOM();
@@ -9486,7 +9488,6 @@ DECLARE_API (DumpGCLog)
ExtOut("failed to read memory from %08x\n", dwAddr);
}
- int iRealLogSize = iLogSize - 1;
while (iRealLogSize >= 0)
{
if (bGCLog[iRealLogSize] != '*')
@@ -9497,13 +9498,17 @@ DECLARE_API (DumpGCLog)
iRealLogSize--;
}
- DWORD dwWritten = 0;
WriteFile (hGCLog, bGCLog, iRealLogSize + 1, &dwWritten, NULL);
Status = S_OK;
exit:
+ if (bGCLog != NULL)
+ {
+ delete [] bGCLog;
+ }
+
if (hGCLog != INVALID_HANDLE_VALUE)
{
CloseHandle (hGCLog);
@@ -9518,9 +9523,7 @@ exit:
return Status;
}
-#endif //TRACE_GC
-#ifndef FEATURE_PAL
DECLARE_API (DumpGCConfigLog)
{
INIT_API();