记一次java应用启动失败问题排查过程

5-Linux 内存溢出oom Linux内核为了提高内存的使用效率采用过度分配内存(over-commit memory)的办法,造成物理内存过度紧张进而触发OOM机制来杀死一些进程回收内存。该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽会把该进程杀掉。 阅读详情

内存充足,但是jvm启动还是报分配不到内存


应用启动日志:Caot allocate memory
/proc/sys/vm/swappiness 使用SWAP分区的积极程度,值越大越积极
/proc/sys/vm/overcommit_memory 进程内存分配超额机制
/proc/sys/vm/overcommit_ratio overcommit_memory=2时,总物理内存*overcommit_memory/100则是内存申请的大小上限


一、问题现象

最近在处理一个线上问题,已经出了补丁在测试环境验证,今天下午在测试环境观察了以下jvm内存和日志,都正常就去看别的了。没想到还没几分钟,测试微信问我是不是重启过服务,我一脸懵逼。虽然不知道具原因,但是我知道接下来要忙起来了。

二、排查过程

第一反应是测试自己敲错了命令,手动重启了服务;如果不是这种情况,那么就是一个绕不过去的bug了,需要深入分析定位。
首先,我确认自己这边history操作是没有重启命令执行的,测试那边也确认是没有手动执行。
使用我司封装的命令查看该应用的状态,一直在starting和initing切换,说明在不断尝试重启,这也说明不是手动操作的。这也是好事,不断重启就说明问题一直在,有了一定的跟踪时间。

应用一直重启,那么肯定是有原因的,对应的原因一般情况都会输出在日志中。遂找到对应应用的启动日志,发现提示如下:
在这里插入图片描述
主要信息为:无法给jvm申请到内存资源。

于是,用free命令看了当时的内存占用,表示内存占用并不高,这个应用的初始堆内存为3G,根据free结果,应该是可以满足的:
在这里插入图片描述
于是根据第一张图的提示,看hs_err_pid.log文件:
在这里插入图片描述
日志表示,确实是没有足够的内存分配给这个新进程了,新进程需要的初始内存刚好也是3G。
那这就奇怪了,明明free看到的内存是充足的,新的进程启动却无法给分配,操作系统傻缺了吗?
又想到前两天,也是在这个环境,我打算启动arthas监控一下jvm,也是报一样的错,无法分配内存,想起来和今天遇到的问题是一样的,操作系统的内存分配一定有问题,猫腻也应该是出在这里。

怎奈操作系统的只是储备不够,只好求助优快云的经验,搜索关键词:“内存充足 但是jvm启动还是报分配不到内存”
在这里插入图片描述
帖子中说明是系统内存分配策略参数被修改过导致,我问了测试,果然修改过系统参数:
在这里插入图片描述
到这里,问题大方向变成了系统参数。

三、问题原因

那么,具体是修改了什么系统参数,这个参数又是如何影响进程的内存分配的呢?这个改动是否是这个导致问题的根本原因?

操作系统上会运行很多进程,为了每个进程有一块独立的内存空间,互不干扰易于管理和使用,同时可以最大程度的利用好有限的物理内存资源。诞生了MMU(Memory Management Unit),内存管理单元负责统一管理虚拟内存和物理内存的映射。由于虚拟内存和物理内存的这种映射关系(mmap),所以虚拟内存当然是可以超过物理内存的,那么这种超额总会有个限制,具体的限制策略就是overcommit机制。
overcommit_memory有以下三种超额策略:

  • 0 ------默认值,进程启动时申请的内存和剩下的物理内存做比较,如果超过就申请失败
  • 1 ------Always overcommit,不做限制,不过后续会策略kill某些进程来释放物理内存
  • 2 ------当请求申请的内存 >= SWAP内存大小 + 总物理内存 * N,则拒绝此次内存申请(N为overcommit_ratio)
	# 内存超限策略
	/proc/sys/vm/overcommit_memory
	# 内存超限策略2中的内存比例
	/proc/sys/vm/overcommit_ratio

测试恢复后的系统配置:
在这里插入图片描述

