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

news/2025/6/12 20:02:43

java

线上

问题

分析

大JSON引发的“血案

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

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

分析过程

一、描述产生的问题

服务无法访问,发现CPU被打满,同时进程僵死,jstack无法打印数据(后来了解到 jstack -F 可以暴力获取,可惜没得尝试)。

二、要不先重启试试?

经常在开发中,有些神奇的现象是,重启后就好了,所以这里重启一台机器(另外一台机器保留现场),更改nginx配置去掉另一台的映射,发现并不如愿。

三、继续观察重启后进程日志

一段时间后,进程僵死,打印了java.hprof文件(7.3G),很快又被打满,无法访问;怀疑是新代码问题,版本回滚,重启。

四、走运发现了一行异常日志

继续定位问题原因;分析日志时发现有一行日志太大 (128M),幸好日志打得好,入参和操作人记录了下来,直接找到对方询问。

五、分析dump日志

分析java.hprof文件,很可能是Json反序列化问题

复现问题;如愿的再次打满CPU 。

总结

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

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

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

1、依赖其他服务都必须保有不可信的心,像这样的不正常大Json,不予处理,配好告警

2、方法的出入参尽可能打印日志(如果是极高并发的系统,另当考虑) 

3、JVM启动参数必须有以下配置

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/var/www/logs

Java 应用性能调优的一些实践

可视化界面在线生成JVM参数

java内存溢出问题分析过程二(附MAT超全操作文档)

使用Eclipse Memory Analyzer Tool(MAT)分析线上故障(一)

一文让你理解什么是shallow heap及retained heap

内存分析诊断系列-理解heap dump

记一次服务器被当肉鸡挖矿的经历

如何编写一个可复用的SpringBoot应用运维脚本

高效率编写Dockerfile需要绕过的一些坑

Mysql百万量级数据高效导入Redis

多线程之CountDownLatch的用法及原理笔记

我就知道你“在看”

文章来源:https://blog.csdn.net/u012811805/article/details/106547395
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-1219093.html

相关文章

OpenStack Hacker养成指南

0 阅读指南 希望本文能够解开你心中萦绕已久的心结,假如是死结,请移步到 https://wiki.openstack.org/wiki/Main_Page学习OpenStack其实就是学习各种Python库的过程。把OpenStack的设计原则贴在你的墙上。 https://wiki.openstack.org/wiki/BasicDesignT…

Microsoft Ignite 2019开发人员的5大建议

微软的年度Ign​​ite会议通常迎合IT专业人员,重点是服务器,应用程序和管理工具。 今年情况并非如此,开发人员所占的份额更大。 真的,这并不奇怪。 微软到云巨头的过渡几乎已经完成,现代混合云需要可以利用Azure的超大…

[原] KVM虚拟机网络闪断分析

背景 公司云平台的机器时常会发生网络闪断,通常在10s-100s之间。 异常情况 VM出现问题时,表现出来的情况是外部监控系统无法访问,猜测可能是由于系统假死,OVS链路问题等等。但是在出现网络问题的时候,HV统一的表现为io…

python编写一个简单计算器_求用Python写一个简单的计算器!

2016-12-03 回答 python计算器实现: wx.textctrl(文本输入控件),这个作为计算器的显示屏,点击数字时用appendtext方法将数字添加至文本末尾,要取出数字时用getvalue方法,点击运算符时要将文本框…

MySQL存储过程的动态行转列

01前言在数据库存储格式和报表展现形式不同的时候,需要进行一下行转列的操作,开始也在网上找到一些MySQL行转列的例子,但大部分都是静态的,要么就是不知所云,说的不是很清楚,下面我以一个简单的数据库为例子…

异步编程:轻量级线程同步基元对象

从此图中我们会发现 .NET 与C# 的每个版本发布都是有一个“主题”。即:C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程。现在我为最新版本的“异步编程”主题写系列分享,期待你的查看及点评。 传送门:异步编程系列目录……

LInux上使用extundelete进行数据恢复

原文链接:https://blog.51cto.com/wzlinux/2052835一、背景突发事件,应用上传的数据被程序自动删掉了,可悲的是还没有数据备份,数据是放在系统的 /data/webapps/xxxx/upload 目录下面,可把我们急坏了,之前又…

使用multipart/form-data上传文件

2019独角兽企业重金招聘Python工程师标准>>> 1.使用POST发送数据 以POST方式发送数据主要是为了向服务器发送较大量的客户端的数据,它不受URL的长度限制。POST请求将 数据以URL编码的形式放在HTTP正文中,字段形式为fieldnamevalue&#xf…

abstract class和interface有什么区别

声明方法的存在而不去实现它的类被叫做抽象类( abstract class ),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建 abstract 类的实例。然而可以创建一个变量&#xf…

Red Hat的Quarkus Java堆栈即将投入生产

快速,轻便,开源的Quarkus Java堆栈将从其当前的beta名称中毕业,并将于11月底作为生产版本提供。 由Red Hat赞助的面向微服务的Java堆栈支持反应式和命令式编程模型。 Quarkus是Kubernetes原生Java堆栈,用于云原生和无服务器应用程…