内存问题OOM和GC,用PrintGCDetails HeapDumpOnOutOfMemoryError输出相关信息

本文介绍如何通过设置JVM参数HeapDumpOnOutOfMemoryError和PrintGCDetails来解决内存溢出(OutOfMemoryError)和进行垃圾回收(GC)优化。HeapDumpOnOutOfMemoryError会在OOM时生成dump文件,帮助定位问题;PrintGCDetails则用于打印GC日志,通过GC频率判断内存状况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OOM和GC可以添加JVM参数HeapDumpOnOutOfMemoryError,PrintGCDetails来查看相关信息。
参数需要放在java和-jar中间
举例:
java -Xms64M -Xmx256M -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/root/EventUpUserTimeStat -XX:+PrintGCDetails -Xloggc:/root/EventUpUserTimeStat/logs/gclog.log -jar ./bin/eventUpUserTimeStat.jar –spring.config.location=/root/EventUpUserTimeStat/config/application.properties

PrintGCDetails:打印GC日志,根据GC频率判断是否内存不足

HeapDumpOnOutOfMemoryError:如果发生OOM,会有dump文件,分析dump文件来定位OOM位置

<think>嗯,用户遇到了一个问题,执行sh start.sh后没有反应,需要分析可能的原因。首先,我需要仔细看看用户提供的脚本内容,找出可能的问题所在。用户之前的问题是关于修改目录权限的,现在这个脚本是一个启动Java应用的shell脚本,可能涉及环境变量、路径设置、Java配置等问题。 首先,脚本的开头是#!/bin/sh,但里面用了${BASH_SOURCE[0]},而sh通常是指向dash或者其他更基本的shell,可能不支持BASH_SOURCE变量,这会导致DEPLOY_DIR获取不正确。比如,在/bin/sh环境下,BASH_SOURCE可能未定义,导致路径错误,进而影响后续的目录设置,如CONF_DIR、LIB_DIR等,导致java命令找不到必要的jar包或配置文件,从而启动失败。 然后,检查LANG的设置,用户注释掉了LANG=zh_CN.UTF-8export LANG,这可能导致脚本在执行过程中出现编码问题,尤其是当路径或文件名包含非ASCII字符时,但可能不是主要问题,但需要留意。 接下来,JAVA_OPTS设置了一大堆参数,包括内存设置、GC参数、日志路径等。需要确认这些参数是否正确,特别是日志目录LOGS_DIR是否存在,是否有写入权限。如果LOGS_DIR不存在,java命令可能会因为无法创建日志文件而启动失败,但错误输出被重定向到/dev/null,导致用户看不到错误信息。 LIB_JARS的生成部分,使用了lsawk来拼接所有jar文件的路径,用冒号分隔。这里如果LIB_DIR路径不正确,或者目录中没有jar文件,会导致类路径为空,java无法找到主类,从而启动失败。另外,tr命令用来替换换行符为冒号,是否正确处理了所有jar文件需要确认。 nohup命令将输出重定向到/dev/null,并且后台执行,最后将进程ID写入pid文件。用户执行sh start.sh后,脚本会立即返回,但可能Java进程在启动过程中遇到错误而退出,但用户看不到任何输出,因为stdoutstderr都被丢弃了。此外,使用sh而不是bash可能导致脚本中的某些语法不被支持,比如BASH_SOURCE。 可能的解决方案包括:将脚本的shebang改为#!/bin/bash,确保使用bash来执行;检查DEPLOY_DIR是否正确获取;确认所有目录是否存在,是否有权限;检查Java命令是否存在,版本是否合适;查看nohup.out文件是否有错误信息;或者去掉输出重定向,暂时保留输出以便调试。此外,检查是否有重复的配置,比如log4jlogback的配置是否有冲突,或者Spring的配置文件是否正确。 另外,用户可能没有执行权限,需要chmod +x start.sh,或者使用bash start.sh来执行。还有,检查是否已经有一个进程在运行,端口被占用,导致应用无法启动。或者查看生成的pid文件中的进程ID是否有效,是否还在运行。 总结可能的原因:1. shebang使用了sh导致BASH_SOURCE不可用;2. 路径变量错误导致找不到jar或配置文件;3. 日志目录无法写入;4. Java参数错误;5. 类路径生成错误;6. 输出被重定向导致看不到错误信息。</think>以下是对该启动脚本问题的详细分析及解决方案: **一、基础诊断步骤** ```bash # 检查脚本执行权限 ls -l start.sh # 确认有x权限(若无则执行 chmod +x start.sh) # 查看实时输出(临时移除重定向) nohup java ... 2>&1 | tee nohup.out # 替换原nohup行 ``` **二、关键问题定位** 1. **Shell解释器不兼容** ```bash #!/bin/sh → #!/bin/bash # 必须修改!原脚本使用Bash特有语法 ``` - ${BASH_SOURCE[0]} 在标准sh中不可用,会导致`DEPLOY_DIR`路径获取错误 2. **路径设置隐患** ```bash # 增加路径验证 echo "DEPLOY_DIR: $DEPLOY_DIR" # 插入调试语句 test -d "$LIB_DIR" || echo "LIB目录不存在!" # 目录存在性检查 ``` 3. **类路径生成缺陷** ```bash # 改进的类路径生成方式 LIB_JARS=$(find "$LIB_DIR" -name '*.jar' -printf '%p:' | sed 's/:$//') ``` - 原`ls+grep+awk`组合对含空格文件名处理不安全 **三、增强型启动脚本修正** ```bash #!/bin/bash # 关键修改点! DEPLOY_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd) # 增加目录初始化 mkdir -p "$LOGS_DIR" # 自动创建日志目录 # 增加环境检查 command -v java >/dev/null 2>&1 || { echo "Java未安装!"; exit 1; } # 改进的启动命令 nohup java $JAVA_OPTS \ -Dspring.config.location=file:"$CONF_DIR/application.properties" \ -cp "$CONF_DIR:$LIB_JARS" \ com.camelgames.ssh.Application > "$LOGS_DIR/console.out" 2>&1 & # 增加启动状态检测 sleep 3 if ps -p $! >/dev/null; then echo $! > pid echo "启动成功,PID: $!" else echo "启动失败!查看日志:$LOGS_DIR/console.out" exit 1 fi ``` **四、补充检查清单** 1. **Java环境验证** ```bash java -version # 确认版本符合要求 ulimit -n # 检查文件句柄数(建议>4096) ``` 2. **配置文件验证** ```bash ls -l "$CONF_DIR" # 检查application.properties是否存在 cat "$CONF_DIR/logback-spring.xml" # 检查日志配置有效性 ``` 3. **内存分配检查** ```bash free -h # 确认8G内存分配合理 # 物理内存不足会导致OOM Killer终止进程 ``` **五、高级调试技巧** ```bash # 使用远程调试模式(临时添加参数) JAVA_OPTS+=" -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" # 生成线程Dump kill -3 <PID> # 输出到日志文件 ``` 建议按照以下顺序排查: 1. 修正shebang为`#!/bin/bash` 2. 执行`bash -x start.sh`查看详细执行流程 3. 检查`logs/console.out`中的错误信息 4. 验证Java进程是否存活`ps -ef | grep com.camelgames.ssh.Application`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值