当前环境中swap空间始终为0,overcommit_memory策略被修改为2的情况下,overcommit_ratio默认为50,总内存为31G。根据以上公式,可以算出所有的进程可以申请到的内存大小为:0+31*50/100=15G。也就是说,在该环境中内存申请上限大约为15G,如果超过这个限制,操作系统将会启动OOM-kill机制。进一步的,在尝试重新启动进程的时候,比如一个java应用初始堆内存大小配置为3G,那么启动该进程需要申请的内存空间至少为3G,如果资源不足则进程启动失败。
至此,问题已经清楚。得到的经验教训为,在一般情况下可以通过free命令初步看到剩余可申请内存大小空间。如果现象比较反常,需要考虑一下是否是内核默认参数被有意或者无意的改动过。

那么,我们现在知道如何通过free命令和overcommit参数计算出,可供申请的内存地址空间上限。我们如何准确的计算出,当前环境上已经申请的内存空间大小呢?通过top命令依次求和计算吗?虽然这也不是不可以,不过对于这个已经申请的内存大小,内核中有一个专门的描述,即Committed_AS,该信息保存在/proc/meminfo中:

	cat /proc/meminfo | grep --color Commit

在这里插入图片描述
以上截图是我们将/proc/sys/vm/overcommit_memory参数后将所有java应用正常运行一天后的截图,可以看到:
CommitLimit(总内存空间*overcommit_ratio/100的结果),大约为15.6G
Committed_AS(已经申请的内存空间大小),大约为36.17G
很明显已经申请的内存空间大小远超过了物理内存,这里就需要区分清楚两个概念:申请内存大小和分配内存大小。

那么,在OOM-kill后,java应用在自动尝试重启失败时生成的hs_err_pid.log文件中也可以看到/proc/meminfo的内容:

	grep --color ^Commit  /home/xxx/xxx/xxx/hs_err_pid13783.log

在这里插入图片描述
可以看到,CommitLimit数值不变,因为物理内存总大小和overcommit_ratio始终不变。
Committed_AS大约为14.99G,是始终小于CommitLimit的,因为这个时候overcommit_memory参数为2,所以根据never-overcommit的内存申请超限策略,再申请3G内存就超过了限制,导致应用使用无法自己拉起来。


总结

  1. 内存申请不等于内存分配,当内存在实际用到的时候才真正分配使用
  2. 掌握内存申请限制内核参数:/proc/sys/vm/overcommit_memmory和overcommit_ratio
  3. 对于进程内存申请的具体流程学习,可以通过以下博文了解

参考:
Linux kernel内存管理之overcommit相关参数

公网访问iDRAC虚拟控制台java报错“无法启动该应用程序”   最近笔者入手了一台Dell Powedge R710用作家庭流媒体服务器,在局域网内工作当然是mo问题啦,只是笔者马上要开学QAQ,而不能亲自维护,于是才有了以下情况。   笔者首先就是要把服务器iDRAC管理用到的端口映射到公网,自家公网ip访问管理页面,ok。再配置DDNS自己的域名,访问成功没毛病。上传证书,小撤锁(不是)也有了。在我以为万事具备的时候: 得,虚拟控制台,最重要的功能,访问不了。   笔者试过了所有常规解决办法,java版本不能太高,添加信任域名,端口也都开了,可就是访问不了。于是 阅读详情

相关推荐

Java启动失败解决方法】——排除Java启动异常的有效方案

本文介绍了几种常见的Java启动失败错误,并提供了相应的解决方法。通过仔细检查类路径设置、JVM参数设置和库文件路径设置,您可以快速排除Java启动异常,并使您的Java程序成功运行。如果您遇到其他启动失败问题,请参考相关文档或寻求专业人士的帮败问题,请参考相关文档或寻求专业人士的帮助。在开发和运行Java程序时,启动失败是一个常见的问题。本文将介绍一些常见的Java启动失败错误,并提供一些解决方法,帮助您快速解决这些问题。Java启动失败解决方法】——排除Java启动异常的有效方案。

ByteGlide的博客 1926

如何解决Java程序无法启动的问题?

当Java程序无法启动时,可能是由于环境配置、代码错误或依赖问题导致的。本文介绍了几种常见的解决方法,包括检查Java环境变量、验证代码和依赖、查看日志和错误信息等,以帮助定位和解决问题。

