通常对于很多java应用来说,当打成jar包后会下意识的使用java -jar xxx.jar来运行应用,而不是根据自己业务或实际debug的一些需求来增加一些JVM的辅助参数,这样导致的问题就是,后续出了问题之后不容易进行管理以及相关故障追踪和排查。

那么问题来了,当你在jar -jar的时候,默认的JVM堆内存是多少呢?

其实,JVM在不同架构(配置)的OS下回体现出不同的JVM配置,比如在一个8c16g的ECS上,默认的Heap值如下:

1
2
3
4
5
6
7
$ java -XX:+PrintFlagsFinal -version | grep HeapSize
    uintx ErgoHeapSizeLimit                         = 0                                   {product}
    uintx HeapSizePerGCThread                       = 87241520                            {product}
    uintx InitialHeapSize                          := 264241152                           {product}
    uintx LargePageHeapSizeThreshold                = 134217728                           {product}
    uintx MaxHeapSize                              := 4206886912                          {product}
java version "1.8.0_141"

由上述的输出可知,初始的堆内存为264241152/1024/1024=252M,而堆内存最大为4206886912/1024/1024/1024=3G

这个时候可能就会有一个问题就是,该ECS上跑多少个java -jar xxx.jar这类的服务会比较好呢?如果按照每个服务都能使用3G的堆内存来算,该机器上做多跑4个这类的服务是一个比较合理的规划,但是考虑实际的业务使用需求,单纯这样考虑可能会有点唐突了,因此还是建议每个应用在部署时指定一些基础的参数,比如初始堆和最大堆,并且这两个参数一般建议设置成一致,以免在运行过程中堆的扩容造成的损耗。

知识星球

公众号