怎样用Java获取内存中的数据?

 我来答
day忘不掉的痛
推荐于2017-09-20 · 知道合伙人数码行家
day忘不掉的痛
知道合伙人数码行家
采纳数:62646 获赞数:223927
本人担任公司网络部总经理多年,有充足的网络经验、互联网相关知识和资讯。

向TA提问 私信TA
展开全部
方法如下:
首先
创建一个Bean用来存贮要得到的信

public class MonitorInfoBean {
/** 可使用内存. */
private long totalMemory;

/** 剩余内存. */
private long freeMemory;

/** 最大可使用内存. */
private long maxMemory;

/** 操作系统. */
private String osName;

/** 总的物理内存. */
private long totalMemorySize;

/** 剩余的物理内存. */
private long freePhysicalMemorySize;

/** 已使用的物理内存. */
private long usedMemory;

/** 线程总数. */
private int totalThread;

/** cpu使用率. */
private double cpuRatio;

public long getFreeMemory() {
return freeMemory;
}

public void setFreeMemory(long freeMemory) {
this.freeMemory = freeMemory;
}

public long getFreePhysicalMemorySize() {
return freePhysicalMemorySize;
}

public void setFreePhysicalMemorySize(long freePhysicalMemorySize) {
this.freePhysicalMemorySize = freePhysicalMemorySize;
}

public long getMaxMemory() {
return maxMemory;
}

public void setMaxMemory(long maxMemory) {
this.maxMemory = maxMemory;
}

public String getOsName() {
return osName;
}

public void setOsName(String osName) {
this.osName = osName;
}

public long getTotalMemory() {
return totalMemory;
}

public void setTotalMemory(long totalMemory) {
this.totalMemory = totalMemory;
}

public long getTotalMemorySize() {
return totalMemorySize;
}

public void setTotalMemorySize(long totalMemorySize) {
this.totalMemorySize = totalMemorySize;
}

public int getTotalThread() {
return totalThread;
}

public void setTotalThread(int totalThread) {
this.totalThread = totalThread;
}

public long getUsedMemory() {
return usedMemory;
}

public void setUsedMemory(long usedMemory) {
this.usedMemory = usedMemory;
}

public double getCpuRatio() {
return cpuRatio;
}

public void setCpuRatio(double cpuRatio) {
this.cpuRatio = cpuRatio;
}
}

之后,建立bean的接口

public interface IMonitorService {
public MonitorInfoBean getMonitorInfoBean() throws Exception;

}

然后,就是最关键的,得到cpu的利用率,已用内存,可用内存,最大内存等信息。

import java.io.InputStreamReader;
import java.io.LineNumberReader;

import sun.management.ManagementFactory;

import com.sun.management.OperatingSystemMXBean;
import java.io.*;
import java.util.StringTokenizer;

