怎样获得system memory大小?

zhoulinjulian 2005-01-13 05:38:59
请问怎样获得free的和total的system memory大小?谢谢!
...全文
192 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoulinjulian 2005-01-17
  • 打赏
  • 举报
回复
谢谢各位!
廖雪峰 2005-01-14
  • 打赏
  • 举报
回复
使用JNI调用C代码,GetSystemInfo
shengui1083 2005-01-14
  • 打赏
  • 举报
回复
调用windows api,搜索
batfree 2005-01-14
  • 打赏
  • 举报
回复
虚拟机内在与Windows内存有差别吗?
iforem 2005-01-14
  • 打赏
  • 举报
回复
使用JNI吧

用google搜索一下,或许能找到别人写好的库

zhoulinjulian 2005-01-14
  • 打赏
  • 举报
回复
晕倒了,Windows API我不熟啊,谁能说得更具体一些啊?谢谢啦!
wjsfr 2005-01-14
  • 打赏
  • 举报
回复
我也觉得只能调用windows api
wadsunglow 2005-01-14
  • 打赏
  • 举报
回复
long total=Runtime.getRuntime().totalMemory();
long free=Runtime.getRuntime().freeMemory();
treeroot 2005-01-14
  • 打赏
  • 举报
回复
应该没办法吧,调用Windows API
zhoulinjulian 2005-01-14
  • 打赏
  • 举报
回复
用什么方法获得系统内存的信息?包括空闲的和总共的系统内存大小。谢谢!
zhoulinjulian 2005-01-13
  • 打赏
  • 举报
回复
不对吧,Runtime.freeMemory()和Runtime.totalMemory()返回的都是Java 虚拟机的内存数值吧,

我要的是系统内存啊,即windows的。
treeroot 2005-01-13
  • 打赏
  • 举报
回复
redex 2005-01-13
  • 打赏
  • 举报
回复
up.
fog628 2005-01-13
  • 打赏
  • 举报
回复
Runtime.freeMemory() 返回系统的空闲内存数。

