热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

一次Java应用内存泄露排查血泪史

JVM排

一次Java应用内存泄露排查血泪史 

一、故事背景

最近研究院的猴子们,支持公司的一个重点项目,遇到一个诡异的项目,一个运行在容器云上的Java应用(OA类的一个附件上传应用),JDK版本为1.8,基础镜像为ocp的tomcat8,此应用在运行一段时间后就自动重启,而且比较规律,几乎是一个小时一次,该集群其他应用正常运行,分析平台日志,仅是能看到此应用所在Pod在一直在CrashLoopBackOff,难道是被传说中的OOM砸中了?查看应用日志并没有发现有关OOM的报错,应用能看到的日志翻完也没啥有价值的信息,只能去找服务器日志了,查看主机的dmesg日志,发现Cgourp将此Java应用的进程Kill掉了,此时容器的内存Limit值为8G。报错如下图所示



上图可以发现,此java应用超过8G了,果断调大容器内存的Limit值为16G,理所当然这波肯定是没啥作用,过了几个小时内存飙到了17G,应用又被Cgroup干掉了,java真是一往无前,一计不成只能再生一计,此时想到jdk8并不能自动发现容器的限制,会不会是JVM的参数没生效呢?接着修改tomcat容器的启动脚本,设置-Xms16g Xmx16g,容器limit也设置为16g。终于Cgroup没再动杀心了,但是应用在跑一段时间后内存仍旧居高不下,并且应用也变得奇卡无比。

世上果然没有过不去的坎,一坎过去又一坎,查看日志发现会有Redis连接超时的日志,目标转向Redis,查看Redis服务端日志发现会有如下报错
Client id=56506 addr=172.0.7.0:58852 fd=30 name= age=1 idle=0 flags=N db=0 sub=2 psub=1 multi=-1 qbuf=48 qbuf-free=32720 obl=0 oll=2869 omem=47069133 events=rw cmd=psubscribe scheduled to be closed ASAP for overcoming of output buffer limits.
发现是buffer limits超出了,修改Redis的ConfigMap配置,重启pod后问题解决。Redis正常了,应用还是卡、慢、内存爆炸!下面就是今天的重头戏了。


二、JVM内存分析

系统慢,内存高,绕也绕不过的JVM,盘它!
1.首先进到Java应用所在的Pod里,jps命令找到java应用的pid


2.jmap和jstat分析堆内存各区使用情况

jmap -heap

jstat -gcutil 294 1000

发现新生代和老年代居然已经都已经100%了!应用没跑多久,jvm已经做了297次FullGC了,平均11.5s做一次FullGC,看来猫腻就在这了,所以就开始分析堆内存吧

jmap -histio

有一个io.lettuce.core的东西实例达到了3亿多实例没有回收!,问题已经定位到了,目标锁定,全军出击!Lettcue是Redis的Java客户端,怀疑是线程没有被正确释放,实例数无法销毁,升级Lettcue版本问题解决。

今天的内容就到这里了,我们下期再见~



推荐阅读
  • 微服务应用性能如何?APM监控工具来告诉你
    当微服务系统越来越庞大,各个服务间的调用关系也变得越来越复杂,需要一个工具来帮忙理清请求调用的服务链路。之前使用的是Sleuth+Zipkin的解决方案,最近发现应 ... [详细]
  • 以下内容|尾部_quarkus实战之一:准备工作
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了quarkus实战之一:准备工作相关的知识,希望对你有一定的参考价值。欢迎访问我的GitHub ... [详细]
  • Android性能优化检测App卡顿
    在移动APP性能评测-流畅度评测中,我们介绍了如何准确客观评价APP的流畅度,最终采用SM指标来评价应用的流畅度,在知道如何评价流畅度之后 ... [详细]
  • kafkamanager(cmak)安装及使用
    1.软件下载kafka-manager工具目前改名为cmak,下载地址为:https:github.comyahooCMAKreleasestag3.0.0.5现在 ... [详细]
  • 故障申报系统php源码,运维不再专业救火 不会PHP照样找出代码性能问题
    作者:凉白开网站:www.ttlsa.com身处互联网的SA(运维)们总感叹自己职业的苦逼,Why?我来告诉你:APP奔溃、 ... [详细]
  • mysql oneproxy稳定吗_Mysql 中间件 oneProxy总结
    建议使用之前把官方的文档全部通读一遍这里提供一个我的网盘地址oneproxy百度网盘0.先对oneproxy有个大概的了解,知道他所处的位置1.MySQL服务器创建t ... [详细]
  • 突然觉得服务器ssh密码登录总是浪费一定量的时间,就想试试用sshKey进行登录。生成服务器sshkey和本地sshkey$ssh-keygen在服务器上生成一个authorize ... [详细]
  • 一、域名解析记录说明记录类型A:用来指定域名的IPv4地址(如:8.8.8.8),如果需要将域名指向一个IP ... [详细]
  • 【JVM技术专题】深入分析CG管理和原理查缺补漏「番外篇」
    前提概要本文主要针对HotspotVM中“CMSParNew”组合的一些使用场景进行总结。自Sun发布Java语言以来,开始使用GC技术来进行内存自动管理࿰ ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • Java 11相对于Java 8,OptaPlanner性能提升有多大?
    本文通过基准测试比较了Java 11和Java 8对OptaPlanner的性能提升。测试结果表明,在相同的硬件环境下,Java 11相对于Java 8在垃圾回收方面表现更好,从而提升了OptaPlanner的性能。 ... [详细]
  • 在实际开发中,现在安卓端和后台之间的数据交互,一般都是用JSON来传递数据信息。JSON大家一般都比较熟悉。我这边就以实际项目中的后台传过来的情况和大家分析下及如何处理。比如后台返 ... [详细]
  • MYSQL log_error_verbosity 和 Binlog_error_action
    MYSQL的错误日志的详细度其实不少人是忽略的,实际上MYSQL这边的关于告警和错误日 ... [详细]
  • 纠正网上的错误:自定义一个类叫java.lang.System/String的方法
    本文纠正了网上关于自定义一个类叫java.lang.System/String的错误答案,并详细解释了为什么这种方法是错误的。作者指出,虽然双亲委托机制确实可以阻止自定义的System类被加载,但通过自定义一个特殊的类加载器,可以绕过双亲委托机制,达到自定义System类的目的。作者呼吁读者对网上的内容持怀疑态度,并带着问题来阅读文章。 ... [详细]
author-avatar
liujiayan0529_584
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有