Runtime.getRuntime().freeMemory()/maxMemory() 内存问题

jspxnet 2003-03-04 08:20:02
我想得到计算机的物理内存,当java程序用的内存大意60%的时候就调用垃圾回收器.
但不明白下边几个参数的含义:

Runtime.getRuntime().maxMemory()
Runtime.getRuntime().freeMemory()
Runtime.getRuntime().totalMemory()

运行了一下得到如下结果—————————————————
maxMemory :134217728
freeMemory :1802328
totalMemory:13303808
-----------------------
maxMemory :134217728
freeMemory :7814704
totalMemory:16728064
--------------------------
问题:我的计算机是256的maxMemory却是134217728
freeMemory ,totalMemory 是怎么计算的
...全文
964 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jspxnet 2003-03-04
  • 打赏
  • 举报
回复
我就是英文不好啊!

free Memory() free 是 自由的,还是可用的,还是可释放的???
peacock_king 2003-03-04
  • 打赏
  • 举报
回复
maxmemory是指总的可用物理内存减掉系统所占用的内存所得;
freeMemory()
Returns the amount of free memory in the Java Virtual Machine.

maxMemory()
Returns the maximum amount of memory that the Java virtual machine will attempt to use.

totalMemory()
Returns the total amount of memory in the Java virtual machine.
jspxnet 2003-03-04
  • 打赏
  • 举报
回复
大家对下边的答案感觉对不对?

maxMemory :134217728 java最大可用内存
freeMemory :7814704 当前????内存
totalMemory:16728064 当前使用的内存
jspxnet 2003-03-04
  • 打赏
  • 举报
回复
定的Java的可用内: 无限制

60%只是打个比方,我会找一个相对比较好的比值.

intelliJ ide 感觉就是这样做的。
leonzhao 2003-03-04
  • 打赏
  • 举报
回复
你设定的Java的可用内存是多少??

我觉得你应该不要过多干预Java的GC过程,60%可能不是个好选择。
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"); } } }

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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