苏呆仔知识馆 3028

深入排查 systemd 服务启动失败问题:以 ad_auth.service 为例

通过以上步骤,我们可以系统地排查启动失败的问题。查看详细日志,定位错误信息。检查启动脚本,确保脚本可执行且无错误。检查依赖项,确保所有依赖项已启动。检查配置文件,确保配置无误。检查资源限制,确保系统资源充足。检查端口冲突,确保端口未被占用。检查 SELinux 或防火墙,确保服务不受限制。添加调试日志,进一步分析问题。检查服务代码,修复逻辑错误。通过这套方法,我们可以快速定位和解决服务启动失败的问题,确保系统稳定运行。希望本文对你有所帮助!

私聊前往站内信:https://i.youkuaiyun.com/#/msg/chat/weixin_44976692 1万+

overcommit_memory

目录 overcommit_memory Overcommit Accounting CommitLimit and Committed_AS overcommit_kbytes orovercommit_ratio overcommit_memory:Documentation for /proc/sys/vm/ — The Linux Kernel documentation overcommit_memory这个vm参数用于控制malloc、mmap这些用于在进程虚拟地址空间申请虚拟..

厚积薄发者,轻舟万重山 1081

别再只盯着版图画了!聊聊CMOS工艺里那个‘看不见的手’:STI应力(LOD效应)对模拟电路的实际影响

本文深入探讨了CMOS工艺中STI应力(LOD效应)对模拟电路设计的实际影响,揭示了这一隐形变量如何导致电流镜匹配偏差等常见问题。通过分析应力产生的物理机制、空间分布特性,以及提供伪器件设计、版图布局优化等实用解决方案,帮助工程师有效管理STI应力效应,提升电路性能。文章还探讨了FinFET工艺下的新挑战及机器学习在应力优化中的应用前景。

weixin_42656416的博客 357

Jaspersoft Studio安装与配置全攻略:从下载到首个报表生成

本文提供Jaspersoft Studio从下载、安装到创建首个报表的完整实战指南。详细介绍了如何获取安装包、配置工作空间,并通过可视化设计器创建报表模板、添加参数与字段,最终实现数据预览与PDF导出。帮助Java开发者快速掌握这一强大的开源报表工具,提升报表开发效率。

weixin_28826521的博客 702

记录一次linux环境中java应用无法启动问题的排查过程

记录一次linux中java应用因挖矿病毒导致无法启动的问题排查过程

ww_frozenTear的博客 4469

耶鲁大学《博弈论》课程——逆向归纳

耶鲁大学《博弈论》课程——逆向归纳

ZYLer_的博客 7870

记一次RocketMq启动mqbroker时启动失败

记一次RocketMq启动mqbroker时启动失败 前提说明 我安装的是4.7.1的版本,前面安装的过程和网上都是一样的,其实按照官网的安装方式就可以简单安装成功. 我看网上最终启动的目录大都是下面这个路径 distribution/target/apache-rocketmq 实际上新版本的官网上是进入到下面这个路径 distribution/target/rocketmq-4.7.1/rocketmq-4.7.1 上面这个还不是我的问题. 我的问题 我在执行 nohup sh bin/mqnamesr

qq_21347647的博客 3453

使用OpenCV进行3D重建:详细指南

3D重建是计算机视觉领域的一项关键技术,它能够从二维图像中恢复出场景的三维结构。这项技术在机器人视觉、增强现实和3D建模等多个领域都有广泛的应用。在本篇技术博客中,我们将详细介绍如何使用OpenCV这一流行的计算机视觉库来实现3D重建。我们将逐步探讨整个过程,包括相机标定、特征点提取与匹配、立体校正、深度图计算以及最终的三维重建。3D重建是一个复杂的过程,涉及多个步骤和多种算法。OpenCV提供了强大的工具来支持这一过程,从相机标定到特征点提取与匹配,再到立体校正和深度图计算,最后实现三维重建。

weixin_41544125的博客 1315

微信小程序-如何根据缩放屏幕大小自适应icon图标更改marker

