Could not create the Java virtual machine

不能分配15G的内存堆

# java -server -Xms15G -Xmx15G -XX:+UseConcMarkSweepGC -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode  -version
Java HotSpot(TM) 64-Bit Server VM warning: CMS bit map allocation failure
Java HotSpot(TM) 64-Bit Server VM warning: Failed to allocate CMS Bit Map
Error occurred during initialization of VM
Could not create CMS collector
Could not create the Java virtual machine.

查看内存使用情况:

# free -g
              total        used        free      shared  buff/cache   available
Mem:             31           0          30           0           0          30
Swap:             0           0           0

有足够的内存,查看进程,未发现其他进程分配内存堆。

 

可以分配14G的内存堆:

# java -server -Xms14G -Xmx14G -XX:+UseConcMarkSweepGC -XX:+UnlockDiagnosticVMOptions -XX:+PrintCompressedOopsMode  -version
heap address: 0x000000047ae00000, size: 14418 MB, zero based Compressed Oop
java version "1.6.0_45"
Java(TM) SE Runtime Environment (build 1.6.0_45-b06)
Java HotSpot(TM) 64-Bit Server VM (build 20.45-b01, mixed mode)

应该是有某种限制,不能分配超过内存的50%。

vm.overcommit_memory的意思:
0 — 默认设置。内核执行启发式内存过量使用处理,方法是估算可用内存量,并拒绝明显无效的请求。遗憾的是因为内存是使用启发式而非准确算法计算进行部署,这个设置有时可能会造成系统中的可用内存超载。
1 — 内核执行无内存过量使用处理。使用这个设置会增大内存超载的可能性,但也可以增强大量使用内存任务的性能。
2 — 内存拒绝等于或者大于总可用 swap 大小以及  overcommit_ratio 指定的物理 RAM 比例的内存请求。如果您希望减小内存过度使用的风险,这个设置就是最好的。

值为2下的场景:
公式:CommitLimit = (Physical RAM * vm.overcommit_ratio / 100) + Swap
Physical RAM为当前系统的总物理内存
vm.overcommit_ratio为物理内存的比例,默认为50

查看/etc/sysctl.conf配置发现: vm.overcommit_memory = 2.

结论:vm.overcommit_memory =2 导致不能分配超过50%的内存。

 

两种解决方法:

  1. 修改vm.overcommit_memory = 0
  2. 增加vm.overcommit_memory = 90

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值