java 如何获得一个进程的内存使用情况,cpu运行的时间 java如何通过进程号获取该进程占用的CPU使用率

\u7528java\u4ee3\u7801wmic\u8bed\u6cd5\u600e\u4e48\u6839\u636e\u4e00\u4e2a\u6307\u5b9a\u7684\u8fdb\u7a0b\u540d\u5f97\u5230\u5b83\u5360\u7528\u7684CPU\u3001\u5185\u5b58\u3001\u8fd0\u884c\u65f6\u95f4

\u8fd9\u4e2a\u60c5\u51b5\uff0c\u6211\u4e5f\u9047\u5230\u8fc7\uff01\u9996\u5148\u53ef\u4ee5\u7528\u8fdb\u7a0b\u7ba1\u7406\u770b\u770b\u5565\u4e1c\u4e1c\u5360\u7528\u4e86CPU\uff0c\u4f8b\u5982\u4f60\u7528360\u5b89\u5168\u536b\u58eb\u2014\u2014\u529f\u80fd\u5927\u5168\u2014\u2014\u7535\u8111\u4f18\u5316\u2014\u2014\u8fdb\u7a0b\u7ba1\u7406\u3002\u5176\u6b21\u53ef\u7528360\u6025\u6551\u7bb1\u4e4b\u7c7b\u7684\u67e5\u6740\u4e00\u4e0b\u987d\u56fa\u75c5\u6bd2\uff0c\u7136\u540e\u518d\u8bd5\u8bd5\uff0c\u5e0c\u671b\u5bf9\u4f60\u6709\u5e2e\u52a9\u3002

LINUX \u4e2d\uff0c\u53ef\u4ee5\u8fd9\u6837
\u83b7\u53d6\u5355\u4e2a\u8fdb\u7a0bCPU,\u5185\u5b58\u7684\u5360\u7528\u7387
c\u547d\u4ee4\uff1atop -b -n 1 -p $pid | sed '$d' | sed -n '$p'
\u4e0a\u9762\u7684$pid\uff0c\u5c31\u662f\u8fdb\u7a0b\u7684PID

首先有个基本问题需要了解一下:
这里所说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使用时间。

C#都可以,JAVA为什么不行?难道就因为操作系统是微软的?没道理的

好像java无法直接获取进程
所以不能查看进程的那些信息

扩展阅读:黑马java视频 ... java poi ... javaw exe ... java excel ... javascript入门 ... java 延时 ... java reactor ... java workbook ... java jar后台运行 ...

本站交流只代表网友个人观点,与本站立场无关
欢迎反馈与建议,请联系电邮
2024© 车视网