/**

* 获取系统信息的业务逻辑实现类.
* @author GuoHuang
*/
public class MonitorServiceImpl implements IMonitorService {

private static final int CPUTIME = 30;

private static final int PERCENT = 100;

private static final int FAULTLENGTH = 10;

private static final File versionFile = new File("/proc/version");
private static String linuxVersion = null;

/**
* 获得当前的监控对象.
* @return 返回构造好的监控对象
* @throws Exception
* @author GuoHuang
*/
public MonitorInfoBean getMonitorInfoBean() throws Exception {
int kb = 1024;

// 可使用内存
long totalMemory = Runtime.getRuntime().totalMemory() / kb;
// 剩余内存
long freeMemory = Runtime.getRuntime().freeMemory() / kb;
// 最大可使用内存
long maxMemory = Runtime.getRuntime().maxMemory() / kb;

OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory
.getOperatingSystemMXBean();

// 操作系统
String osName = System.getProperty("os.name");
// 总的物理内存
long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb;
// 剩余的物理内存
long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb;
// 已使用的物理内存
long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb
.getFreePhysicalMemorySize())
/ kb;

// 获得线程总数
ThreadGroup parentThread;
for (parentThread = Thread.currentThread().getThreadGroup(); parentThread
.getParent() != null; parentThread = parentThread.getParent())
;
int totalThread = parentThread.activeCount();

double cpuRatio = 0;
if (osName.toLowerCase().startsWith("windows")) {
cpuRatio = this.getCpuRatioForWindows();
}
else {
cpuRatio = this.getCpuRateForLinux();
}

// 构造返回对象
MonitorInfoBean infoBean = new MonitorInfoBean();
infoBean.setFreeMemory(freeMemory);
infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);
infoBean.setMaxMemory(maxMemory);
infoBean.setOsName(osName);
infoBean.setTotalMemory(totalMemory);
infoBean.setTotalMemorySize(totalMemorySize);
infoBean.setTotalThread(totalThread);
infoBean.setUsedMemory(usedMemory);
infoBean.setCpuRatio(cpuRatio);
return infoBean;
}
private static double getCpuRateForLinux(){
InputStream is = null;
InputStreamReader isr = null;
BufferedReader brStat = null;
StringTokenizer tokenStat = null;
try{
System.out.println("Get usage rate of CUP , linux version: "+linuxVersion);

Process process = Runtime.getRuntime().exec("top -b -n 1");
is = process.getInputStream();
isr = new InputStreamReader(is);
brStat = new BufferedReader(isr);

if(linuxVersion.equals("2.4")){
brStat.readLine();
brStat.readLine();
brStat.readLine();
brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine());
tokenStat.nextToken();
tokenStat.nextToken();
String user = tokenStat.nextToken();
tokenStat.nextToken();
String system = tokenStat.nextToken();
tokenStat.nextToken();
String nice = tokenStat.nextToken();

System.out.println(user+" , "+system+" , "+nice);

user = user.substring(0,user.indexOf("%"));
system = system.substring(0,system.indexOf("%"));
nice = nice.substring(0,nice.indexOf("%"));

float userUsage = new Float(user).floatValue();
float systemUsage = new Float(system).floatValue();
float niceUsage = new Float(nice).floatValue();

return (userUsage+systemUsage+niceUsage)/100;
}else{
brStat.readLine();
brStat.readLine();

tokenStat = new StringTokenizer(brStat.readLine());
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
tokenStat.nextToken();
String cpuUsage = tokenStat.nextToken();

System.out.println("CPU idle : "+cpuUsage);
Float usage = new Float(cpuUsage.substring(0,cpuUsage.indexOf("%")));

return (1-usage.floatValue()/100);
}

} catch(IOException ioe){
System.out.println(ioe.getMessage());
freeResource(is, isr, brStat);
return 1;
} finally{
freeResource(is, isr, brStat);
}

}
sunnysin
2012-03-27
知道答主
回答量:1
采纳率:0%
帮助的人:1624
展开全部
可以考虑使用内存映射文件:java.nio.MappedByteBuffer,主要适合放入较大的数据进入系统内存
可以考虑使用:java.nio.ByteBuffer.allocateDirect()方法进行分配,可以将一些不适合放入堆里的数据放入系统内存
还可以采用java本地调用的方式,实现对系统自身内存的掌控与调度,这种方式可以让你灵活的访问系统的内存。
java的堆放入的对象尺度是有限制的,这里建议参考BigMemory 的实现机制以及内存管理机制
如果自己管理内存的话,建议参考其他语言对内存管理的方式。
你可以把数据放入线性数据结构中(这些数据是在系统内存中,而非jvm管理的内存里),这样就不存在分代问题,可以由你的应用在适当的时候清理系统的内存。这样,你的内存模型-释放机制就与jvm的内存管理机制处于一个互不干扰的异行线上。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-16
展开全部
Java操作内存已经被JVM封装了。如果想要操作内容,就用JNI。然后用C去实现,调用系统的API来操作内存。也就是说Java不直接提供调用WindowAPI。也就没办法操作内存了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2013-08-16
展开全部
java不能直接操作内存的,但又无处不操作内存,但那是虚拟机在为你服务而已
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
江湖人称王嘉嘉
2015-07-30 · TA获得超过1400个赞
知道小有建树答主
回答量:1047
采纳率:83%
帮助的人:606万
展开全部
Java程序由于安全沙箱限制不能直接读取内存地址中的数据。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式