今天学习的是设置堆大小的参数:
- Xmx
- Xms
- InitialHeapSize
- MaxHeapSize
- Xmx和MaxHeapSize是等价的,都是设置堆的最大值,比如-Xmx100M和-XX:MaxHeapSize=100M是等价的
- Xms和InitialHeapSize是等价的,都是设置堆的初始值(最小值),比如-Xms100M和-XX:InitialHeapSize=100M是等价的
- 一般情况下,在生产环境中,初始堆大小-Xms与最大堆大小-Xmx被设置为相等。-Xmx不能比-Xms小,如果小的话,进程会起不起来。假设如果在生产环境中,初始堆大小-Xms与最大堆大小-Xmx是不等的,那么JVM就会根据堆内存的使用情况,动态的向操作系统申请内存,扩大或者是缩小,以-Xmx和-Xms的值为上下界,这里的每一次调整都会产生一定的系统开销,虽然做到了动态申请堆大小的能力,不过生产环境中,很少说一台机器跑好多个JAVA程序,一般情况下都是一对一,那么动态申请调整堆大小就没有意义了,因为不管内存申请的多还是少,都只是这个JAVA程序在用,不需要给其他的程序腾出空间,相反的,如果把初始堆大小-Xms与最大堆大小-Xmx设置成不相等,那么反而画蛇添足,因为如果初始堆大小-Xms与最大堆大小-Xmx不相等,那么就会需要申请空间时,而每次申请空间,就会产生相应的系统开销,同时如果一开始堆大小是-Xms,会增加程序运行时进行gc的次数,降低程序的性能。
- -Xms必须不小于1M
参考链接:https://blog.csdn.net/weixin_38106322/article/details/108197030
https://tool.lu/index.php/en_US/deck/kD/detail