java获取进程名称

Python010

java获取进程名称,第1张

代码:

package com.test

import java.lang.management.ManagementFactory

import java.lang.management.RuntimeMXBean

public class Target {

public static void main(String[] args) throws InterruptedException {System.out.println(getProcessID())

while(true) {

Thread.sleep(10000)

}

}

public static final int getProcessID() {

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean()

System.out.println(runtimeMXBean.getName())

return Integer.valueOf(runtimeMXBean.getName().split("@")[0]) .intValue()

}

}

运行结果:2896@PC-20150603VRPL2896

当前进程ID为2896。

ManagementFactory是一个在运行时管理和监控Java VM的工厂类,它能提供很多管理VM的静态接口,比如RuntimeMXBean;

RuntimeMXBean是Java虚拟机的运行时管理接口.

将下面代码里面的processName 变成你这个进程的名字ClientDemo.exe就可以了

BufferedReader br=null

try{

Process proc=Runtime.getRuntime().exec("tasklist -fi " + '"' + "imagename eq " + processName +'"')

br=new BufferedReader(new InputStreamReader(proc.getInputStream()))

String line=null

while((line=br.readLine())!=null){

//判断指定的进程是否在运行

if(line.contains(processName)){

return true

}

}

return false

}catch(Exception e){

e.printStackTrace()

return false

}finally{

if(br!=null){

try{

br.close()

}catch(Exception ex){

}

}

}

首先有个基本问题需要了解一下:

这里所说java里获得一个进程的内存使用情况和cpu运行时间,是指在java内部获取一个纯外部进程的内存与cpu时间呢,还是指在java内部,由java启动的进程的内存与cpu时间。

如果是第一种情况,那你还需要在java内部再起一个进程,通过执行操作系统的shell命令来查看那个进程的运行状态。比如那个外部进程的ID为3119,则执行cat /proc/3119/status | grep VmRSS就可以过滤出该进程的物理内存占用量。

如果是第二种情况,(假定你问的就是这种情况)。

先说内存占用量:一般说来,你可以使用这两种方式获取内存使用情况

方式一:

MemoryMXBean memoryMXBean = ManagementFactory.getMemoryMXBean()

MemoryUsage memoryUsage = memoryMXBean.getHeapMemoryUsage()//椎内存使用情况

long totalMemorySize = memoryUsage.getInit()//初始的总内存

long maxMemorySize = memoryUsage.getMax()//最大可用内存

long usedMemorySize = memoryUsage.getUsed()//已使用的内存

方式二:

Runtime rt = Runtime.getRuntime()

long totalMemorySize = rt.totalMemory()//初始的总内存

long maxMemorySiz = t.maxMemory()//最大可用内存

long freeMemorySize = rt.freeMemory()//当前可用内存

需要说明的是,这种方式获取的是整个jvm的内存使用情况,并不是某一个进程的内存使用情况,事实上,在java内部,可以使用Rumtime.getRuntime().exec(${SHELL})来开启一个外部进程(这里${SHELL}代表一个可操作系统的shell命令)。而运行Java程序整个jvm,对于操作系统而言,也仅仅只是一个进程。也就是说,一个jvm就是一个进程,你通过java程序开启的进程都是外部进程,java内部目前还提供了一个destroy方法来销毁该进程,对于该进程的其它信息,都无法直接获取,这些信息的获取,显然需要本地化(Local)的实现。既然标准jdk库没有,就不可能再通过平台无关的代码来实现了。典型的做法就是使用前面第一种情况的方式,再启一个进程,执行shell命令来获取。

不过对于cpu使用时间,采用标准java代码倒是可以拿到。由于java的语法很啰嗦,举一个较完全的例子需要太多的代码,我这里就只写最关键的代码:

ThreadMXBean threadMXBean = ManagementFactory.getThreadMXBean()

① long currentCpuTime = threadMXBean.getCurrentThreadCpuTime()//当前线程的cpu使用时间

long someThreadId = 709817L//假定有某个线程的ID是709817

② long someThreadCpuTime = threadMXBean.getThreadCpuTime(someThreadId)//获取ID为someThreadId即709817的线程的cpu时间

基于上面的核心api,你可以把由java启动的外部进程放到一个单独的线程中执行,再用代码②的方式来获取该进程的cpu使用时间,也可以将外部进程放入到当前线程中执行,用① 的方式来获得进程的cpu使用时间。