定位Java程序内存使用过高或者内存泄漏的问题跟CPU也类似,一般可以分为以下3个步骤:

定位进程

定位线程

定位具体方法(代码部分)

一、定位进程

通过top -c(然后按Shift+M按内存排序),或者htop等工具定位到具体的高内存进程。假设定位到的进程ID为14279。

二、定位线程

2.1 通过top查看线程

top -H -p 14279(然后按Shift+M按内存排序)定位占内存的线程:

%Cpu(s): 0.5 us, 0.7 sy, 0.0 ni, 98.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st

KiB Mem : 8168236 total, 231696 free, 3660496 used, 4276044 buff/cache

KiB Swap: 969964 total, 969964 free, 0 used. 4197860 avail Mem

PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

14293 weiping 20 0 4508772 97036 18112 S 10 12 152:35.42 java

14279 weiping 20 0 4508772 97036 18112 S 5.0 1.2 0:00.00 java

14282 weiping 20 0 4508772 97036 18112 S 0.0 1.2 0:00.37 java

2.2 通过ps统计下当前进程的线程数

ps p 14279 -L -o pcpu,pmem,pid,tid,time,tname,cmd |wc -l

2.3 初步判断

通过以上二步确认是否线程开多了,还是单个线程内存占用过多导致。

如果是线程过多,那么就要去排查具体原因。是服务器线程,还是业务代码中的多线程导致?

如果是单线程内存占用,那么就要dump快照或者本地尝试模拟重现。

2.4 查看线程信息

通过thread tid直接查看指定线程的堆栈信息:

[arthas@42436]$ thread 91

"MQ-AsyncTraceDispatcher-Thread-ce0ebd2a-5807-4053-ae3c-7472fe4b5aef" Id=91 TIMED_WAITING on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@774405a1

at sun.misc.Unsafe.park(Native Method)

-- waiting on java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject@774405a1

at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)

at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)

at java.util.concurrent.ArrayBlockingQueue.poll(ArrayBlockingQueue.java:418)

at org.apache.rocketmq.client.trace.AsyncTraceDispatcher$AsyncRunnable.run(AsyncTraceDispatcher.java:238)

at java.lang.Thread.run(Thread.java:748)

Affect(row-cnt:0) cost in 2 ms.

三、定位具体方法

3.1 通过jmap dump内存快照

如果是线上环境,注意dump之前必须先将流量切走,否则大内存dump是直接卡死服务。

```

# dump当前快照

jmap -dump:live,format=b,file=dump.hprof

# 触发full gc,然后再dump一次

jmap -dump:live,format=b,file=dump_gc.hprof

```

dump:live的作用是会触发Full GC,然后再dump数据,用作gc前后的数据做对比。

3.2 使用MAT分析

如果快照文件不大,可以下载到本地,然后通过MAT分析。

3.3 上传到fastthread.io分析

3.4 通过jhat分析

如果快照文件很大,可以在服务器上直接分析:

faceless@ttg12:~/tmp$ jhat dump.hprof

Reading from dump.hprof...

Dump file created Mon Jun 22 14:33:00 CST 2020

Snapshot read, resolving...

Resolving 36246 objects...

Chasing references, expect 7 dots.......

Eliminating duplicate references.......

Snapshot resolved.

Started HTTP server on port 7000

Server is ready.

分析完成后,访问http://ttg12:7000,如下图:

点进入看实例数(图来自网络,这里只是示意):

找到数量大的业务类,比如上图中是Packet。然后一路点进去,跟踪引用路径,看到底是哪个类引用的。

3.5 通过Arthas分析

TO BE FINISHED——也可以通过服务器上的Arthas分析。