微信小程序如何根据用户的缩放屏幕来改变marker图标icon的大小,实现icon自适应屏幕缩放的效果

Bartender_VA11的博客 3980

记一次 RocketMQ broker 因内存不足导致的启动失败

通过问题排查的思路,介绍 RocketMQ 的堆内存计算逻辑,详细分析 RocketMQ broker 内存不足导致启动失败的原因。

江先生的杂货铺 4087

学习记录(十一)--Pattern Recognition投稿记录

上一周特别忽然通知统计建模要答辩,确定是否晋级国赛,一直在准备答辩的事情,所以上一周没有总结周汇报,深刻检讨!!!不过结果是好的,我们组第二名晋级哦。这周主要是跟大家分享一下我投稿PR(Pattern Recognition)的一个时间线,以及投稿后的工作。一、PR从投稿到接收的时间线2025.4.3 Major Revision(ddl4.23) 当时正在弄比赛和另一个着急推进的文章2025.5.30 Minor Revision 这次小修基本上只有一些格式和简单一点点问题。

qq_54949944的博客 1917

RocketMQ启动失败问题

问题描述 rocketmq namesrv启动没反应 nohup.out 如下: Java HotSpot(TM) 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release. Unrecognized VM option 'UseCMSCompactAtFullCollection' Error: Could

更新失败的博客 7801

使用自制的NTC测量模块测试Plecs的热仿真效果

可以测试:您完全可以用这个模型来测试热仿真。NTC 模型是连接电气域和热域的关键桥梁。实现闭环:通过这种方式,您创建了一个高度真实的正反馈闭环系统:负载增加 -> 损耗增加 -> 温度升高 -> NTC 阻值变化 -> 控制电路可能因此调整(如降低频率或电流)-> 损耗变化 -> 温度变化。应用场景:这对于设计过温保护 (OTP) 电路风扇控制系统以及分析热失控条件非常有用。单位:确保热域中使用的单位( Kelvin 或 Celsius )与您的 C-Script 模型输入期望的单位一致。

311

Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】

1. 设置目标原件时,选择切换,这样就可以实现,当原件展示时,点击自动隐藏,隐藏时自动显示; 2. 展开/收起原件(推动/拉动原件)设置为方向**向下**

专注于计算机研发知识和资讯分享 1377

Nacos启动失败问题排查

从 日志中,可以看到 Nacos 启动失败的原因是由于内存不足。具体错误信息指出 JVM 尝试分配536870912字节(约512MB)的内存时失败了,系统报告没有足够的空间。根据当前配置,-Xms512m -Xmx512m -Xmn256m,这意味着JVM试图分配总共至少768MB的内存(512MB最大堆 + 256MB新生代)。如果服务器内存有限,可以尝试减少这些值。例如 这会将总内存需求降低到大约384MB。确保服务器有足够的空闲内存。可以使用以下命令来查看当前的内存使用情况: 如果显示的可用

m0_65190367的博客 3300

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

企业级Spring应用启动失败排查实战

不要被表面错误迷惑,要找到根源异常善用Spring的详细日志级别(DEBUG/TRACE)复杂项目建议逐步启动模块,隔离问题建立团队知识库避免重复踩坑Spring的启动错误就像谜题,解决后会发现其实逻辑都很直接。保持耐心,系统化排查,你也能成为问题解决专家。

BlackironPanther23的博客 805

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SpringBoot常见启动问题排查:从端口冲突到Bean注入失败的解决方案

Spring Boot 以其便捷的开发和部署特性,成为了 Java 开发中广泛使用的框架。然而,在实际开发过程中,我们常常会遇到各种启动问题,这些问题可能会阻碍开发进度,影响项目的正常推进。本文将详细介绍 Spring Boot 常见的启动问题,从端口冲突到 Bean 注入失败,并给出相应的解决方案。

梵心白莲的博客 1388

RocketMQ - 新手常见问题:启动失败、连接超时排查

