首页 > 系统相关 >JAVA 服务内存占用过高的一次排查过程

JAVA 服务内存占用过高的一次排查过程

时间:2022-10-17 15:57:47浏览次数:42  
标签:JAVA 占用 ConnectionPool 排查 线程 内存 java ThreadPoolExecutor

1. 缘由

一台线上机器内存耗尽,OOM 导致服务注册的 Mesh 客户端被干掉了,大量服务调用异常。运维同事查看机器负载,发现我们组内一个Java 服务占用的内存有点异常,启动命令-Xmx128m 指定了最大堆内存只有 128M,但是整个进程占用的内存达到了 640M,显然是有问题的

2. 线上排查

运维截图一扔,锅是甩不掉的,老老实实登录到线上机器排查。内存占用过高首先想到的就是发生了内存泄露,使用 Jmap -histo $pid > heap.log 输出堆内对象统计情况到文件中,查看文件发现堆中占用内存最多的是各种数组,没有发现明显的问题。没法子,使用 top -H p $pid命令检查该进程内运行的线程状况,终于发现了可疑点,在这个Java 服务里面运行的子线程居然有 5000 个,并且几乎全部都在 Sleeping 状态

 

 这种情况首先想到的是发生了线程死锁,资源争用导致大量线程被阻塞了。使用 jstack -l $pid > stack.log 将线程栈相关状况输出到文件中,打开文件一搜索却大失所望,根本没有死锁发生。线程状态大都在 TIMED_WAITING,不过随着一行行往下看,也发现了一个可疑点,以下这种 OkHttp ConnectionPool 的线程出现得太多了,线程序号甚至达到了1082707

"OkHttp ConnectionPool" #1082707 daemon prio=5 os_prio=0 tid=0x00007f564c18f000 nid=0x1a4d in Object.wait() [0x00007f5602cb4000]
   java.lang.Thread.State: TIMED_WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        at java.lang.Object.wait(Object.java:460)
        at okhttp3.ConnectionPool$1.run(ConnectionPool.java:67)
        - locked <0x00000000fc30fb30> (a okhttp3.ConnectionPool)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)

   Locked ownable synchronizers:
        - <0x00000000fc305f98> (a java.util.concurrent.ThreadPoolExecutor$Worker)

 

标签:JAVA,占用,ConnectionPool,排查,线程,内存,java,ThreadPoolExecutor
From: https://www.cnblogs.com/chenghening/p/16799465.html

相关文章

  • Java 多线程(六)线程同步
    并发同一个对象被多个线程同时操作  线程同步现实生活中,我们会遇到同一个资源,多个人都想使用的问题。比如,食堂排队打饭,每个人都想吃饭最天然的解决办法就是......
  • Design Patterns in JavaScript: Module, Revealing Module
    <html><head></head><body><h1>DesignPatternsinJavaScript:Module,RevealingModule</h1><divid="root"></d......
  • 【java开发】快速搭建java开发环境(在线开发)
    1、简介Java是由SunMicrosystems公司于1995年5月推出的高级程序设计语言。Java可运行于多个平台,如Windows,MacOS及其他多种UNIX版本的系统。Java是一门......
  • 人为提升服务器CPU、内存、硬盘使用率
    一、CPU使用率vikyd/go-cpu-load:GenerateCPUloadonWindows/Linux/Mac(github.com)所有CPU核心负载30%运行10秒钟./cpu-p30-t10所有CPU核心负载30%持续运......
  • Java基础(八)| 常用API与StringBuilder详解
    ⭐本专栏旨在对JAVA的基础语法及知识点进行全面且详细的讲解,完成从0到1的java学习,面向零基础及入门的学习者,通过专栏的学习可以熟练掌握JAVA编程,同时为后续的框架学习,进阶开......
  • 一次磁盘占用率 100% 的排查记录
    一次磁盘占用率100%的排查记录你好,我是悟空。最近遇到一个服务器的问题:磁盘满了,占用率100%~这个问题太常见了,于是先来排查一波是哪些文件占用了大量磁盘。一、排查磁......
  • 夯实基础之内存回收
    内核在给应用程序分配物理内存的时候,如果空闲物理内存不够,那么就会进行内存回收的工作,主要有两种方式:后台内存回收:在物理内存紧张的时候,会唤醒kswapd内核线程来回收内存......
  • java 集合对象排序
    关于集合内部排序,采用comparator方法做:1.按属性数字大小排序:点击查看代码taskBoxs.sort(newComparator<TCComponent>(){ @Override publicintcompare(TCCom......
  • 使用install4j将java的class文件打包成exe的详细操作
    介绍install4j是一个功能强大的,多平台Java安装文件生成工具,用于生成Java应用程序本地化的安装及应用程序发布。此处主要是讲,如何将一个java工程、jdk、tomcat、mysql使用ins......
  • Java开发成长之路第二年
    •介绍•深入注解•深入Java集合java.util.Queue<E>java.util.Deque<E>java.util.RandomAccess该接口没有定义任何方法。java.util.concurrent.ConcurrentMap<String,......