Java线上问题 | 大Json引发的血案

Java线上问题之日志打好与JVM参数配好

  • 这里想说的是打印日志的重要性,它在你定位问题时起到至关重要的作用

以下是这次故障的分析过程:
  1. 服务无法访问,发现CPU被打满,同时进程僵死,jstack无法打印数据(后来了解到 jstack -F 可以暴力获取,可惜没得尝试)
  2. 重启一台机器(另外一台机器保留现场),更改nginx配置去掉另一台的映射
  3. 进程僵死,打印了java.hprof文件(7.3G)
  4. 很快又被打满,无法访问;怀疑是新代码问题,版本回滚,重启
  5. 继续定位问题原因;分析日志时发现有一行日志太大 (128M
  6. 幸好日志打得好,入参和操作人记录了下来,直接找到对方询问
  7. 分析java.hprof文件,很可能是Json反序列化问题(下图)
  8. 复现问题;如愿的再次打满CPU
    hprof文件分析

我们的服务是企业内部系统,所以操作起来简单很多,有了日志追溯,进程僵死打印的java.hprof文件,极有助于本次故障的定位

本次问题的根源是依赖的上游服务返回的测试数据,大Json(128M),在我们反序列化时候,直接致使进程僵死

所以必须做好以下准备,对应线上问题

1、依赖其他服务都必须保有不可信的心,像这样的不正常大Json,不予处理,配好告警
2、方法的出入参尽可能打印日志(如果是极高并发的系统,另当考虑)
3、JVM启动参数必须有以下配置

-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/www/logs
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值