1 环境配置信息

1.1 服务器配置信息

服务器是物理机, 配置信息如下:

CPU型号 CPU个数 CPU核数 CPU线程数 内存
Intel(R) Xeon(R) CPU E5-2630 v4 @ 2.20GHz 2个 2 * 10 = 20个核 2 * 20 = 40个线程 126G

1.2 Tomcat启动参数

查看$TOMCAT_HOME/bin/catalina.sh文件, 其中JVM参数配置信息如下:

JAVA_OPTS="-server -Xms90g -Xmx90g -XX:PermSize=256m -XX:MaxPermSize=256m -XX:+UseConcMarkSweepGC"

2 问题描述

在服务器(CentOS-6.5)中部署项目上线前的仿真测试环境, 启动Tomcat时, 抛出如下错误:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

也就是: 初始化VM时出错, 无法为heap(堆)对象保留足够的空间.

错误: 无法创建Java虚拟机.

错误: 发生了致命异常. 程序将会退出.

3 问题解决

根据问题描述可知, Linux系统不允许初始化JVM时就申请这么大的内存.

(1) JVM可用内存测试方法:

# 配置好JDK的环境变量后, 在终端键入如下命令:
java -Xmx32g -version # 如果能够正常显示JDK的版本信息, 说明可以申请到指定大小的内存.
# 若报错, 说明申请的内存大小超出限制, 不被操作系统所允许.

(2) 继续查看系统资源限制情况:

# 在终端键入如下命令:
ulimit -a
# 发现内存的使用并未受限:
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited

经过排查, 原来某同事在测试Greenplum DB时, 修改了/etc/sysctl.conf文件中的系统内核参数.

# 将如下参数的值设置为1或0
vm.overcommit_memory=2 # 保存退出后, 使得更改生效:
sysctl -p

此时再次启动Tomcat, 发现启动成功.

4 关于vm.overcommit_memory参数

vm.overcommit_memory表示系统内核在分配内存时做检查的方式.

此参数有 [0、1、2] 3个值可选, 处理方式定义在内核源码mm/mmap.c_vm_enough_memory函数中.

4.1 vm.overcommit_memory=0

默认设置. 宏为OVERCOMMIT_GUESS.

内核计算: NR_FILE_PAGES总量 + SWAP总量 + slab中可以释放的内存总量, 如果申请空间超过此数值, 则将此数值与空闲内存总量减掉 totalreserve_pages() 的总量相加. 如果申请空间依然超过此数值, 则分配失败.

该设置可能造成内存超载, 但也可以提升大量使用内存的任务的性能.

4.2 vm.overcommit_memory=1

宏为OVERCOMMIT_ALWAYS.

函数直接 return 0, 分配成功.

4.3 vm.overcommit_memory=2

宏为OVERCOMMIT_NEVER.

内核计算: 总物理内存 * vm.overcommit_ratio / 100 +SWAP总量, 如果申请空间超过此数值, 则分配失败. vm.overcommit_ratio 默认值为50.

该设置可以有效减少内存过度使用的风险.

4.4 查看系统的可用内存

查看命令如下:

[root@localhost ~]# grep -i commit /proc/meminfo
CommitLimit: 66020980 kB
Committed_AS: 100135888 kB

其中:

CommitLimit: 当前系统还可以申请的总内存;

Committed_AS: 当前系统中所有应用申请了的总内存 —— 只是申请, 并未完全分配.

参考资料

linux 内存分配限制,overcommit_memory 2

sysctl 中 vm.overcommit_memory 的含义

版权声明

作者: 马瘦风

出处: 博客园 马瘦风的博客

您的支持是对博主的极大鼓励, 感谢您的阅读.

本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.