totalMemory() 返回 Java 虚拟机的内存总数
开源工具包 SIGAR System Information Gatherer And Reporter 即 系统信息收集和报告 官方站点: http: support hyperic com display SIGAR Home;jsessionid A9705887A07D20BBAC9A96500BC60822 SIGAR 官方站点 写道 The Sigar API provides a portable interface for gathering system information such as: System memory swap cpu load average uptime logins Per process memory cpu credential info state arguments environment open files File system detection and metrics Network interface detection configuration info and metrics TCP and UDP connection tables Network route table This information is available in most operating systems but each OS has their own way s providing it SIGAR provides developers with one API to access this information regardless of the underlying platform The core API is implemented in pure C with bindings currently implemented for Java Perl Ruby Python Erlang PHP and C# 几乎所有的硬件信息 网络情况都可以得到 1 CPU信息 包括基本信息(vendor model mhz cacheSize)和统计信息(user sys idle nice wait) 2 文件系统信息 包括Filesystem Size Used Avail Use% Type 3 事件信息 类似Service Control Manager 4 内存信息 物理内存和交换内存的总数 使用数 剩余数;RAM的大小 5 网络信息 包括网络接口信息和网络路由信息 6 进程信息 包括每个进程的内存 CPU占用数 状态 参数 句柄 7 IO信息 包括IO的状态 读写大小等 8 服务状态信息 9 系统信息 包括操作系统版本 系统资源限制情况 系统运行时间以及负载 JAVA的版本信息等 ">开源工具包 SIGAR System Information Gatherer And Reporter 即 系统信息收集和报告 官方站点: http: support hyperic com display SIGAR Home;jsessionid A9705887A07D20BBAC9A96500BC60822 SIGAR 官方站点 写道 The Sigar API provides a portable interface for gathering system i [更多]
public class MonitorInfoBean { private long javacount; /** 可使用内存. */ 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; /** java使用内存 */ private double javaUseMemory; public String getOsName() { return osName; } public void setOsName(String osName) { this.osName = osName; } public int getTotalThread() { return totalThread; } public void setTotalThread(int totalThread) { this.totalThread = totalThread; } public double getCpuRatio() { return cpuRatio; } public void setCpuRatio(double cpuRatio) { this.cpuRatio = cpuRatio; } public long getTotalMemory() { return totalMemory; } public void setTotalMemory(long totalMemory) { this.totalMemory = totalMemory; } public long getFreeMemory() { return freeMemory; } public void setFreeMemory(long freeMemory) { this.freeMemory = freeMemory; } public long getMaxMemory() { return maxMemory; } public void setMaxMemory(long maxMemory) { this.maxMemory = maxMemory; } public long getTotalMemorySize() { return totalMemorySize; } public void setTotalMemorySize(long totalMemorySize) { this.totalMemorySize = totalMemorySize; } public long getFreePhysicalMemorySize() { return freePhysicalMemorySize; } public void setFreePhysicalMemorySize(long freePhysicalMemorySize) { this.freePhysicalMemorySize = freePhysicalMemorySize; } public long getUsedMemory() { return usedMemory; } public void setUsedMemory(long usedMemory) { this.usedMemory = usedMemory; } public void setJavacount(long javacount) { this.javacount = javacount; } public long getJavacount() { return javacount; } public void setJavaUseMemory(double javaUseMemory) { this.javaUseMemory = javaUseMemory; } public double getJavaUseMemory() { return javaUseMemory; } } import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.util.StringTokenizer; import sun.management.ManagementFactory; import com.sun.management.OperatingSystemMXBean; public class Cpu { 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; public double getCpuRatio() throws Exception { // 操作系统 String osName = System.getProperty("os.name"); double cpuRatio = 0; if (osName.toLowerCase().startsWith("windows")) { //返回构造好的监控对象 return cpuRatio = this.getCpuRatioForWindows(); } else { return cpuRatio = this.getCpuRateForLinux(); } } /** * 获得当前的监控对象. * * @return 返回构造好的监控对象 */ public MonitorInfoBean getMonitorInfoBean() throws Exception { int kb = 1024; // 虚拟机总内存大小 long totalMemory = Runtime.getRuntime().totalMemory() / kb; // 剩余内存 long freeMemory = Runtime.getRuntime().freeMemory() / kb; //java使用的内存 long javaUseMemory = totalMemory - freeMemory; // 最大可使用内存 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); infoBean.setJavaUseMemory(javaUseMemory); 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); } } private static void freeResource(InputStream is, InputStreamReader isr, BufferedReader br) { try { if (is != null) is.close(); if (isr != null) isr.close(); if (br != null) br.close(); } catch (IOException ioe) { System.out.println(ioe.getMessage()); } } /** * 获得CPU使用率. * * @return 返回cpu使用率 */ double getCpuRatioForWindows() { try { String procCmd = System.getenv("windir") + "\\system32\\wbem\\wmic.exe process get Caption,CommandLine," + "KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount"; // 取进程信息 long[] c0 = readCpu(Runtime.getRuntime().exec(procCmd)); Thread.sleep(CPUTIME); long[] c1 = readCpu(Runtime.getRuntime().exec(procCmd)); if (c0 != null && c1 != null) { long idletime = c1[0] - c0[0]; long busytime = c1[1] - c0[1]; return Double.valueOf( PERCENT * (busytime) / (busytime + idletime)) .doubleValue(); } else { return 0.0; } } catch (Exception ex) { ex.printStackTrace(); return 0.0; } } /** * * 读取CPU信息. * * @param proc */ private long[] readCpu(final Process proc) { long[] retn = new long[3]; try { proc.getOutputStream().close(); InputStreamReader ir = new InputStreamReader(proc.getInputStream()); LineNumberReader input = new LineNumberReader(ir); String line = input.readLine(); if (line == null || line.length() < FAULTLENGTH) { return null; } int capidx = line.indexOf("Caption"); int cmdidx = line.indexOf("CommandLine"); int rocidx = line.indexOf("ReadOperationCount"); int umtidx = line.indexOf("UserModeTime"); int kmtidx = line.indexOf("KernelModeTime"); int wocidx = line.indexOf("WriteOperationCount"); long idletime = 0; long kneltime = 0; long usertime = 0; while ((line = input.readLine()) != null) { if (line.length() < wocidx) { continue; } // 字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount, // ThreadCount,UserModeTime,WriteOperation String caption = Bytes.substring(line, capidx, cmdidx - 1) .trim(); String cmd = Bytes.substring(line, cmdidx, kmtidx - 1).trim(); if (cmd.indexOf("wmic.exe") >= 0) { continue; } // log.info("line="+line); if (!caption.equals("javaw.exe")) { idletime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); idletime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); continue; } kneltime += Long.valueOf( Bytes.substring(line, kmtidx, rocidx - 1).trim()) .longValue(); usertime += Long.valueOf( Bytes.substring(line, umtidx, wocidx - 1).trim()) .longValue(); } retn[0] = idletime; retn[1] = kneltime + usertime; return retn; } catch (Exception ex) { ex.printStackTrace(); } finally { try { proc.getInputStream().close(); } catch (Exception e) { e.printStackTrace(); } } return null; } } class Bytes { public static String substring(String src, int start_idx, int end_idx) { byte[] b = src.getBytes(); String tgt = ""; for (int i = start_idx; i <= end_idx; i++) { tgt += (char) b[i]; } return tgt; } } public class Tt { /** * 测试方法 * * @param args * @throws Exception */ public static void main(String[] args) throws Exception { Cpu c = new Cpu(); while (true) { System.out .println("java的cpu占有率=" + c.getCpuRatioForWindows() + "%"); MonitorInfoBean monitorInfo = c.getMonitorInfoBean(); System.out.println("虚拟机总内存大小=" + monitorInfo.getTotalMemory() + "kb"); System.out.println("剩余内存=" + monitorInfo.getFreeMemory() + "kb"); System.out.println("java使用的内存=" + monitorInfo.getJavaUseMemory() + "kb"); } } }

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