jps命令显示jvm进程

jps命令显示jvm进程用来查看基于HotSpot JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。与unix上的ps类似,用来显示本地有权限的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。使用jps时,不需要传递进程号做为参数。Jps也可以显示远程系统上的JAVA进程,这需要远程服务上开启了jstat服务,以及RMI注及服务,不过常用都是对本对的JAVA进程的查看。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

用来查看基于HotSpot JVM里面所有进程的具体状态包括进程ID,进程启动的路径等等。与unix上的ps类似,用来显示本地有权限的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。使用jps时,不需要传递进程号做为参数。

Jps也可以显示远程系统上的JAVA进程,这需要远程服务上开启了jstat服务,以及RMI注及服务,不过常用都是对本对的JAVA进程的查看。

命令格式

jps [ options ] [ hostid ]

常用参数说明

-m 输出传递给main方法的参数,如果是内嵌的JVM则输出为null

-l 输出应用程序主类的完整包名,或者是应用程序JAR文件的完整路径。

-v 输出传给JVM的参数。

使用示例

复制代码
blue@blue-pc:~$ jps
8710 Jps
5661 Bootstrap
2491 
2967 
blue@blue-pc:~$ jps -ml
5661 org.apache.catalina.startup.Bootstrap start
2491 
8724 sun.tools.jps.Jps -ml
2967 
blue@blue-pc:~$ jps -mlv
5661 org.apache.catalina.startup.Bootstrap start -Djava.util.logging.config.file=/home/blue/apache-tomcat-7.0.39/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/home/blue/apache-tomcat-7.0.39/endorsed -Dcatalina.base=/home/blue/apache-tomcat-7.0.39 -Dcatalina.home=/home/blue/apache-tomcat-7.0.39 -Djava.io.tmpdir=/home/blue/apache-tomcat-7.0.39/temp
2491  -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx384m
8738 sun.tools.jps.Jps -mlv -Dapplication.home=/usr/local/jdk1.6.0_35 -Xms8m
2967  -Dosgi.requiredJavaVersion=1.5 -XX:MaxPermSize=256m -Xms40m -Xmx512m
复制代码

前面的数字是jvm的进程id,后面是jvm的类启动信息。

 

jstack

如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stacknative stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stacknative stack的信息如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

 

命令格式

$jstack [ option ] pid

$jstack [ option ] executable core

$jstack [ option ] [server-id@]remote-hostname-or-IP

 

常用参数说明

OPTIONS

-F jstack [-l] pid无法响应时,强制打印堆栈

-l l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m 混合模式输出(包括java和本地c/c++片段)堆栈。

pid: java应用程序的进程号,一般可以通过jps来获得;

executable:产生core dump的java可执行程序;

core:打印出的core文件;

remote-hostname-or-ip:远程debug服务器的名称或IP;

server-id: 唯一id,假如一台主机上多个远程debug服务;

 

使用示例

复制代码
blue@blue-pc:~$ jps -ml
5661 org.apache.catalina.startup.Bootstrap 
blue@blue-pc:~$ jstack 5661
2013-04-16 21:09:27
Full thread dump Java HotSpot(TM) Server VM (20.10-b01 mixed mode):

"Attach Listener" daemon prio=10 tid=0x70e95400 nid=0x2265 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"http-bio-8080-exec-20" daemon prio=10 tid=0x08a35800 nid=0x1d42 waiting on condition [0x70997000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x766a27b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:156)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1987)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:399)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:104)
    at org.apache.tomcat.util.threads.TaskQueue.take(TaskQueue.java:32)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)
    at java.lang.Thread.run(Thread.java:662)
........
复制代码

一般情况下,通过jstack输出的线程信息主要包括:jvm自身线程、用户线程等。其中jvm线程会在jvm启动时就会存在。对于用户线程则是在用户访问时才会生成。


1、jps的作用

jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程号和简短的进程command。

 

2、某个java进程已经启动,用jps却显示不了该进程进程号

