java 如何获得一个进程的内存使用情况,cpu运行的时间

java 如何获得一个进程的内存使用情况,cpu运行的时间,第1张

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

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

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

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

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

方式一:

MemoryMXBean memoryMXBean = ManagementFactorygetMemoryMXBean();

MemoryUsage memoryUsage = memoryMXBeangetHeapMemoryUsage(); //椎内存使用情况

long totalMemorySize = memoryUsagegetInit(); //初始的总内存

long maxMemorySize = memoryUsagegetMax(); //最大可用内存

long usedMemorySize = memoryUsagegetUsed(); //已使用的内存

方式二:

Runtime rt = RuntimegetRuntime();

long totalMemorySize = rttotalMemory(); //初始的总内存

long maxMemorySiz = tmaxMemory(); //最大可用内存

long freeMemorySize = rtfreeMemory(); //当前可用内存

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

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

ThreadMXBean threadMXBean = ManagementFactorygetThreadMXBean();

① long currentCpuTime = threadMXBeangetCurrentThreadCpuTime(); //当前线程的cpu使用时间

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

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

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

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

BufferedReader br=null;

try{

Process proc=RuntimegetRuntime()exec("tasklist -fi " + '"' + "imagename eq " + processName +'"');

br=new BufferedReader(new InputStreamReader(procgetInputStream()));

String line=null;

while((line=brreadLine())!=null){

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

if(linecontains(processName)){

return true;

}

}

return false;

}catch(Exception e){

eprintStackTrace();

return false;

}finally{

if(br!=null){

try{

brclose();

}catch(Exception ex){

}

}

}

jstack 分析出线程id 如何找到进程

jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息。

如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:jstack [-l] pid

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

另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。

需要注意的问题:

l 不同的 JAVA虚机的线程 DUMP的创建方法和文件格式是不一样的,不同的 JVM版本, dump信息也有差别。

l 在实际运行中,往往一次 dump的信息,还不足以确认问题。建议产生三次 dump信息,如果每次 dump都指向同一个问题,我们才确定问题的典型性。

2、命令格式

$jstack [ option ] pid

$jstack [ option ] executable core

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

参数说明:

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

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

core:打印出的core文件;

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

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

示例:

$jstack –l 23561

线程分析:

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

ps -ef |grep crond|grep -v grep |awk ‘{print $2}‘  查出进程号lsof -p 进程号我在传智播客学运维的时候,这些都是基础班的知识点。传智播客的社区有相关基础班的配套视频以及学习线路图。你可以了解一下去学的。

如果你已经持有这N线程的对象Thread[] threadList,你可以直接调用threadList[i]getState();

或者你创建它们的时候指定一个ThreadGroup,这样调用ThreadGroupactiveCount就可以知道还在运行的个数了

t当然就是maps中的key值啦

Map <Thread, StackTraceElement[] > maps = ThreadgetAllStackTraces();

ThreadMXBean threadMXBean = ManagementFactorygetThreadMXBean();

for(MapEntry<Thread, StackTraceElement[]> entry : mapsentrySet()) {

Thread t = entrygetKey();

ThreadInfo info = threadMXBeangetThreadInfo(tgetId());

}

以上就是关于java 如何获得一个进程的内存使用情况,cpu运行的时间全部的内容,包括:java 如何获得一个进程的内存使用情况,cpu运行的时间、java获取进程的运行状态。主要是获取该进程有没有终止、jstack 分析出线程id 如何找到进程吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9491941.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存