很多时候,我们运行的Java程序并没有设定堆的内存限制参数,正常来说可以有两个参数来指定初始分配的堆内存和堆内存的最大值,分别为:

-Xmx 用来设置你的应用程序(不是JVM)能够使用的最大内存数(相当于 -XX:MaxHeapSize)。

-Xms 用来设置程序初始化的时候内存栈的大小(相当于 -XX:MaxNewSize)。

另外还有一个 -Xss 规定了每个线程堆栈的大小。一般情况下256K是足够了,该值影响了此进程中并发线程数大小(相当于 -XX:ThreadStackSize)。

有同学要问了,如果我没有设置这些参数,默认值是多少呢?

一般来说,就JDK8而言:

-Xmx 的默认值为你当前机器最大内存的 1/4

-Xms 的默认值为你当前机器最大内存的 1/64 (这个值要反复测试并通过监控调整一个合适的值,是因为当Heap不够用时,会发生内存抖动,影响程序运行稳定性)

-Xss 的默认值好像和平台有关(不同平台默认值不同),我们最常用的Linux64位服务器默认值好像是1024k(这个我不确定)。在相同物理内存下,减小这个值能生成更多的线程,这个参数在高并发的情况下对性能影响比较明显,需要花比较长的时间进行严格的测试来定义一个合适的值(如果栈不深128k够用的,大的应用建议使用256k)。

对于堆的初始值和最大值,可以使用如下命令查看:

在Windows里:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

在Linux里:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

例入下面是一个启动Java程序的示例:

java

-Xms64m #JVM启动时的初始堆大小

-Xmx128m #最大堆大小

-Xmn64m #年轻代的大小,其余的空间是老年代

-XX:MaxMetaspaceSize=128m #

-XX:CompressedClassSpaceSize=64m #使用 -XX:CompressedClassSpaceSize 设置为压缩类空间保留的最大内存。

-Xss256k #线程

-XX:InitialCodeCacheSize=4m #

-XX:ReservedCodeCacheSize=8m # 这是由 JIT(即时)编译器编译为本地代码的本机代码(如JNI)或 Java 方法的空间

-XX:MaxDirectMemorySize=16m

-jar app.jar

这有一篇比较详细的参数说明:https://www.cnblogs.com/syuf/p/10183683.html

另外再给一个文章参考:https://www.cnblogs.com/jpfss/p/9753215.html

(END)

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