-
yangm 数据达人Lv4
发表于2021-12-8 17:44
楼主
本帖最后由 yangm 于 2021-12-8 18:55 编辑
一、背景
在使用过程中,可能出现系统由于内存不足导致宕机。可能出现的情况有如下两点:
1.系统响应慢,所有操作十分卡顿。
2.应用服务器自动关闭,服务器停止响应。
二、排查
1.检查系统内存是否未配置。以tomcat为例,默认分配系统为1G,在大用户量情况下容易出现内存不够的情况,所以没有配置请按照实际情况配置。(单应用服务器-Xmx推荐硬件机器内存的75%)
修改内存大小一般在启动文件startup.bat或startup.sh中设置,设置内存不能低于如下数值:
Set JAVA_OPTS= -Xmx2048m-Xms256m -XX:MaxPermSize=512m(Windows)
JAVA_OPTS=”-Xmx2048m -Xms256m -XX:MaxPermSize=512m”(Linux)
内存调整需根据服务器内存大小、操作系统版本、WEB服务器版本、JDK版本和实际使用情况进行调整,在64bit环境下分配8G内存。
注意:某些JDK版本或操作系统限制最大堆内存,不支持分配超过1.5G的内存,如果有充足的内存,可以多建立几个节点集群成员,逐一对每个成员做相应的修改。
2.如上述已经调整到合理范围,但依然存在报错内存溢出情况,我们需要保存系统实时情况
(1)系统日志并记录宕机发生时间点
(2)发生时间点线程堆栈信息
线程信息可以直接在系统内部下载并导出,如图:
(3)系统dump
如系统直接宕机可采用自动打dump方式:
一般在启动文件startup.bat或startup.sh中设置
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\esenProgram\dump
其中D:\esenProgram\dump为系统真实路径可自行修改
系统会自动记录OOM时候的内存堆栈,并生成dump文件供开发排查分析。
如系统处于响应慢,所有操作十分卡顿状态,并未直接宕机,可采用手动打dump方式。
步骤一:通过JPS命令查看中间件进程PID,或者ps –ef|grep tomcat命令
步骤二:通过jstack命令输出堆栈日志到指定位置,路径随意
jstack $pid > D:\esenProgram\jstack.txt
例如:jstack 8719 >D:\esenProgram\jstack.txt
步骤三:通过jmap命令输出内存详细占用日志到指定位置,路径随意
jmap -dump:format=b,file=D:\esenProgram\dump.hprof $pid
例如:jmap -dump:format=b,file="D:\esenProgram\dump.hprof " 8632
以上资料保存后联系亿信技术人员发送以上资源,提供亿信工程师排查。
一、背景
在使用过程中,可能出现系统由于内存不足导致宕机。可能出现的情况有如下两点:
1.系统响应慢,所有操作十分卡顿。
2.应用服务器自动关闭,服务器停止响应。
二、排查
1.检查系统内存是否未配置。以tomcat为例,默认分配系统为1G,在大用户量情况下容易出现内存不够的情况,所以没有配置请按照实际情况配置。(单应用服务器-Xmx推荐硬件机器内存的75%)
修改内存大小一般在启动文件startup.bat或startup.sh中设置,设置内存不能低于如下数值:
Set JAVA_OPTS= -Xmx2048m-Xms256m -XX:MaxPermSize=512m(Windows)
JAVA_OPTS=”-Xmx2048m -Xms256m -XX:MaxPermSize=512m”(Linux)
内存调整需根据服务器内存大小、操作系统版本、WEB服务器版本、JDK版本和实际使用情况进行调整,在64bit环境下分配8G内存。
注意:某些JDK版本或操作系统限制最大堆内存,不支持分配超过1.5G的内存,如果有充足的内存,可以多建立几个节点集群成员,逐一对每个成员做相应的修改。
2.如上述已经调整到合理范围,但依然存在报错内存溢出情况,我们需要保存系统实时情况
(1)系统日志并记录宕机发生时间点
(2)发生时间点线程堆栈信息
线程信息可以直接在系统内部下载并导出,如图:
(3)系统dump
如系统直接宕机可采用自动打dump方式:
一般在启动文件startup.bat或startup.sh中设置
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\esenProgram\dump
其中D:\esenProgram\dump为系统真实路径可自行修改
系统会自动记录OOM时候的内存堆栈,并生成dump文件供开发排查分析。
如系统处于响应慢,所有操作十分卡顿状态,并未直接宕机,可采用手动打dump方式。
步骤一:通过JPS命令查看中间件进程PID,或者ps –ef|grep tomcat命令
步骤二:通过jstack命令输出堆栈日志到指定位置,路径随意
jstack $pid > D:\esenProgram\jstack.txt
例如:jstack 8719 >D:\esenProgram\jstack.txt
步骤三:通过jmap命令输出内存详细占用日志到指定位置,路径随意
jmap -dump:format=b,file=D:\esenProgram\dump.hprof $pid
例如:jmap -dump:format=b,file="D:\esenProgram\dump.hprof " 8632
以上资料保存后联系亿信技术人员发送以上资源,提供亿信工程师排查。