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

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.


转载链接:http://www.codesky.net/article/201101/149165.html

java的运行平台JVM(java虚拟机)在一个应用程序启动的时候,虚拟机都要分配一个最的内存和最小内存给他的。对于内存吃内存狂的JAVA来说,这个初始内存和最大内存在一
定程度会对应用程序的性能产生很大的影响。比如说在我们的应用程序用到JVM给的这个最大内存配额的时候,JVM就不得不先停下我们的应用程
序的工作,去寻找可以回手的垃圾(释放已经无用的对象占用的内存),释放被占用的一些内存。
一般我们为了自己配额的这个最大值和最小值都是在启动java程序的时候加参数:-X
ms -Xmx来调整应用程序的初始内存和最大内存,其中Xms代表最小配额,Xmx代表最大配额
Runtime类中的freeMemory等几个方法
最近在网上看到一些人讨论到java.lang.Runtime类中的freeMemory(),totalMemory(),maxMemory()这几个方法的一些问题,很多人感到很疑惑,为什么,在java程序刚刚启动起来
的时候freeMemory()这个方法返回的只有一两兆字节,而随着java程序往前运行,创建了不少的对象,freeMemory()这个方法的返回有时候不但没有减少,反而会增加。这些人对
freeMemory()这个方法的意义应该有一些误解,他们认为这个方法返回的是操作系统的剩余可用内存,其实根本就不是这样的。这三个方法反映的都是java这个进程的内存情况,
跟操作系统的内存根本没有关系。下面结合totalMemory(),maxMemory()一起来解释。
maxMemory()这个方法返回的是java虚拟机(这个进程)能构从操作系统那里挖到的最大的内存,以字节为单位,如果在运行java程序的时候,没有添加-Xmx参数,那么就是64
兆,也就是说maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下能从操作系统那里挖到的最大的内存。如果添加了-Xmx参数,将以这个参数后面的值为准,
例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512*1024*0124字节。
totalMemory()这个方法返回的是java虚拟机现在已经从操作系统那里挖过来的内存大小,也就是java虚拟机这个进程当时所占用的所有内存。如果在运行java的时候没有添加
-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,直挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用
了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。
freeMemory()是什么呢,刚才讲到如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少
,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在
运行java程序的时候使用了-Xms,这个时候因为程序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时
候freeMemory()可能会有些大。
把下面的源代码编译以后,在class文件所在的目录里面,分别用java -cp . Untitled1 和java -cp . -Xms80m -Xmx80m Untitled1 运行,看看结果如何,有助于理解上面的
阐述。
package test;
public class TestStr {
public static void main(String[] args) {
System.out.println(Runtime.getRuntime().freeMemory());
System.out.println(Runtime.getRuntime().totalMemory());
System.out.println(Runtime.getRuntime().maxMemory());
long t = System.currentTimeMillis();
try {
Thread.sleep(30000);66650112 844955648
} catch (Exception ee) {
ee.printStackTrace();
}
String[] aaa = new String[2000000];
System.out.println(Runtime.getRuntime().freeMemory());
System.out.println(Runtime.getRuntime().totalMemory());
System.out.println(Runtime.getRuntime().maxMemory());
try {
Thread.sleep(30000);
} catch (Exception ee) {
ee.printStackTrace();
}
for (int i = 0; i < 2000000; i++) {
aaa = new String("aaa");
}
System.out.println(Runtime.getRuntime().freeMemory());
System.out.println(Runtime.getRuntime().totalMemory());
System.out.println(Runtime.getRuntime().maxMemory());
try {
Thread.sleep(30000);
} catch (Exception ee) {
ee.printStackTrace();
}
}
}
修改方法:
/tomcat/bin/catalina.bat
set _EXECJAVA=%_RUNJAVA%
set MAINCLASS=org.apache.catalina.startup.Bootstrap
set ACTION=start
set SECURITY_POLICY_FILE=
set DEBUG_OPTS=
set JPDA=//这行下面加上
set JAVA_OPTS=-Xms256m -Xmx768m
maxMemory()返回的大约是64*1024*1024字节 如果不手工设置变量set JAVA_OPTS,那么TOMCAT默认的maxMemory是40M(66650112)左右
测试JSP
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
Runtime lRuntime = Runtime.getRuntime();
out.println("*** BEGIN MEMORY STATISTICS ***
");
out.println("Free Memory(空闲内存): "+lRuntime.freeMemory()+"
");
out.println("Max Memory(JVM能从OS系统中获取的最大内存): "+lRuntime.maxMemory()+"
");
out.println("Total Memory(目前JVA从OS系统中获取的内存): "+lRuntime.totalMemory()+"
");
out.println("Available Processors服务器的CPU个数 : "+lRuntime.availableProcessors()+"
");
out.println("*** END MEMORY STATISTICS ***");
%>

你可能感兴趣的:(Runtime.getRuntime().maxMemory()/freeMemory()/totalMemory())