文档章节

Java应用内PID的获取

cwalet
 cwalet
发布于 2013/04/09 16:35
字数 815
阅读 995
收藏 1
PID

译自:How a Java Application Can Discover its Process ID (PID)

对于某些要与外部进程(非Java)协作的应用,通常需要获取到它自己的进程ID。但是当前的Java API并不提供接口以便直接检索PID(可能需要等到如下问题解决之后425062242448964890847)。

但是聪明的我还是找到五种从Java程序中获取PID的方法:

1.使用Java监控和管理的API(java.lang.management):

ManagementFactory.getRuntimeMXBean().getName();

得到数据类似: 28906@localhost
28906就是JVM进程ID,实际上也是当前应用的PID.

这一招是JVM直接支持的,但是我只在SUN自家的JVM测试过可行.

Java API中关于RuntimeMXBean.getName()方法的描述如下(来自Javadoc):

返回表示正在运行的 Java 虚拟机的名称。返回的名称字符串可以为任何任意字符串,Java 虚拟机实现可以选择在返回的名称字符串中嵌入特定于平台的有用信息。每个正在的运行的虚拟机可以具有不同的名称。

所以即使这个方法是最简便的,也可能因该方法的具体实现改变而导致你的应用无法正常运行.

2.通过shell脚本而非Java属性的方式来启动你的应用如下:

exec java -Dpid=$$ -jar /Applications/bsh-2.0b4.jar

然后在Java里调用这个:

System.getProperty("pid");

3.本博客使用shell脚本的$!设备描述符 - 如果你只是想要创建一个包含pid的文件,那这个方法挺方便~?

4.使用Java本地调用(JNI)- 一个灰常繁琐笨重且受限于平台的解决方案.

5.使用系统变量$PPID和Runtime.exec(String[])方法,在这篇文章中有详细描述.

import java.io.IOException;

public class Pid {
	public static void main(String[] args) throws IOException {
	  byte[] bo = new byte[100];
	  String[] cmd = {"bash", "-c", "echo $PPID"};
	  Process p = Runtime.getRuntime().exec(cmd);
	  p.getInputStream().read(bo);
	  System.out.println(new String(bo));
	}
}

可以说,以上的每一个方法都不好,各有优劣。(下面来一段作者的吐槽~_~)

我知道Sun的最高优先级是Java的跨平台兼容性,但我还是赞成下述在RFE中关于给JDK添加getPid()方法的留言:

求求你Sun,已经4、5年了~给我们PID,真的蒸的很需要,还有……可以一劳永逸的减少开发者们在文档里翻来覆去找寻这个莫须有的方法所浪费的时间~

P.S.

1.注意了,评论中有人说,在Unix系统下每次读取一个文件到内存里都会创建一个新的进程,所以每次运行

Process p = Runtime.getRuntime ().exec(cmd);都会得到一个不同的PID,这是再正常不过的~

2.关于第5点提及的文章中有详细解释:为什么不直接传一个字符串给exec执行呢?原因是Runtime.exec(String) does not parse quotes correctly的bug报告,该方法不能正确解析引号.

以上两点未经本人测试,参考的其他链接如下:

ManagementFactory.getRuntimeMXBean().getName()

该方法返回的是“PID@HOST”,即当前运行JVM进程的ID和主机名。

© 著作权归作者所有

共有 人打赏支持
cwalet
粉丝 44
博文 111
码字总数 87663
作品 0
其他
java虚拟机内存监控工具jps,jinfo,Jstack,jstat,jmap,jhat使用

基于Sun HotSpot JVM 这里将介绍几款sun hotspot jvm 自带的监控工具: 请确保java_home/bin配置到path环境变量下,因为这些工具都在jdk的bin目录下 jps(JVM Process Status Tool):JVM机进程...

我类个擦
2014/09/12
0
1
JVM:查看java内存情况命令

jinfo:可以输出并修改运行时的java 进程的opts。 jps:与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号。 jstat:一个极强的监视VM内存工具。...

BazingaYou
2013/11/15
0
0
JVM性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解

是什么 jps 查看所有的jvm进程,包括进程ID,进程启动的路径等等。 我自己也用PS,即:ps -ef | grep java jstack 观察jvm中当前所有线程的运行情况和线程当前状态。 系统崩溃了?如果java程...

xionghuiCoder
2015/08/13
0
0
jvm优化必知系列——监控工具

这是jvm优化系列第二篇: jvm优化——垃圾回收 通过上一篇的jvm垃圾回收知识,我们了解了jvm对内存分配以及垃圾回收是怎么来处理的。理论是指导实践的工具,有了理论指导,定位问题的时候,知...

wier
2017/10/18
0
14
JDK的命令行工具系列 (二) javap、jinfo、jmap

javap: 反编译工具, 可用来查看java编译器生成的字节码 参数摘要: -help 帮助 -l 输出行和变量的表 -public 只输出public方法和域 -protected 只输出public和protected类和成员 -package 只输...

qingshanli
07/16
0
0

没有更多内容

加载失败,请刷新页面

加载更多

RedHat已更改其开源许可规则

对于编程圈外的人来说,软件许可证似乎并不重要,但是,在开源领域,开源许可是非常重要的。 因此,领先的Linux公司Red Hat宣布了一件大事,所有新的由Red Hat发起的使用GNU通用公共许可证(...

linux-tao
22分钟前
7
0
游戏化策划的反馈机制

简评:如何低成本地设计游戏化活动运营方案 当项目活动组采用游戏化机制来设计活动时,往往会犯一个错误 —— 以为物质奖励(金钱或实物)就是终极奖励。然后一次又一次的证据显示,有形奖励...

极光推送
24分钟前
1
0
PHP "延迟静态绑定" 功能,static

从这个名字的定义提取出两个关键点,第一点静态,也就是说这个功能只适用于静态属性或静态方法。 第二点延迟绑定,这个根据下面代码就可以很好的理解 class A{ static $name = "Tom";...

nsns
28分钟前
1
0
《看图轻松理解数据结构与算法系列》导引贴

最近学习数据结构,遇到一个很喜欢的博主,他的文章图文并茂,理解起来很容易。特此开贴记录,方便反复阅读。 博主主页 https://juejin.im/user/57c3970f79bc440063e58518/posts?sort=popul...

科陆李明
今天
1
0
20.27 分发系统介绍~ 20.30 expect脚本传递参数

分发系统介绍分发系统-expect讲解(也就是一个分发的脚本)场景:业务越来越大,网站app,后端,编程语言是php,所以就需要配置lamp或者lnmp,最好还需要吧代码上传到服务器上;但是因...

洗香香
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部