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. Go语言Context(设计及分析)

    context简单概述: Go服务器的每个请求都有自己的goroutine,而有的请求为了提高性能,会经常启动额外的goroutine处理请求,当该请求被取消或超时,该请求上的所有goroutines ...

  2. ranker_worker.go

    package         outputDocs, numDocs := engine.rankers[shard].Rank(request.docs, request.options, req ...

  3. bzoj5253 [2018多省省队联测]制胡窜

    后缀自动机挺好毒瘤的题. 我们考虑哪些切点是不合法的.肯定是所有的匹配串都被切了. 我们考虑第一个切口的位置. 当第一个切口在第一个出现位置前时,第二个切口必须切掉所有的串. 当第一个切口在$l_{i ...

  4. BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集

    BZOJ_3362_[Usaco2004 Feb]Navigation Nightmare 导航噩梦_并查集 Description     农夫约翰有N(2≤N≤40000)个农场,标号1到N,M( ...

  5. BZOJ_1803_Spoj1487 Query on a tree III_主席树+dfs序

    BZOJ_1803_Spoj1487 Query on a tree III_主席树 Description You are given a node-labeled rooted tree with ...

  6. nginx + tomcat 反向代理

    简单的配置:# my test java+nginx project server { listen ; server_name localhost; root /home/user/Desktop/ ...

  7. 描述性统计指标 - 众数 Mode

    定义- 数值型数据 - 出现频数最多的变量值- 品质型数据.单项式分组数据 - 频数最多的组为众数组,该组的变量值(类型)就是众数- 组距式分组数据 - 频数最多的组为众数组,通过公式求得众数 - 公 ...

  8. k8s经典实战—搭建WordPress

    k8s经典实战—搭建WordPress说明:需要在k8s上部署lnmp环境,建议跟着步骤来端口最好不要改,希望你也能搭建成功,完成这个搭建后你对Kubernetes的技术基本上是入门了.首先看下效果图 ...

  9. 卷积神经网络之LeNet

    开局一张图,内容全靠编. 上图引用自 [卷积神经网络-进化史]从LeNet到AlexNet. 目前常用的卷积神经网络 深度学习现在是百花齐放,各种网络结构层出不穷,计划梳理下各个常用的卷积神经网络结构 ...

  10. 最快1天搭建短视频APP!阿里云短视频解决方案上线

    短视频行业的发展前景乐观是毋庸置疑的,整个短视频的市场规模一直在增长,网络数据显示2018年已经突破100亿大关,在2019年预测将超过200亿.那么,对于短视频从业者来讲,要持续推动业务的发展,必须 ...