Java 进程资源使用率较高问题定位

在实际开发过程中,有些 Java 程序在本地或者在服务器上都可以运行的较正常,但是运行较长一段时间后,可能会出现资源占用率较高的情况,例如 CPU 或 内存占用率较高等情况,以至于发生内存溢出,进程假死等的情况。这些问题发生的原因,往往是那些易忽略的编程规范导致的。下面描述一个定位开发环境上资源占用率较高问题的流程。

1. top 命令查看资源占用率进程

获得占用资源较高的进程 pid 后,可以通过 ps -ef | grep pid 查看该进程属于哪一个服务,方便后续查看具体代码,搜索问题。

2.查看该进程下哪些线程资源占用率较高

使用 top -Hp pid 可以查看该进程下各线程的资源占用情况,找到资源占用较高的线程 pid,此处以 t_pid 表示该值。此处需要切换为执行 pid 进程的用户来查看进程信息。

后续使用的命令可能需要自己下载对应版本的 jdk,一般环境上只提供服务运行的 jre。这里简单的方式为下载服务对应的 java 版本的 jdk,例如放在 /tmp 目录下,配置 ~/.bashrc 文件,添加如下内容,并执行 source .bashrc

JAVA_HOME=/tmp/jdk/
JRE_HOME=$JAVA_HOME/jre
JAVA_BIN=$JAVA_HOME/bin
CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib
PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin
export JAVA_HOME JRE_HOME PATH CLASSPATH
export JAVA_OPTS=-Djava.awt.headless=true

3.查看 pid 进程的堆栈信息

使用 jstack pid 查看该进程下各线程的堆栈信息,搜索线程中 nid 值为上一步获得的 t_pid 线程。如果是一般用户线程,则可以根据线程的调用链,在服务代码中定位出具体故障位置。

4.查看内存使用情况

使用 jmap -heap pid 查看内存中各区域使用情况,使用 jmap -histo pid 查看内存中的存储对象类型。如果上一步堆栈信息中占用资源较高的线程为 GC 线程的话,则该步骤查看的内存使用情况可以辅助判断 GC 的性能优略。

如果是 CPU 使用率过高,一般是该 t_pid 为一个死循环;如果是内存使用率过高,则该 t_pid 可能为 GC 线程或构造对象线程。

下面提供一种曾经遇到过的场景供参考:

使用 top 命令查看资源使用情况时发现,CPU 使用率一直较高,内存使用率忽高忽低。在具体进程中发现有两个线程的 CPU 使用率较高,在进程堆栈中查看这两个线程一个为 VM Thread 协调线程,一个为 GC 线程。查看内存使用,发现偶尔内存各区域会出现占满情况,且存储大量 MapEntry 对象,因为关联关系为强引用,导致 GC 效率较低且频繁执行,进程空间得不到释放,直到线程执行完毕。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏CRM日记本

为什么CRM最终要成为Social CRM?

CRM即客户关系管理系统,它犹如一座巨大的地下城堡,为您存储着静止不变的海量客户信息。

13320
来自专栏用户2412665的专栏

“零隐私”时代下 数字身份如何破局

“身份”这个词在人类社会中有着重要的意义。在百度百科上,它被诠释为人的出身和社会地位。也有人会将“身份”这个词拓展,将它的意义覆盖到到出身、阶层、职业、地位、状...

10910
来自专栏软件开发-青出于蓝

Go中运用chan的简单案例 原

简要说明:Go中可以创建有缓冲的chan(比如:  c1:=make(chan int,4)就是缓冲区大小为4的chan了 ),也可以创建没有缓冲的chan(...

13930
来自专栏软件开发-青出于蓝

在我lenovo上装windows10 原

1、用大白菜制作U盘启动盘(用ISO模式制作——直接将windows的iso写入到U盘中)

8120
来自专栏用户5084575的专栏

如何利用内网穿透,异地访问NAS文件

NAS存储从诞生以来就备受大家的喜欢, 得益于多系统互访、即插即用、小开销、多协议等优点,很多企业都会采用他来存储和共享资源,也有很多个人玩家自建NAS服务,玩...

75330
来自专栏帅哥哥写代码

mysql数据库简介

26710
来自专栏让技术和时代并行

ssdb 主从同步复制配置详细步骤

有时我们在使用数据库时,像mongodb,redis和一些关系行数据,为了使数据更加安全,作为备份使用我们经常习惯使用主从复制架构,当主机上的数据出现问题时...

9120
来自专栏CRM日记本

Salesforce到底是什么?

欢迎了解Salesforce!Salesforce改变了技术的游戏规则,有很多提高生产力的功能,这将会帮助你更快速和聪明的销售。下面我们将会介绍这些功能并会回答...

23210
来自专栏linux、Python学习

Linux系统LVM逻辑卷工作原理,必看~

其实在Linux操作系统中,磁盘管理机制和windows上的差不多,绝大多数都是使用MBR(Master Boot Recorder)都是通过先对一个硬盘进行分...

18140
来自专栏CRM日记本

Salesforce的对象简介

Force.com 平台提供了一个强大的数据库,有很多特性可以帮助你快速和简单的创建应用。在一个关系数据库中,数据存在表中。每个表由不同类型的列组成,例如文本,...

16330

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励