异常 - 虚拟机初始化错误 - Error occurred during initialization of VM
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: 当前系统中所有应用申请了的总内存 —— 只是申请, 并未完全分配.
参考资料
版权声明
作者: 马瘦风
出处: 博客园 马瘦风的博客
您的支持是对博主的极大鼓励, 感谢您的阅读.
本文版权归博主所有, 欢迎转载, 但请保留此段声明, 并在文章页面明显位置给出原文链接, 否则博主保留追究相关人员法律责任的权利.
异常 - 虚拟机初始化错误 - Error occurred during initialization of VM的更多相关文章
- 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 ...
- jboss服务启动失败报:Error occurred during initialization of VM
今天下午突然间公司的GTV管理平台上不去了 访问确实,提示找不到页面 登录终端查看服务进程. ps -ef | grep jboss 发现没有这个进程.怎么办,启动被. 输入nohup /home/c ...
- 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 ...
- 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 ...
- 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下载好了之后 ...
- 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 ...
- 踩坑系列《三》 java -version 报错出现Error occurred during initialization of VM java/lang/NoClassDefFoundError:
之前导入一个项目,因为该项目Spring版本过低,只能适用于1.7版本,装了jdk1.7版本.安装配置好后,打开cmd窗口,执行 java -version 指令发现没像正常一样显示版本信息,而是报了 ...
- 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 ...
- Error occurred during initialization of VM java/lang/NoClassDefFoundError: java/lang/Object
本地原来已经安装了JAVA JDK1.7并配置好了环境变量; 然后又安装了JDK8,想2个版本并存. 然后发现eclipse 打不开,闪退.然后查看环境: 发现 C:\Users\Administra ...
随机推荐
- hibernate 增改查后对象的三种状态转换
this.getSession().update(obj); this.getSession().merge(obj); this.getSession().saveOrUpdate(obj);1. ...
- 【ShoppingWebCrawler】-基于Webkit内核的爬虫蜘蛛引擎概述
写在开头 在各个电商平台发展日渐成熟的今天.很多时候,我们需要一些平台上的基础数据.比如:商品分类,分类下的商品详细,甚至业务订单数据.电商平台大多数提供了相应的业务接口.允许ISV接入,用来扩展自身 ...
- 2个byte类型数据相加(转型问题的分析)
转自https://blog.csdn.net/alinshen/article/details/53571857 今天看到网上有网友问到关于final修饰的面试题目,题目如下: <span s ...
- 一个C++程序中有多个cin输入的情况
在很多C++程序中,我们都会有几次输入的操作.这种情况下,会遇到只有第一个cin语句被执行了,而后面的cin都没有执行.这是因为cin所输入的数据都放在cin缓冲区中,当第一次使用cin后,缓冲区中已 ...
- 【BZOJ 1002】: [FJOI2007]轮状病毒
题目大意:(略) 题解: 第一眼,这不是矩阵树裸体,看了看样例,心想3就有16,那100岂不是要上天…… 果然炸long long……emmmm该不会要打高精除吧……害怕,按照老师的话,不可能考高精除 ...
- Vue学习小结(一)安装依赖与数据来源
不多说啥了,生活中都是各种阵痛与惊喜.最近在学习vue框架,刚写完一个小型的后台管理系统(https://github.com/michaelzhengzm/info-manager-systerm_ ...
- Python练习:九九乘法表
打印 n * n 的乘法表 #打印 9*9 乘法表 def Multiplication(n): # n - 定义打印的行数 max_len = len(str((n)**2)) #计算最大值的占位( ...
- Scala 编码习惯
1. 不用var.var是可以被不断修改的,而val是不能被修改的.使用val而不是var能让你的程序更强壮,bug更少,更好调试,更容易测试,在并发条件下,更容易调优而获得更好的性能.数学证明我们不 ...
- “崩溃了?不可能,我全 Catch 住了” | Java 异常处理
前言 今天我们来讨论一下,程序中的错误处理. 在任何一个稳定的程序中,都会有大量的代码在处理错误,有一些业务错误,我们可以通过主动检查判断来规避,可对于一些不能主动判断的错误,例如 RuntimeEx ...
- @GeneratedValue源码解析
JPA要求每一个实体必须有且只有一个主键,而@GeneratedValue提供了主键的生成策略,这就是@GeneratedValue注解存在的意义.本文将浅析@GeneratedValue的源码. @ ...