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. IDEA破解 Intellij IDEA license server 激活(可用)

    激活地址如下图所示: 2018 intellij idea 注册码(亲测可用): C0FHYYCJ22-eyJsaWNlbnNlSWQiOiJDMEZIWVlDSjIyIiwibGljZW5zZWVO ...

  2. 按照excel文档中的内容在当前cad图纸中自动排布实体

    本例实现的主要功能是读取excel文档中的内容,其次是将按照读取的信息在当前cad图纸中添加相应的实体.下面先介绍实现代码: CString excelPath; //外部excel文档的地址 Upd ...

  3. google cache源码详解

    一.引子 缓存有很多种解决方案,常见的是: 1.存储在内存中 : 内存缓存顾名思义直接存储在JVM内存中,JVM宕机那么内存丢失,读写速度快,但受内存大小的限制,且有丢失数据风险. 2.存储在磁盘中: ...

  4. MYSQL—— 基础入门,增、删、改、查(基础篇)

    首先呢,先解释一下基本的概念,心里最起码知道就ok啦!其余更多的了解,得另查看喽! (1)什么是sql? sql:指结构化查询语言,有能力访问数据库,是一种ANSI(美国国家标准话组织)的标准计算机语 ...

  5. Docker 发布 Abp net core web 服务

    Docker 发布 Abp net core web 服务 准备工作:Abp 项目,这个是模板下载地址 https://aspnetboilerplate.com/Templates (本例使用的是S ...

  6. sun.misc.Unsafe 详解

    原文地址 译者:许巧辉 校对:梁海舰 Java是一门安全的编程语言,防止程序员犯很多愚蠢的错误,它们大部分是基于内存管理的.但是,有一种方式可以有意的执行一些不安全.容易犯错的操作,那就是使用Unsa ...

  7. SSRS报表服务随笔(rdl报表服务)-报表数据:使用第三方控件生成条形码

    因为工作需要,需要将订单号显示成条形码,比如数据库存储的20190106A,我需要把这个转换为Code128来显示出来 在国内我没有找到这方面的教程,最后还是一个人自己摸索出来的 在这里我是使用的是B ...

  8. 跳动在网页中间的精灵----Javascript

    今天开始js的内容整理,跳动在网页里的精灵就是它了. 一.简介 1.什么是Javascript JavaScript 是一种具有面向对象能力的.解释型的程序设计语言.更具体一点,它是基于对象和事件驱动 ...

  9. Java语言编程 - 搭建Java开发环境

    2.1 JDK.JRE和JVM关系 要弄清楚JDK.JRE和JVM这三者之间的关系,先看如下图,有个感性的认识: JDK:Java Development ToolKit(Java开发工具包).JDK ...

  10. [区块链] 共识算法之争(PBFT,Raft,PoW,PoS,DPoS,Ripple)

    近几天对区块链中几种常见的共识机制(PBFT,Raft,PoW,PoS,DPoS,Ripple)进行了总结.尽量使用简单易懂语言,篇幅较大,想了解的可以只读每个算法介绍中前边的原理.本篇文章主要参考& ...