JVM进程启动的内存分配问题

1、分配机制

JVM分为client 端和server端,默认情况下32位的hotspot都是client模式;64位的默认都是server模式。(所以我们现在基本都是64位模式进行的)
参考资料:https://blog.csdn.net/qq_26545305/article/details/70241939

hotspot虚拟机的默认堆大小如果未指定,他们是根据服务器物理内存计算而来的

client模式下,JVM初始和最大堆大小为:
在物理内存达到192MB之前,JVM最大堆大小为物理内存的一半,否则,在物理内存大于192MB,在到达1GB之前,JVM最大堆大小为物理内存的1/4,大于1GB的物理内存也按1GB计算,举个例子,如果你的电脑内存是128MB,那么最大堆大小就是64MB,如果你的物理内存大于或等于1GB,那么最大堆大小为256MB。
Java初始堆大小是物理内存的1/64,但最小是8MB。

server模式下(常用):
与client模式类似,区别就是默认值可以更大,比如在32位JVM下,如果物理内存在4G或更高,最大堆大小可以提升至1GB,,如果是在64位JVM下,如果物理内存在128GB或更高,最大堆大小可以提升至32GB。

2、具体测试

我现在有一个如下服务器,64264M,

[hadoop@node06-cuidong zgh]$ free -m
              total        used        free      shared  buff/cache   available
Mem:          64264       25343         353         120       38567       38129
Swap:             0           0           0

然后我启动一个简单的springboot项目

[hadoop@node06-cuidong zgh]$ java -jar ceshi-0.0.1-SNAPSHOT.jar 

然后 jps -l 找到相关的pid,然后通过jmap -heap 来查看最大堆内存与初始堆内存的情况

jmap -heap 7133
Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 16848519168 (16068.0MB)
   NewSize                  = 351272960 (335.0MB)
   MaxNewSize               = 5616173056 (5356.0MB)
   OldSize                  = 703594496 (671.0MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

由上面可以发现,最大堆内存为16068M,为服务器总内存的4分之一。初始化内存为NewSize+OldSize 为1006M 为总内存的64分之一。均吻合

我尝试着在更小服务器上测试这些,发现得到的数据是相同的。占比情况一样。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值