查看java内存情况的几个常用命令

摘要:
java命令只需检查jvm内存使用情况。jinfo:您可以输出和修改正在运行的java进程的opt。执行jps命令时,将列出所有正在运行的java进程。jps命令也是一个java程序。前面的数字是对应的进程id,它起着非常重要的作用,稍后将介绍。

java 命令简单查看jvm内存使用状况

jinfo:可以输出并修改运行时的java 进程的opts。

jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。

jstat:一个极强的监视VM内存工具。可以用来监视VM内存内的各种堆和非堆的大小及其内存使用量。

jmap:打印出某个java进程(使用pid)内存内的所有'对象'的情况(如:产生那些对象,及其数量)。

1、jinfo

jinfo:的用处比较简单,就是能输出并修改运行时的java进程的运行参数。用法是jinfo -opt pid 如:查看52606的MaxPerm大小可以用 jinfo -flag MaxPermSize 52606。

查看java内存情况的几个常用命令第1张

2、jps

显示当前所有java进程pid的命令,我们可以通过这个命令来查看到底启动了几个java进程(因为每一个java程序都会独占一个java虚拟机实例),不过jps有个缺点是只能显示当前用户的进程id,要显示其他用户的还只能用linux的ps命令。

查看java内存情况的几个常用命令第2张

执行jps命令,会列出所有正在运行的java进程,其中jps命令也是一个java程序,前面的数字就是对应的进程id,这个id的作用非常大,后面会有相关介绍。

jps -help:

查看java内存情况的几个常用命令第3张

jps -l:

查看java内存情况的几个常用命令第4张

输出应用程序main.class的完整package名或者应用程序jar文件完整路径名

jps -v:输出传递给JVM的参数

查看java内存情况的几个常用命令第5张

jps失效

我们在定位问题过程会遇到这样一种情况,用jps查看不到进程id,用ps -ef | grep java却能看到启动的java进程。

要解释这种现象,先来了解下jps的实现机制:

java程序启动后,会在目录/tmp/hsperfdata_{userName}/下生成几个文件,文件名就是java进程的pid,因此jps列出进程id就是把这个目录下的文件名列一下而已,至于系统参数,则是读取文件中的内容。

我们来思考下:如果由于磁盘满了,无法创建这些文件,或者用户对这些文件没有读的权限。又或者因为某种原因这些文件或者目录被清除,出现以上这些情况,就会导致jps命令失效。

如果jps命令失效,而我们又要获取pid,还可以使用以下两种方法:

1、top | grep java

2、ps -ef |grep java

3、jstat

jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。
jstat -class pid:显示加载class的数量,及所占空间等信息。
jstat -compiler pid:显示VM实时编译的数量等信息。
jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。
jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。
jstat -gcnew pid:new对象的信息。
jstat -gcnewcapacity pid:new对象的信息及其占用量。
jstat -gcold pid:old对象的信息。
jstat -gcoldcapacity pid:old对象的信息及其占用量。
jstat -gcpermcapacity pid: perm对象的信息及其占用量。
jstat -util pid:统计gc信息统计。
jstat -printcompilation pid:当前VM执行的信息。
除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 260 6是每260毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。

4、jmap

主要用于打印指定java进程的共享对象内存映射或堆内存细节。

堆Dump是反映堆使用情况的内存镜像,其中主要包括系统信息、虚拟机属性、完整的线程Dump、所有类和对象的状态等。一般在内存不足,GC异常等情况下,我们会去怀疑内存泄漏,这个时候就会去打印堆Dump。

jmap的用法:

查看java内存情况的几个常用命令第6张

jmap pid

查看java内存情况的几个常用命令第7张

打印的信息分别为:共享对象的起始地址、映射大小、共享对象路径的全程。

jmap -heap pid:查看堆使用情况

查看java内存情况的几个常用命令第8张

map -histo pid:查看堆中对象数量和大小

查看java内存情况的几个常用命令第9张

打印的信息分别是:序列号、Class实例的数量、内存的占用、类限定名

如果是内部类,类名的开头会加上*,如果加上live子参数的话,如jmap -histo:live pid,这个命名会触发一次FUll GC,只统计存活对象

免责声明:文章转载自《查看java内存情况的几个常用命令》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇解决coursera课程国内打不开的问题Android 官方AB Update说明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

排查tomcat服务器CPU占用率过高的问题

1、执行top命令,看具体是哪个进程导致CPU 100%,复制问题进程的PID。 2、执行命令:top -p PID -H      查看指定进程里面的线程状态,定位到CPU太高的线程,开头的PID实际就是线程ID(TID)。 3、执行命令:printf "%x\n" TID     把TID转换为十六进制。 4、执行命令:jstack PID | gre...

(3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析

(3.4)mysql基础深入——mysql.server启动脚本源码阅读与分析 my.server主要分为3大部分 【1】变量初始化部分  【2】函数声明部分  【3】具体执行部分 #!/bin/sh #【第1部分,变量初始化部分begin】 #【1.1】指定Mysql安装程序及数据目录的路径,默认是/usr/local/mysql,默认是空的 ba...

python锁定焦点到指定进程窗口的参考方法

在使用python的过程中,有时会遇到这种需求:开启了很多窗口,需要把焦点锁定到某个进程的窗口上,再对该窗口进行操作。例如:我们打开了notepad.exe和wordpad.exe应用程序,现在需要把焦点定位到notepad窗口上,在notepad窗口中进行输入。 参考代码如下,其原理为:通过获取进程的pid来遍历该进程下的所有窗口,由于notepad.e...

多台机器shell脚本:jps脚本;启动zookeeper脚本;文件分发脚本

1 查看多台机器jps脚本 1)创建vim jpsall atguigu@hadoop102:cd /opt/module/hadoop-2.8.5/bin$ 2) #!/bin/bash for ((host=102;host<105;host++)); do echo ---------------------hadoop$hos...

Android ADB 端口占用问题解决方案

解决ADB端口占用问题 今天准备在准备appium的环境,突然发现自己的adb连接不上模拟机器了,试了好多次也不知道哪里出问题了, 之前用的还好好的,心想有可能是端口被占用了。 5037为adb默认端口,若5037端口被占用 步骤:1. 查看占用端口的进程PID 2. 通过PID查看所有进程 9844 是占用端口的进程的 pid 3. 杀死占用端口的进...

转:zTree树控件扩展篇:巧用zTree控件实现文本框输入关键词自动模糊查找zTree树节点实现模糊匹配下拉选择效果

是否可以借助于zTree实现文本框输入关键词自动模糊匹配zTree下拉树,然后选择下拉树内节点显示在文本框内且隐藏下拉树。 看到这个需求脑子里头大致已经想到了要如何实现这样一个需求,当时是限于时间问题所以没有动手处理。今天闲来无事琢磨了一下这个需求。我的解决思路如下所示: 1、监听文本框的onkeyup事件;实时传递其值到某个函数; 2、编写某个函数接收...