Java下令学习系列(一)——Jps

收录于话题
#Linux下令
7个

jps位于jdk的bin目录下,其作用是显示当前系统的java历程情形,及其id号。 jps相当于Solaris历程工具ps。不象"pgrep java"或"ps -ef grep java",jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用程序,包罗纵然没有使用java执行体的那种(例如,定制的启动 器)。另外,jps仅查找当前用户的Java历程,而不是当前系统中的所有历程。

位置


我们知道,许多Java下令都在jdk的JAVA_HOME/bin/目录下面,jps也不破例,他就在bin目录下,以是,他是java自带的一个下令。

功效


jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java历程pid的下令,简朴适用,异常适合在linux/unix平台上简朴察看当前java历程的一些简朴情形。

原理


jdk中的jps下令可以显示当前运行的java历程以及相关参数,它的实现机制如下: java程序在启动以后,会在java.io.tmpdir指定的目录下,就是暂且文件夹里,天生一个类似于hsperfdataUser的文件夹,这个文件夹里(在Linux中为/tmp/hsperfdata{userName}/),有几个文件,名字就是java历程的pid,因此列出当前运行的java历程,只是把这个目录里的文件名列一下而已。 至于系统的参数什么,就可以剖析这几个文件获得。

hollis@hos:/tmp/hsperfdata_hollis$ pwd
/tmp/hsperfdata_hollis
hollis@hos:/tmp/hsperfdata_hollis$ ll
total 48
drwxr-xr-x 2 hollis hollis  4096  4月 16 10:54 ./
drwxrwxrwt 7 root   root   12288  4月 16 10:56 ../
-rw------- 1 hollis hollis 32768  4月 16 10:57 2679
hollis@hos:/tmp/hsperfdata_hollis$ 

上面的内容就是我机械中/tmp/hsperfdata_hollis目录下的内容,其中2679就是我机械上当前运行中的java的历程的pid,我们执行jps验证一下:


hollis@hos:/tmp/hsperfdata_hollis$ jps
2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
4445 Jps

执行了jps下令之后,我们发现有两个java历程,一个是pid为2679的eclipse运行的历程,另外一个是pid为4445的jps使用的历程(他也是java下令,也要开一个历程)

使用


想要学习一个下令,先来看看辅助,使用jps -help查看辅助:

hollis@hos:/tmp/hsperfdata_hollis$ jps -help
usage: jps [-help]
       jps [-q] [-mlvV] [<hostid>]

Definitions:
    <hostid>:      <hostname>[:<port>]

接下来,为了详细先容这些参数,我们编写几个类,在main方式里写一个while(true)的循环,查看java历程情形。代码如下:

package com.JavaCommand;
/**
 * @author hollis
 */
public class JpsDemo {
    public static void main(String[] args) {
        while(true){
            System.out.println(1);
        }
    }
}

-q 只显示pid,不显示class名称,jar文件名和通报给main 方式的参数

hollis@hos:/tmp/hsperfdata_hollis$ jps -q
2679
11421

-m 输出通报给main 方式的参数,在嵌入式jvm上可能是null, 在这里,在启动main方式的时刻,我给String[] args通报两个参数。`
hollis,chuang,执行jsp -m:


hollis@hos:/tmp/hsperfdata_hollis$ jps -m
12062 JpsDemo hollis,chuang

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

,

以太坊开奖

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

,
hollis@hos:/tmp/hsperfdata_hollis$ jps -l
12356 sun.tools.jps.Jps
2679 /home/hollis/tools/eclipse//plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
12329 com.JavaCommand.JpsDemo

-v 输出通报给JVM的参数 在这里,在启动main方式的时刻,我给jvm通报一个参数:-Dfile.encoding=UTF-8,执行jps -v:

hollis@hos:/tmp/hsperfdata_hollis$ jps -v
2679 org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar -Djava.library.path=/usr/lib/jni:/usr/lib/x86_64-linux-gnu/jni -Dosgi.requiredJavaVersion=1.6 -XX:MaxPermSize=256m -Xms40m -Xmx512m
13157 Jps -Denv.class.path=/home/hollis/tools/java/jdk1.7.0_71/lib:/home/hollis/tools/java/jdk1.7.0_71/jre/lib: -Dapplication.home=/home/hollis/tools/java/jdk1.7.0_71 -Xms8m
13083 JpsDemo -Dfile.encoding=UTF-8

PS:jps下令有个地方很欠好,似乎只能显示当前用户的java历程,要显示其他用户的照样只能用unix/linux的ps下令。

jps是我最常用的java下令。使用jps可以查看当前有哪些Java历程处于运行状态。若是我运行了一个web应用(使用tomcat、jboss、jetty等启动)的时刻,我就可以使用jps查看启动情形。有的时刻我想知道这个应用的日志会输出到哪里,或者启动的时刻使用了哪些javaagent,那么我可以使用jps -v 查看历程的jvm参数情形。

JPS失效处置


征象: 用ps -ef|grep java能看到启动的java历程,然则用jps查看却不存在该历程的id。待会儿注释过之后就能知道在该情形下,jconsole、jvisualvm可能无法监控该历程,其他java自带工具也可能无法使用

剖析: jps、jconsole、jvisualvm等工具的数据泉源就是这个文件(/tmp/hsperfdata_userName/pid)。以是当该文件不存在或是无法读取时就会泛起jps无法查看该历程号,jconsole无法监控等问题

缘故原由:

(1)、磁盘读写、目录权限问题 若该用户没有权限写/tmp目录或是磁盘已满,则无法建立/tmp/hsperfdata_userName/pid文件。或该文件已经天生,但用户没有读权限

(2)、暂且文件丢失,被删除或是定期清算 对于linux机械,一样平常都市存在准时义务对暂且文件夹举行清算,导致/tmp目录被清空。这也是我第一次碰着该征象的缘故原由。常用的可能准时删除暂且目录的工具为crontab、redhat的tmpwatch、ubuntu的tmpreaper等等

这个导致的征象可能会是这样,用jconsole监控历程,发现在某一时段后历程仍然存在,然则却没有监控信息了。

(3)、java历程信息文件存储地址被设置,不在/tmp目录下 上面我们在先容时说默认会在/tmp/hsperfdata_userName目录保留历程信息,但由于以上1、2所述缘故原由,可能导致该文件无法天生或是丢失,以是java启动时提供了参数(-Djava.io.tmpdir),可以对这个文件的位置举行设置,而jps、jconsole都只会从/tmp目录读取,而无法从设置后的目录读物信息,这是我第二次碰着该征象的缘故原由

附:


1.若何给main通报参数 在eclipse中,鼠标右键->Run As->Run COnfiguations->Arguments->在Program arguments中写下要传的参数值

1.若何给JVM通报参数 在eclipse中,鼠标右键->Run As->Run COnfiguations->Arguments->在VM arguments中写下要传的参数值(一样平常以-D开头)