Java虚拟机 之 虚拟机工具

1. jps(Java Process Status)

故名思义,就是Java进程的状态,就像是把j(java)去掉,就是ps命令,是Linux中查看进程状态的一样。

这个就是在命令行中输入jps。

现在两个进程,下面的PID685是jps,这个jps本身就是一个java进程;

上面的332是eclipse,在活动监视器中可以看到332到底是什么。

不过,这个332也叫做本地虚拟机唯一ID(Local Virtual Machine Id)。如果这个应用是本地的,那么它和本地的PID是一致的;他也可以显示远程的Java虚拟机的进程信息。

在eclipse中写一个一直在执行的程序,这里用一个Scanner,只要还没输入,这个程序就一直卡在这里。

import java.util.Scanner;

public class JpsClass {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        scanner.next();
    }

}

我将这个程序运行两遍之后,再执行jps -l。

果然,出现了多两个进程,就是刚刚执行的。如果两个进程的组类名不同,在活动监视器中是没办法区分的,因为他们显示着相同的名字,而使用jps -l就可以显示出两个不同的组名,这样就可以做到了区分。

jps还有 -m 参数,它是用来显示这个组类所接收的参数,如果我在这个Program arguments参数中随便填一个123。

再用jps -m试一下。

刚才Program arguments参数填的123在被运行的进程中可以被显示出来了,因为我们输入的jps命令本身就携带一个-m参数,所以在713中的jps也在显示。

那么如何查看VM arguments参数呢?可以使用 -v 参数。

将所有的参数加一块,就可以把所有的信息给显示出来了:jps -mlv。m是运行时传人主类的参数,l是运行的主类的全名或者jar包的全名,v是虚拟机参数。

2. jstat

jstat可以监视虚拟机的各种运行的状态信息(类装载信息,内存情况,垃圾收集情况,以及jit编译器编译过的方法及耗时等)。

jstat是依赖于jps的。为什么这么说?因为我们想要看哪一个进程,首先要先知道它的进程号。

以我们的eclipse为例吧,查看一下它的gc情况,这个操作需要命令 [ jstat -gcutil 进程号 ]

S0:当前Survivor 0 的空间;

S1:当前Survivor 1 的空间;

E:Eden区域;

O:老年代;

M:元空间(元空间本质与永久代类似,元空间并不在虚拟机中,而是使用本地内存,因此元空间大小仅收本地内存限制);

CCS:压缩类的空间;

YGC:年轻代垃圾收集器所回收的次数;

YGCT:YGC收集所耗费的时间;

FGC:Full GC的次数;

FGCT:Full GC所耗费的时间;

GCT:垃圾回收所用的总时间。

目前是只打印一次当前的数值,既然可以监控,假如我想 每1000毫秒打印一次,一共打印十次。

只需往里面添加参数就可以实现了,jstat的参数有很多,这里就先仅作了解吧。

3. jinfo

jinfo可以被用来实时查看和调整虚拟机的各项参数。

先通过jinfo来查看下它的用法。

我们想要查看它是使用的哪个垃圾收集器,虽然说可以直接通过 jps -v 来查看。

直接可以看到这里所使用的是G1收集器。

假如说我们想看它是不是使用了Serial收集器,语法 [ jinfo -flag 名字 进程号]

很显然,UseSerialGC前面带了一个减号,代表没有。

以上只仅仅是查看,jinfo还可以修改这些参数,像描述那样。

4. jmap

看了用法,它可以dump出快照信息,在option中的 -dump,具体语法是 [ jmap -dump:format=b,file=存储路径 进程号]。

已经提示文件已经创建好了,然后我们从刚才的路径下就能找到它。

这样以来就能用一些分析工具来进行分析,找出出现的问题。

除了使用这种方法,还可以使用参数 -XX:+HeapDumpOnOutOfMemoryError 来获取这个快照信息。

还有一个命令是查看当前活着的对象和实例 histo[:live],如果不方便查看也可以使用 | grep 来过滤。

5. jstack

jstack用于生成虚拟机当前时刻的线程快照。

线程快照:当前虚拟机内,每一条线程正在执行的方法堆栈的集合。

其目的就是为了定位出线程出现长时间停顿的原因。

从上面看,主要的参数就是 -F,-m,-l 这三个。

-F:强制打印出线程的信息;

-m:如果调用本地方法,那么将显示本地方法栈;

-l:除了显示堆栈信息,还会打印额外的信息,比如锁的信息。

发布了54 篇原创文章 · 获赞 4 · 访问量 9195

猜你喜欢

转载自blog.csdn.net/yichen97/article/details/101572518
今日推荐