文档章节

Java应用内PID的获取

cwalet
 cwalet
发布于 2013/04/09 16:35
字数 815
阅读 967
收藏 1
点赞 0
评论 0
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
粉丝 43
博文 110
码字总数 86709
作品 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性能调优监控工具jps、jstack、jstat、jmap、jinfo使用详解

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

xionghuiCoder
2015/08/13
0
0
JVM:查看java内存情况命令

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

BazingaYou
2013/11/15
0
0
jvm优化必知系列——监控工具

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

wier
2017/10/18
0
14
JVM监控工具介绍jstack, jconsole, jinfo, jmap, jdb, js...

jstack -- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具...

老大做IT
2013/05/02
0
0
JVM调优工具的使用(jps,jstat,jstack,jmap,jhat)

JDK本身提供了很丰富的性能监控工具,除了集成式的visualVM和jConsole外,还有jstat,jstack,jps,jmap,jhat小工具,这些都是性能调优的常用工具 我们在Java的开发中,常常会遇到下面这些问题:...

super李导
06/23
0
0
JAVA虚拟机起步-虚拟机调优

JAVA虚拟机起步OutOfMemory问题解决记录。 问题: JAVA虚拟机报错 # java.lang.OutOfMemoryError: requested 32756 bytes for ChunkPool::allocate. Out of swap space? # # Internal Error......

飓风2000
2014/03/01
0
0
jdk自带分析vm工具(jdk 5.0以上版本)

一、概述 SUN 的JDK中的几个工具,非常好用。秉承着有免费,不用商用的原则。以下简单介绍一下这几种工具。(注:本文章下的所有工具都存在JDK5.0以上版本的工具集里,同javac一样,不须特意安...

王大叔爱编程
2014/07/09
0
0
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ...... 这些问题在日常开发中可能被...

优雅先生
2014/01/28
0
25
JVM性能调优监控工具jps、jstack、jmap、jhat、jstat、hprof使用详解

现实企业级Java开发中,有时候我们会碰到下面这些问题: OutOfMemoryError,内存不足 内存泄露 线程死锁 锁争用(Lock Contention) Java进程消耗CPU过高 ...... 这些问题在日常开发中可能被...

小天120
2014/02/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

MyBatis源码解读之延迟加载

1. 目的 本文主要解读MyBatis 延迟加载实现原理 2. 延迟加载如何使用 Setting 参数配置 设置参数 描述 有效值 默认值 lazyLoadingEnabled 延迟加载的全局开关。当开启时,所有关联对象都会延...

无忌
7分钟前
0
0
javascript 类变量的实现

代码如下: function echo(){ for(let i=0;i<arguments.length;i++) console.log(arguments[i]);}function extend(o, p){for (prop in p) {o[prop] = p[prop]}retur......

backbye
11分钟前
0
2
编程语言对比分析:Python与Java和JavaScript(图)

编程语言对比分析:Python与Java和JavaScript(图): 凭什么说“Python 太慢,Java 太笨拙,我讨厌 JavaScript”?[图] 编程语言生而为何? 我们人类从原始社会就是用语言表达自己,互相沟通...

原创小博客
20分钟前
0
0
Akka构建Reactive应用《one》

看到这Akka的官网,描述使用java或者scala构建响应式,并发和分布式应用更加简单,听着很高级的样子,下面的小字写着消息驱动,但是在quickstart里面又写容错事件驱动,就是这么钻牛角尖。 ...

woshixin
31分钟前
0
0
ffmpeg源码分析 (四)

io_open 承接上一篇,对于avformat_open_input的分析还差其中非常重要的一步,就是io_open,该函数用于打开FFmpeg的输入输出文件。 在init_input中有这么一句 if ((ret = s->io_open(s, &s-...

街角的小丑
33分钟前
0
0
String,StringBuffer ,StringBuilder的区别

不同点 一、基类不同 StringBuffer、StringBuilder 都继承自AbStractStringBuilder,String 直接继承自 Object 2、底层容器“不同” 虽然底层都是字符数组,但是String的是final修饰的不可变...

不开心的时候不要学习
48分钟前
0
0
nodejs 文件操作

写文件code // 加载文件模块var fs = require("fs");var content = 'Hello World, 你好世界!';//params 文件名,内容,编码,回调fs.writeFile('./hello.txt',content,'utf8',function (er......

yanhl
50分钟前
0
0
SpringBoot mybits 查询为0条数据 但是在Navicat 中可以查询到数据

1.页面请求: 数据库查询: 2018-07-16 17:56:25.054 DEBUG 17312 --- [nio-9010-exec-3] c.s.h.m.C.selectSelective : ==> Preparing: select id, card_number, customer_id, customer_nam......

kuchawyz
今天
0
0
译:Self-Modifying cod 和cacheflush

date: 2014-11-26 09:53 翻译自: http://community.arm.com/groups/processors/blog/2010/02/17/caches-and-self-modifying-code Cache处在CPU核心与内存存储器之间,它给我们的感觉是,它具......

我叫半桶水
今天
0
0
Artificial Intelligence Yourself

TensorFlow是谷歌基于DistBelief进行研发的第二代人工智能学习系统,其命名来源于本身的运行原理。Tensor(张量)意味着N维数组,Flow(流)意味着基于数据流图的计算,TensorFlow为张量从流...

孟飞阳
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部