查看java内存情况的⼏个常⽤命令
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。
2、jps
显⽰当前所有java进程pid的命令,我们可以通过这个命令来查看到底启动了⼏个java进程(因为每⼀个java程序都会独占⼀个java虚拟机实例),不过jps有个缺点是只能显⽰当前⽤户的进程id,要显⽰其他⽤户的还只能⽤linux的ps命令。
执⾏jps命令,会列出所有正在运⾏的java进程,其中jps命令也是⼀个java程序,前⾯的数字就是对应的进程id,这个id的作⽤⾮常⼤,后⾯会有相关介绍。
jps -help:
jps -l :
输出应⽤程序main.class的完整package名或者应⽤程序jar⽂件完整路径名
jps -v:输出传递给JVM的参数
grep命令查看进程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的⽤法:
jmap pid
打印的信息分别为:共享对象的起始地址、映射⼤⼩、共享对象路径的全程。
jmap -heap pid:查看堆使⽤情况
map -histo pid:查看堆中对象数量和⼤⼩
打印的信息分别是:序列号、Class实例的数量、内存的占⽤、类限定名
如果是内部类,类名的开头会加上*,如果加上live⼦参数的话,如jmap -histo:live pid,这个命名会触发⼀次FUll GC,只统计存活对象参考资料:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论