java内存过高_Java应用问题定位系列——内存占用过高相关推荐

  1. java垃圾回收菜鸟_java程序员不懂JVM内存回收,两年后也是个菜鸟

    java程序员不懂JVM内存回收,两年后也是个菜鸟 在学java程序员的时候,如果你还不懂JVM内存回收,那么你就只能是个很一般的程序员菜鸟了,那么什么是JVM内存回收呢?今天我们就来学习,都还不深入 ...

  2. java 堆内存使用情况_java语言:JVM堆内存使用率持续上升如何排查

    最近新版本发布后,在运行一段时间后程序突然无响应了,观察监控,发现JVM堆内存占用在某个时间点突然飙升,最终导致应用无响,希望对大家学习java语言有所帮助. 重启Tomcat后,应用恢复正常,并且后 ...

  3. 服务器cpu 单核过高的影响,一次单核CPU占用过高问题的处理

    案例 客户现场反馈,top的检查结果中,一个CPU的占用一直是100%.实际上现场有4个CPU,而且这个服务器是mysql专属服务器. 我的第一反应是io_thread一类的参数设置有问题,检查以后发 ...

  4. 软件测试cpu占用高,六个方法解决Win10 CPU占用过高卡顿 亲测有效

    大多数小伙伴的电脑系统都已经升级到最新版的Win10,我就想问一句"卡吗"?最近我发现,Win10有时会出现卡顿现象.一点击查看CPU占用情况,好家伙居然都已经出现红色警戒线了.那 ...

  5. Java高并发编程详解系列-内存模型

    volatile关键字介绍,要了解volatile需要了解的还有Java内存模型,以及CPU内存模型等知识.首先从CPU和Java内存模型开始说起. CPU Cache模型   在之前的时候,分享过一 ...

  6. java try catch陷阱_java异常捕捉陷阱(内存泄漏,finally块,catch块,继承得到的异常)...

    1.    异常捕捉的陷阱 异常处理机制是java语言的特色之一,尤其是java语言的Checked异常,更是体现了java语言的严谨性:没有完善错误处理的代码根本不会被执行.对于Checked异常, ...

  7. java面试常考_JAVA面试常考系列十

    JAVA面试常考系列十 题目一 Servlet是什么? Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要的 ...

  8. java 线程池 分组_JAVA面试题解惑系列(十)——话说多线程

    线程或者说多线程,是我们处理多任务的强大工具.线程和进程是不同的,每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享:而线程是运行在进程内部的,每个正在运行的进程至少有一个线程 ...

  9. java 限制发送频率_java发送短信系列之限制日发送次数

    在前两篇文章中, 我们实现了同步/异步发送短信以及限制发送短信频率.这一篇, 我们介绍一下限制每日向同一个用户(根据手机号和ip判断)发送短信的次数 1.数据表结构 由于需要记录整天的发送记录, 因此 ...

最新文章

  1. Maya 2022中的硬表面建模技术学习视频教程
  2. 创建Maven版Java工程
  3. OpenSSL常用命令快速上手
  4. 谷歌和 Facebook 是如何给工程师定职级和薪水的?
  5. uvalive4744(数论)
  6. QT学习:网络应用开发练习(简单网页浏览器)
  7. OpenCV向Facemark API添加新算法
  8. Codeforces Round #374 (Div. 2) A. One-dimensional Japanese Crosswor 水题
  9. 删除linux内核多余架构,删除多余Linux内核方法
  10. PlaceHolder和Panel的区别【搜藏】
  11. C语言读取raw格式图像,求指导,如何用c语言实现读取*.raw格式图像
  12. python 3.9 性能_Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型
  13. 宝塔Linux面板公司,宝塔面板_宝塔Linux面板-九州数码,一站式云安全服务平台
  14. php curl读取头,php curl 获取请求头与DNS解析
  15. Python2.7打包的exe文件反编译成py文件
  16. adb命令——简单常用命令介绍:截图——adb shell screencap -p /sdcard/123.png...
  17. 银行叫号排队系统C语言,【分享】C语言 银行取票排队系统
  18. Java五子棋(人机版),昨天买的棋子今天就用不上了
  19. 阿里云大学安全课程-阿里云首席安全研究员吴瀚清:WannaCry事件最“细思恐极“的一个事实是?...
  20. 渗透服务器修改数据,渗透测试之:从端口入侵服务器

热门文章

  1. 20210421用一条电线和一颗电池点亮灯泡,麻省理工(MIT)毕业生竟然不会?
  2. LWN: folio 改动未能合入!
  3. Java封装详解,很简单
  4. 大数据类型主要分为哪几类,大数据挖掘商业价值方法主要分为哪几种?
  5. 爱情保证书制作生成微信小程序源码下载
  6. oracle impdp logfile,ORACLE中impdp的总结
  7. 线索化二叉树的建立与遍历
  8. oracle 覆盖 impdp,oracle的expdp/impdp的使用
  9. 概率统计笔记:高斯分布的联合概率密度
  10. 区位码-GB2312