java内存过高_Java应用问题定位系列——内存占用过高
定位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应用问题定位系列——内存占用过高相关推荐
- java垃圾回收菜鸟_java程序员不懂JVM内存回收,两年后也是个菜鸟
java程序员不懂JVM内存回收,两年后也是个菜鸟 在学java程序员的时候,如果你还不懂JVM内存回收,那么你就只能是个很一般的程序员菜鸟了,那么什么是JVM内存回收呢?今天我们就来学习,都还不深入 ...
- java 堆内存使用情况_java语言:JVM堆内存使用率持续上升如何排查
最近新版本发布后,在运行一段时间后程序突然无响应了,观察监控,发现JVM堆内存占用在某个时间点突然飙升,最终导致应用无响,希望对大家学习java语言有所帮助. 重启Tomcat后,应用恢复正常,并且后 ...
- 服务器cpu 单核过高的影响,一次单核CPU占用过高问题的处理
案例 客户现场反馈,top的检查结果中,一个CPU的占用一直是100%.实际上现场有4个CPU,而且这个服务器是mysql专属服务器. 我的第一反应是io_thread一类的参数设置有问题,检查以后发 ...
- 软件测试cpu占用高,六个方法解决Win10 CPU占用过高卡顿 亲测有效
大多数小伙伴的电脑系统都已经升级到最新版的Win10,我就想问一句"卡吗"?最近我发现,Win10有时会出现卡顿现象.一点击查看CPU占用情况,好家伙居然都已经出现红色警戒线了.那 ...
- Java高并发编程详解系列-内存模型
volatile关键字介绍,要了解volatile需要了解的还有Java内存模型,以及CPU内存模型等知识.首先从CPU和Java内存模型开始说起. CPU Cache模型 在之前的时候,分享过一 ...
- java try catch陷阱_java异常捕捉陷阱(内存泄漏,finally块,catch块,继承得到的异常)...
1. 异常捕捉的陷阱 异常处理机制是java语言的特色之一,尤其是java语言的Checked异常,更是体现了java语言的严谨性:没有完善错误处理的代码根本不会被执行.对于Checked异常, ...
- java面试常考_JAVA面试常考系列十
JAVA面试常考系列十 题目一 Servlet是什么? Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,是用Java编写的服务器端程序,主要的 ...
- java 线程池 分组_JAVA面试题解惑系列(十)——话说多线程
线程或者说多线程,是我们处理多任务的强大工具.线程和进程是不同的,每个进程都是一个独立运行的程序,拥有自己的变量,且不同进程间的变量不能共享:而线程是运行在进程内部的,每个正在运行的进程至少有一个线程 ...
- java 限制发送频率_java发送短信系列之限制日发送次数
在前两篇文章中, 我们实现了同步/异步发送短信以及限制发送短信频率.这一篇, 我们介绍一下限制每日向同一个用户(根据手机号和ip判断)发送短信的次数 1.数据表结构 由于需要记录整天的发送记录, 因此 ...
最新文章
- Maya 2022中的硬表面建模技术学习视频教程
- 创建Maven版Java工程
- OpenSSL常用命令快速上手
- 谷歌和 Facebook 是如何给工程师定职级和薪水的?
- uvalive4744(数论)
- QT学习:网络应用开发练习(简单网页浏览器)
- OpenCV向Facemark API添加新算法
- Codeforces Round #374 (Div. 2) A. One-dimensional Japanese Crosswor 水题
- 删除linux内核多余架构,删除多余Linux内核方法
- PlaceHolder和Panel的区别【搜藏】
- C语言读取raw格式图像,求指导,如何用c语言实现读取*.raw格式图像
- python 3.9 性能_Python 3.9 性能优化:更快的 list()、dict() 和 range() 等内置类型
- 宝塔Linux面板公司,宝塔面板_宝塔Linux面板-九州数码,一站式云安全服务平台
- php curl读取头,php curl 获取请求头与DNS解析
- Python2.7打包的exe文件反编译成py文件
- adb命令——简单常用命令介绍:截图——adb shell screencap -p /sdcard/123.png...
- 银行叫号排队系统C语言,【分享】C语言 银行取票排队系统
- Java五子棋(人机版),昨天买的棋子今天就用不上了
- 阿里云大学安全课程-阿里云首席安全研究员吴瀚清:WannaCry事件最“细思恐极“的一个事实是?...
- 渗透服务器修改数据,渗透测试之:从端口入侵服务器