RocketMQ新手常见问题排查指南:服务端启动失败与客户端连接超时解决方案 本文针对RocketMQ新手最常遇到的两大类问题提供详细解决方案: 服务端启动失败问题 NameServer OOM问题:通过修改runserver.sh降低JVM内存配置(从8GB调整为512MB) Broker无法创建Topic:在broker.conf中设置autoCreateTopicEnable=true Broker注册失败:正确指定namesrvAddr地址,Docker环境推荐使用--network host模式

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

springboot启动图标_记一次SpringBoot项目启动卡住问题排查记录

点击上方蓝色字体,选择“设为星标”优质文章,及时送达作者:陈凯玲来源:https://url.cn/5UWhBvB一个spring boot开发的项目,spring boot版本是1.5.7,携带的spring版本是4.1.3。开发反馈,突然在本地启动不起来了,表象特征就是在本地IDEA上运行时,进程卡住也不退出,应用启动时加载相关组件的日志也不输出。症状如下图:问题分析因为没有有用的日...

weixin_39550172的博客 1688

企业级Java应用启动失败实战排查指南

最麻烦的是,标准错误日志往往只给出模糊提示,我们需要手动检查classpath、依赖树甚至JVM参数,效率极低。来快速验证解决方案。它的在线环境让我能即时测试各种配置变更,省去了反复重启本地服务的麻烦。这个错误不仅让项目卡在了启动阶段,还因为缺乏详细的日志导致排查困难。经过一番折腾,我决定开发一个专门针对这类问题的监控系统,把经验分享给大家。实际使用中,我发现平台提供的实时日志和资源监控特别有用,能清晰看到每个启动阶段的变化。现在遇到启动问题,只需要查看系统生成的报告,大多数情况下都能快速定位原因。

MoonbeamRaven28的博客 917

一次生产环境 Tomcat 7 + JDK 7 应用启动失败的完整排查与修复实录

摘要:本文记录了Tomcat 7 + JDK 7生产环境应用启动失败的完整排查过程。问题表现为启动后立即崩溃,报"Address already in use"错误,同时伴有内存泄漏警告。排查发现是端口冲突和资源泄漏的复合型故障。解决方案包括:1) 通过lsof和kill解决残留进程导致的端口占用;2) 创建全局销毁监听器修复JDBC驱动、Quartz线程和Ehcache的资源泄漏;3) 修正Ehcache RMI配置错误并开放防火墙端口。此外还解决了SLF4J绑定冲突和servlet-

刘一说的IT专栏 1219

Java开发环境系列:记一次使用xampp安装的MySQL启动失败问题排查

xampp mysql 启动失败问题排查 linux Can't connect to local MySQL server through socket '/opt/lampp/var/m...问题现象网站莫名其妙的连接不上mysql了,导致网站瘫痪;没有改任何程序,怎么回事呢?马上用xshell 和xftp工具连接linux服务器来排查问题启动xampp mysql...

开发者导航 1407

Linux下QT程序启动失败问题排查方法

当我们使用高版本的gcc编译器编译程序在低版本的gcc系统中运行时很容易出现C库找不到的问题,主要是因为使用高版本gcc进行编译时会引入高版本c库的函数,而在低gcc环境上是没有这些函数的,这就导致程序找不到依赖的c库的接口而无法启动。解决QT插件库缺失的两种方法,第一种利用经验根据自己使用到的板块拷贝对应的插件到发布目录;通过ldd命令查看依赖库问题的正确步骤,第一步先确认可执行程序的依赖库是否缺失,如果缺失查看缺失依赖库自身的依赖库是否正常,通过一层层查询,基本能定位缺失的依赖库问题。

白云之道 2887

fd java,记一次 JNI 导致 Java fd 泄露的排查过程

前几天接到反馈,线上某机器上的服务在进行后端调用的时候失败了。查看日志是端口分配失败。通过 netstat -nulp 看到大量端口占用,用户段端口49152 到 65535 全部被占满。于是通过 awk sort 和 uniq 统计出每个进程的端口占用情况,发现某些 Java 服务占用了 2w+ 端口,于是对该服务展开分析。首先考虑的是应用有大量 Socket 对象没有关闭释放,于是将堆 du...

weixin_29215969的博客 472
上一篇: JDK工具-命令
下一篇: 记一次spring-spi机制下少包导致的启动问题
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值