java - 无法获取我的 Java 应用程序的致命错误日志
问题描述
帮助!我有一个在 Unix 上 24/7 运行的 Java 无头迭代计算密集型 servlet,之前的几个版本在大约一天左右后开始崩溃,而且我一辈子都无法获得崩溃日志/转储/指标任何形式的原因。任何 JVM 参数、关闭钩子等都无法帮助我获得任何关于可能发生的事情的日志。崩溃不是按命令可重现或不可预测的。大约每 20-30 小时发生一次。
操作系统:亚马逊 Linux AMI
硬件:AWS EC2 T3.medium 实例(4GB 内存)
JVM参数如下
到目前为止尝试的步骤:
尝试 -XX:ErrorFile JVM arg 使用不同的路径和文件名,但无济于事(没有创建错误文件,尝试到处寻找)。绝对没有现有文件会阻止另一个文件被写入。
试过 -XX:+HeapDumpOnOutOfMemoryError JVM arg(没有创建转储文件,试着到处找)。
将应用程序主目录的权限打开到 777,以便日志可以写入。
为了以防万一(使用“which java”命令发现的 Java 目录),Java 主目录的打开权限也为 777:/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.212.b04-0.45 .amzn1.x86_64
检查 GC 日志 - 崩溃前后没有 Full GC,但是 GC 日志即使在稳定时也一直非常活跃,YoungGen 每 10 秒左右进行一次次要回收。导致崩溃的 GC 日志显示与 1 小时或 12 小时前的 GC 日志的模式没有偏差。
检查应用程序日志 - 它总是在一系列 OKHTTP 请求周围崩溃,但同时还有大量其他异步处理内容发生,因此很难判断它是否与 HTTP/网络相关(可能)
在应用程序代码中添加了一个关闭挂钩,以便在退出时将所有堆栈跟踪转储到应用程序日志中,但在崩溃期间没有打印任何内容(但是一个简单的手动“kill PID”命令证明关闭挂钩有效)
很难判断崩溃期间的即时内存使用情况,但间歇性日志显示一两秒后的内存统计信息,然后显示平均使用量约为 1.5GB(在最大 2.5GB 的 JVM 上,有时为 3GB)
尝试了几台不同的 Unix 机器,具有不同数量的 RAM(同样的问题)
尝试愚弄 JVM arg 内存限制(-Xmx)无济于事
我束手无策,只是试图获取崩溃日志以找出可能发生的情况。关于接下来要尝试什么的任何其他建议?
JVM 参数(在 app 主目录的 start.ksh 文件中,以 su 执行):
sudo -u arbadm java -cp ${CLASSPATH} -d64 -Xms2048m -Xmx2560m -Xloggc:../log/gc_ date +%F
.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintTenuringDistribution -XX:+PrintGCCause -XX :+UseGCLogFileRotation -XX:NumberOfGCLogFiles=10 -XX:GCLogFileSize=5M -XX:-OmitStackTraceInFastThrow -XX:+HeapDumpOnOutOfMemoryError -XX:ErrorFile=./hs_err_file_%p.log -Xss4096k -Dsun.java2d.d3d=false com.package 。主要的 &
解决方案
推荐阅读
- material-table - 限制材料表 1.36.2 上的选择数量?
- django - 提示:也许您的意思是引用该列
- asp.net-core - 如何将我的 Web 项目 A 中的外部布局应用到我的 Web 项目 B(asp net core)中?
- javascript - 从 JavaScript 传递 PowerShell 参数值
- python - 将字典映射到数据框,字典值为列表
- gradle - Kotlin 上 Gradle 脚本中的命令行问题
- azure - 每 10 分钟从 azure webjob 或 azure 函数创建 PDF 或 excel
- javascript - 如何通过 graphQL 和 AWS AppSync 发送 JSON 数组以将数据添加到 Dynamo Table?
- c# - WPF DataGrid - 如何在行编辑时连续显示一个按钮(检测编辑模式)?
- gcloud - gcloud 无法启用服务 GCP