获取中...

-

Just a minute...

jps命令的作用

jps命令是JDK中自带的命令,位于bin目录下,其作用是显示当前用户下系统中所有的Java进程的相关信息,比如pid。有了这个命令,可以很方便的显示Java进程,不过显示的是当前用户的所有Java进程,不能根据项目名称查找,如果需要查找某个特定的Java程序,可以使用ps -ef | grep JavaName。

jps的实现原理

jsp的实现原理很简单,主要是程序在启动的时候,会在java.io.tmpdir指定的临时目录下,生成一个类似hsperfdata_User的文件夹,里面的文件名称就是以程序的pid命名的,所以显示进程,只需要把文件名列出即可,其他的参数,可以根据文件内容解析获得。

每中系统的java.io.tmpdir可能不一样,可以通过如下代码找到指定的临时文件目录:

1
System.getProperty("java.io.tmpdir")

在获取到这个目录之后,打开该目录,在下面寻找hsperfdata_User文件夹,进入即可看到所有的程序进程文件,比如:

1
2
3
4
drwxr-xr-x   4 user  staff    136  1 29 20:22 ./
drwx------@ 52 user staff 1768 1 29 20:21 ../
-rw------- 1 user staff 32768 1 29 20:06 447
-rw------- 1 user staff 32768 1 29 20:22 544

可以看到,这下面有两个文件,名称分别是447、544,我们可以使用jsp命令验证是否是上面说的实现:

1
2
3
4
user-4:~ user$ jps
544 Launcher
585 Jps
447

可以看到这里有三个java进程,注意一下,多的那一个是jps自己的进程,其他的两个是系统中启动的。

jps命令使用

为了方面演示,首先写一个程序,并一直运行,代码如下:

1
2
3
4
5
6
7
8
9
10
public class JpsDemo {

public static void main(String[] agrs) {
try {
TimeUnit.SECONDS.sleep(60 * 60);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

先看一下直接使用jps显示的内容,这里只展示演示的进程(后面也只展示相关的进程):

1
2
user-4:~ user$ jps 
625 JpsDemo

首先,如果不知道jps有什么命令,以及格式,可以通过jps -help查看:

1
2
3
4
5
6
user-4:~ user$ jps -help
usage: jps [-help]
jps [-q] [-mlvV] [<hostid>]

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

  • -q:显示pid,不显示class名称以及传递给main方法的参数:

    1
    2
    user-4:~ user$ jps -q
    625
  • -m:显示传递给main方法的参数:

    1
    2
    user-4:~ user$ jps -m
    625 JpsDemo test test1
  • -l:显示启动类完整的包名或者应用程序jar包完整的路径名:

    1
    2
    user-4:~ user$ jps -l
    625 com.xiaohu.test.JpsDemo
  • -V:显示传递给JVM的参数:

    1
    2
    user-4:~ user$ jps -l
    644 JpsDemo -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:50171,suspend=y,server=n -Dfile.encoding=UTF-8

总结

Java自带的jps命令方便查看该用户下所有的Java进程,特别是有的Java进程,我们不知道名称,比如idea,eclipse等等,-v和-m等参数可以让我们快速的知道启动时传递给虚拟机以及程序的参数。但是,jps不能根据某个应用名称查看,而是把所有的都显示出来,对于运行大量的Java程序的系统,这个命令就不那么让人感觉到爽了。

相关文章
评论
分享
  • Redis过期策略和内存淘汰策略

    Redis处理过期的keyRedis会将每个设置了过期时间的key保存在一个独立的字典中,以后会定期扫描这个字典来删除过期了的key。除了定期扫描删除策略之外,Redis同时采用惰性删除策略,在客户端访问key的时候,Redis会对这...

    Redis过期策略和内存淘汰策略
  • Redis持久化:AOF

    什么是AOF持久化Redis有两种持久化方式,RDB和AOF。RDB是将Redis中的数据保存一份到RDB文件中,而AOF不是保存键值对数据,而是保存服务器执行的写命令来记录数据库的状态。 AOF持久化的实现原理AOF持久化的实现可...

    Redis持久化:AOF
  • Redis持久化:RDB

    什么是RDB持久化RDB持久化是Redis的持久化方式之一,也被称为快照持久化,是将某一个时间节点的Redis内存中数据保存到磁盘上,生成一个RDB文件。之后,用户可以将这份文件进行备份,复制到其他的服务器上创建具有相同状态的Redi...

    Redis持久化:RDB
  • Java多线程之同步容器

    同步容器的作用Java中的容器主要为List、set、Map、Queue,这些容器都有不同的实现类,比如ArrayLIst、HashSet、HashMap、PriorityQueue等等,但是大部分都是非线程安全的,意味着在多线程访问...

    Java多线程之同步容器
  • Java多线程之ThreadLocal

    ThreadLocal的作用ThreadLocal的作用是提供线程内的局部变量,这个变量在同一个线程的生命周期内起作用,可以减少同一个线程内多个方法之前传入公共资源的复杂性,并且隔离其他线程。下面是一个使用ThreadLocal的例子...

    Java多线程之ThreadLocal
  • Java多线程之Lock

    引入Lock的原因Java提供了一个关键字synchronized用来保证同步访问,那为什么还需要使用Lock?最根本的原因就是使用synchronized会造成线程的阻塞,资源同时只能被一个线程访问,程序效率低。比如,多个线程查询读...

    Java多线程之Lock
  • Java多线程之synchronized

    多线程引发的安全问题由于线程是共享进程中的所有资源的,那么每个线程都可以去操作进程中的某一个资源,当多个线程操作同一个资源的时候就可能出现线程安全问题。比如两个线程对同一个实例变量做加1的操作,然后打印该变量,如果变量的初始值为0,当...

    Java多线程之synchronized
  • Java中的线程的创建

    Java创建线程的三种方式 继承Thread 实现Runnable 实现Callable 继承Thread创建线程通过继承Thread的方式,可以很快的创建一个线程,Thread中有一个run()方法,只需要重写该方法,将需要另外开...

    Java中的线程的创建
  • 线程和进程

    什么是进程在百度百科中,进程有两种定义,一种是狭义定义:进程是正在运行的程序实例,比如微信、Tomcat、MySQL,这些就是一个个进程。另一种就是广义的定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动,它是操作...

    线程和进程
Please check the parameter of comment in config.yml of hexo-theme-Annie!