异常 - 虚拟机初始化错误 - Error occurred during initialization of VM的更多相关文章

  1. Logstash测试的时候,报Error occurred during initialization of VM,Could not reserve enough space for object heap

    今天配置Logstash的时候,启动输入logstash ‐e 'input { stdin { } } output { stdout {} }'就开始报错了,Error occurred duri ...

  2. jboss服务启动失败报:Error occurred during initialization of VM

    今天下午突然间公司的GTV管理平台上不去了 访问确实,提示找不到页面 登录终端查看服务进程. ps -ef | grep jboss 发现没有这个进程.怎么办,启动被. 输入nohup /home/c ...

  3. Error occurred during initialization of VM Could not reserve enough space for 2097152KB object heap

    ionic build Android后的报错问题 ionic 升级了splashscreen和statusbar的插件后,执行ionic build android会一直报打包错误.原因是过低的An ...

  4. Error occurred during initialization of VM Could not reserve enough space for object heap

    Error occurred during initialization of VM Could not reserve enough space for object heap Java虚拟机(JV ...

  5. fisheye Error occurred during initialization of VM Could not reserve enough space for object heap 问题解决!

    参考文章:https://answers.atlassian.com/questions/9397/not-enough-heap-space-to-run-fisheye fisheye下载好了之后 ...

  6. debian 7 linux 安装jdk出现Error occurred during initialization of VM java/lang/NoClassDefFoun

    debian 7 linux 安装jdk出现Error occurred during initialization of VM java/lang/NoClassDefFoun 这两天一直研究lin ...

  7. 踩坑系列《三》 java -version 报错出现Error occurred during initialization of VM java/lang/NoClassDefFoundError:

    之前导入一个项目,因为该项目Spring版本过低,只能适用于1.7版本,装了jdk1.7版本.安装配置好后,打开cmd窗口,执行 java -version 指令发现没像正常一样显示版本信息,而是报了 ...

  8. Error occurred during initialization of VM Could not reserve enough space fo

    通过es的elasticsearch.bat 启动.发现错误:Error occurred during initialization of VM Could not reserve enough s ...

  9. Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object

    本地原来已经安装了JAVA JDK1.7并配置好了环境变量; 然后又安装了JDK8,想2个版本并存. 然后发现eclipse 打不开,闪退.然后查看环境: 发现 C:\Users\Administra ...

随机推荐

  1. MySQL 大数据量快速插入方法和语句优化

    MySQL大数据量快速插入方法和语句优化是本文我们主要要介绍的内容,接下来我们就来一一介绍,希望能够让您有所收获! INSERT语句的速度 插入一个记录需要的时间由下列因素组成,其中的数字表示大约比例 ...

  2. bzoj5248 [2018多省省队联测]一双木棋

    直接hash+爆搜即可. #include <cstdio> #include <cstring> #include <iostream> #include < ...

  3. BZOJ_1877_[SDOI2009]晨跑_费用流

    BZOJ_1877_[SDOI2009]晨跑_费用流 题意: Elaxia最近迷恋上了空手道,他为自己设定了一套健身计划,比如俯卧撑.仰卧起坐等 等,不过到目前为止,他 坚持下来的只有晨跑. 现在给出 ...

  4. 使用jquery 的ajax 与 Java servlet的交互

    由于是使用jquery的 所以别忘记导入jq 下面是jsp文件 <%@ page language="java" contentType="text/html; c ...

  5. 监督学习——logistic进行二分类(python)

    线性回归及sgd/bgd的介绍: 监督学习--随机梯度下降算法(sgd)和批梯度下降算法(bgd) 训练数据形式:          (第一列代表x1,第二列代表 x2,第三列代表 数据标签 用 0/ ...

  6. 使用Mybatis实现动态SQL(一)

    使用Mybatis实现动态SQL 作者 : Stanley 罗昊 [转载请注明出处和署名,谢谢!] 写在前面:        *本章节适合有Mybatis基础者观看* 前置讲解 我现在写一个查询全部的 ...

  7. 【转】W3C中国与百度联合组织移动网页加速技术研讨会

    2017 年 8 月 30 日,W3C 会员百度在北京中关村软件园国际会议中心主办了 "移动网页加速技术研讨会",W3C 中国以及腾讯.阿里巴巴及 UC.搜狗.小米.傲游.中国移动 ...

  8. eShopOnContainers 知多少[7]:Basket microservice

    引言 Basket microservice(购物车微服务)主要用于处理购物车的业务逻辑,包括: 购物车商品的CRUD 订阅商品价格更新事件,进行购物车商品同步处理 购物车结算事件发布 订阅订单成功创 ...

  9. linux安装nvm node版本管理器 nvm常用命令 部署node服务器环境

    1,nvm git地址点击打开链接,安装命令 curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.11/install.sh ...

  10. 浅谈unity中gamma空间和线性空间

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.概述 很久没有写文章了,今天写一篇对gamma空间和线性空间的个人理解总结,在查阅和学习了各个资料后,算是一个个人笔记 ...