目录

1.linux系统:

2.win系统:


1.linux系统:

1.找到内存较高的进程号

# 先用top命令查询占用内存较高的java进程
top
# 再用top -H -p【进程号】找到占用线程比较高的线程
top -H -p27604
# 再用linux自带的命令进行转换,将10进制转换成16进制
printf "%x\n" 28078

2.top常用命令

top -c 显示 完整命令:启动进程的命令语句

按进程的内存使用率排序:运行top命令后,键入大写M

按进程的CPU使用率排序:运行top命令后,键入大写P
-b 批处理
-c 显示完整的治命令
-I 忽略失效过程
-s 保密模式
-S 累积模式
-i<时间> 设置间隔时间
-u<用户名> 指定用户名
-p<进程号> 指定进程
-n<次数> 循环显示的次数

 

java 查看windows操作系统子进程 windows查看java进程命令_linux

参数详解:

32998700k total — 物理内存总量(32GB)
32693388k used — 使用中的内存总量(32GB)
305312k free — 空闲内存总量(305M)
10316k buffers — 缓存的内存量 (10M)
第五行,swap交换分区信息,具体信息说明如下:
8388600k total — 交换区总量(8GB)
8388580k used — 使用的交换区总量(8GB)
20k free — 空闲交换区总量(20k)
2942060k cached — 缓冲的交换区总量(2.9GB)

 注意:
第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached,按这个公式此台服务器的可用内存:305312k +10316k +2942060k = 3.25GB左右。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。

3.使用jstack命令将线程堆栈dump下来

# 使用jstack命令将线程堆栈dump下来
jstack -l 27604 >/appstore/27604.log

4. 在线程堆栈中查询该线程 

2.win系统:

windows使用资源管理器 + 微软提供的 Process Explorer 查到占用CPU资源过高的线程, 再通过jstack命令dump下来,jstack是jdk的命令所以linux和windows操作命令相同

举个如何使用Process Explorer查找进程和线程号的例子:

1.通过资源管理器找到占用CPU服务,右键选择转到详细信息,找到该服务的进程号

java 查看windows操作系统子进程 windows查看java进程命令_堆栈_02

2. 使用jstack命令将线程堆栈dump下来>指定路径

jstack -l 27604 >/appstore/27604.log

3.双击运行procexp.exe

java 查看windows操作系统子进程 windows查看java进程命令_jvm_03

4.根据pid找到服务右键选择properties

java 查看windows操作系统子进程 windows查看java进程命令_sed_04

5.选择Threads查看tid线程号

java 查看windows操作系统子进程 windows查看java进程命令_sed_05

 6.在线程堆栈中查询该线程

# 将10进制转换成16进制
printf "%x\n" 28078
# 在线程堆栈中查询该线程

java 查看windows操作系统子进程 windows查看java进程命令_堆栈_06