http://arganzheng.life/spark-executor-memory-management.html
https://zhuanlan.zhihu.com/p/115888408
依照java内存的划分,其堆内存分为eden、survivor*2和tenured部分,同时刻只有一个survivor可用,因而指定的堆内存实际可用的内存即Runtime.getRuntime.maxMemory查到的通常比Xmx指定的要小,一般为90-95%的样子,在这5g的executor中其值为4772593664,约为88%。
(4772593664-300102401024)0.6=值为2.67G,这就是上面看到的2.7G的来源,实际这里显示时不是将字节除以102410241024,而是直接除以10001000*1000得到的。
简单点:(5G * 90% -0.3)*0.6 = 2.52 实际上比这个大一点点