以应用服务2核、8G内存为例,部署单进程JVM,JDK版本1.8
主要占内存的地方:
- 堆
- 栈
- meta space
- 直接内存区
如下图:
其中:
- meta space线程共享,建议128M~256M
- 栈线程独有,建议224K~2M,在64位Linux上HotSpot的线程栈容量默认是1MB
- 直接内存区(netty、NIO等使用,如dubbo)估计512M~1G
所以,如果应用的QPS达到500,栈最多占用内存 2M*500 = 1G,加上meta space 0.5G,本地内存1G,共占用了2.5G,服务器本身留1G,则堆最多能设置为4.5G
综上,建议设置值:
- 堆:4G
- 栈:256K
- meta space:128M ~ 256 M(不动)
- 直接内存区:512M ~ 1G (不动)
对应的JVM设置参数为:
-Xmx4g -Xms4g -Xss256k -XX:MetaspaceSize=128M -XX:MaxMetaspaceSize=256M