首先有个基本问题需要了解一下:
这里所说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使用时间。
如果是远程的linux系统,可以使用java调用Telnet工具类执行远程脚本。代码参考如下:package test;
import javaioInputStream;
import javaioPrintStream;
import orgapachecommonsnettelnetTelnetClient;
public class Shell
{
private TelnetClient telnet = new TelnetClient();
private InputStream in;
private PrintStream out;
private char prompt = ';// 普通用户结束
public Shell(String ip, int port, String user, String password)
{
try
{
telnetconnect(ip, port);
in = telnetgetInputStream();
out = new PrintStream(telnetgetOutputStream());
// 根据root用户设置结束符
thisprompt = userequals("root") '#' : '>';
login(user, password);
}
catch (Exception e)
{
eprintStackTrace();
}
}
/
登录
@param user
@param password
/
public void login(String user, String password)
{
// readUntil("login:");
readUntil("login:");
write(user);
readUntil("Password:");
write(password);
readUntil(prompt + "");
}
/
读取分析结果
@param pattern
@return
/
public String readUntil(String pattern)
{
try
{
char lastChar = patterncharAt(patternlength() - 1);
StringBuffer sb = new StringBuffer();
char ch = (char)inread();
while (true)
{
sbappend(ch);
if (ch == lastChar)
{
if (sbtoString()endsWith(pattern))
{
return sbtoString();
}
}
ch = (char)inread();
Systemoutprint(ch);
}
}
catch (Exception e)
{
eprintStackTrace();
}
return null;
}
/
写 *** 作
@param value
/
public void write(String value)
{
try
{
outprintln(value);
outflush();
}
catch (Exception e)
{
eprintStackTrace();
}
}
/
向目标发送命令字符串
@param command
@return
/
public String sendCommand(String command)
{
try
{
write(command);
return readUntil(prompt + "");
}
catch (Exception e)
{
eprintStackTrace();
}
return null;
}
/
关闭连接
/
public void disconnect()
{
try
{
telnetdisconnect();
}
catch (Exception e)
{
eprintStackTrace();
}
}
public static void main(String[] args) {
TelnetClient telnet = new TelnetClient();
try {
Shell she =new Shell("IP地址", 23, "用户名", "密码");
Systemoutprintln(she);
Systemoutprintln(shesendCommand("ls"));
shedisconnect();
}catch (Exception e) {
// TODO: handle exception
}
}
}代码是参考的网上源码,使用时将Systemoutprintln(shesendCommand("ls"));中的ls命令换成查看CPU使用率的命令,例如top,vmstat,mpstat,prstat -J或者prstat -T 等命令。根据其结果做解析即可。
SUM服务器监控软件吧
可以监控所有品牌的服务器的CPU\内存、磁盘、流量、网络、数据库、中间件,还能监控网络设备
有啥情况可以短信和邮件通知,比较方便
你看看吧,我们用的就是这个,只是温度不能监控,其他都可以
以上就是关于java 如何获得一个进程的内存使用情况,cpu运行的时间全部的内容,包括:java 如何获得一个进程的内存使用情况,cpu运行的时间、JAVA代码如何测linux下的CPU使用率、如何在Java程序中获取、监控服务器负载值、CPU、内存、硬盘、网络情况等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)