这个问题已经碰到过两次了,所以在这里总结下。

现象:

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

 

分析:

java程序启动后,默认(请注意是默认)会在/tmp/hsperfdata_userName目录下以该进程的id为文件名新建文件,并在该文件中存储jvm运行的相关信息,其中的userName为当前的用户名,/tmp/hsperfdata_userName目录会存放该用户所有已经启动的java进程信息。对于windows机器/tmp用Windows存放临时文件目录代替。

 

而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目录读取,而无法从设置后的目录读物信息,这是我第二次碰到该现象的原因

 

关于设置该文件位置的参数为-Djava.io.tmpdir

 

其他:

/tmp/hsperfdata_userName/pid文件会在对应java进程退出后被清除。如果java进程非正常退出(如kill -9),那么pid文件会被保留,直到执行一次java命令或是加载了jvm程序的命令(如jps、javac、jstat),会将所有无用的pid文件都清除掉

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/191483.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 页面浏览量和点击量_访客跟浏览量为什么不一样

    页面浏览量和点击量_访客跟浏览量为什么不一样1.什么是展现量、点击量、点击率在各种广告推广后台可以看到消费、平均价格、点击、展现、点击率、千次展现费用等数据,这些数据是你全面评估推广效果、深入开展推广优化的基础。在网民搜索查询时,如果您账

    2022年8月6日
    25
  • java二维数组三种初始化方法(实例)[通俗易懂]

    java二维数组三种初始化方法(实例)[通俗易懂]初始化方法:1、使用大括号直接赋值,适合已经确定知道数组元素的情况2、给定二维数组的大小3、数组第二维的长度可变化,未改变代码举例如下:publicclassNewArray{publicstaticvoidmain(String[]args){//第一种://int[][]arr1=newint[][]…

    2022年5月24日
    42
  • java中dao层和service层的区别,为什么要用service?[通俗易懂]

    读了下面的文章让我豁然开朗我能不能理解ssh中service就相当于与jsp+servlet+dao中的servlet???转文:首先解释面上意思,service是业务层,dao是数据访问层。呵呵,这个问题我曾经也有过,记得以前刚学编程的时候,都是在service里直接调用dao,service里面就new一个dao类对象,调用,其他有意义的事没做,也不明白有这个有什么用,参加工作久了以

    2022年4月7日
    139
  • BigDecimal 保留小数位/保留两位小数「建议收藏」

    BigDecimal 保留小数位/保留两位小数「建议收藏」BigDecimaldecimal=newBigDecimal(“1.98764432”);System.out.println(decimal);BigDecimalsetScale=decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN);System.out.println(setScale);BigDecimalsetScale1=decimal.setScale(4,BigDecimal.ROUND_HALF_UP.

    2022年9月15日
    2
  • 嵌入式学习路线图「建议收藏」

    嵌入式学习路线图「建议收藏」可能是年前跳槽的比较多,遇到不少同学咨询到嵌入式行业发展和职业规划的问题,这里总结一下嵌入式行业的机遇和选择,希望对读者们有所帮助。我们暂且宏观上把程序员分为3类:业务类,专业类,系统类。 业务类 业务类更多的是在应用程序。随着移动互联网的快速发展出现一批UI设计师,这里的设计师是指APP的界面设计,在注重用户体验的今天对于界面的设计出现水涨船高的需求。一时间Android…

    2022年6月6日
    33
  • mysql前缀索引的索引选择性

    mysql前缀索引的索引选择性mysql前缀索引的索引选择性一.基础概念在mysql中建立前缀索引的意义在于相对于整列建立索引,前缀索引仅仅是选择该列的部分字符作为索引,减少索引的字符可以节约索引空间,从而提高索引效率,但这样也会降低索引的选择性关于索引的选择性,它是指不重复的索引值(也称为基数cardinality)和数据表的记录总数的比值,范围从1/(数据表记录总数)到1之间。索引的选择性越高则查询效率越高,因为选

    2022年5月23日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号