diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c
index bf924c25f7469a0016eeae6aa5730cddc6999cac..12bb44ce98cc3d21b9ccc3f91e95e614dec7bfdf 100644
--- a/rts/RtsFlags.c
+++ b/rts/RtsFlags.c
@@ -13,6 +13,7 @@
 #include "RtsUtils.h"
 #include "Profiling.h"
 #include "RtsFlags.h"
+#include "sm/OSMem.h"
 
 #ifdef HAVE_CTYPE_H
 #include <ctype.h>
@@ -93,10 +94,15 @@ static void errorRtsOptsDisabled(HsBool is_hs_main, const char *s);
 
 void initRtsFlagsDefaults(void)
 {
+    StgWord64 maxStkSize = 8 * getPhysicalMemorySize() / 10;
+    // if getPhysicalMemorySize fails just move along with an 8MB limit
+    if (maxStkSize == 0)
+        maxStkSize = (8 * 1024 * 1024) / sizeof(W_);
+
     RtsFlags.GcFlags.statsFile		= NULL;
     RtsFlags.GcFlags.giveStats		= NO_GC_STATS;
 
-    RtsFlags.GcFlags.maxStkSize		= (8 * 1024 * 1024) / sizeof(W_);
+    RtsFlags.GcFlags.maxStkSize		= maxStkSize;
     RtsFlags.GcFlags.initialStkSize	= 1024 / sizeof(W_);
     RtsFlags.GcFlags.stkChunkSize       = (32 * 1024) / sizeof(W_);
     RtsFlags.GcFlags.stkChunkBufferSize = (1 * 1024) / sizeof(W_);