以下摘抄自JDK1.7
*
*
*
init*
represents the initial amount of memory (in bytes) that* the Java virtual machine requests from the operating system
* for memory management during startup. The Java virtual machine
* may request additional memory from the operating system and
* may also release memory to the system over time.
* The value of init may be undefined.
*
*
*
*
used*
represents the amount of memory currently used (in bytes).*
*
*
*
committed*
represents the amount of memory (in bytes) that is* guaranteed to be available for use by the Java virtual machine.
* The amount of committed memory may change over time (increase
* or decrease). The Java virtual machine may release memory to
* the system and committed could be less than init.
* committed will always be greater than
* or equal to used.
*
*
*
*
max*
represents the maximum amount of memory (in bytes)* that can be used for memory management. Its value may be undefined.
* The maximum amount of memory may change over time if defined.
* The amount of used and committed memory will always be less than
* or equal to max if max is defined.
* A memory allocation may fail if it attempts to increase the
* used memory such that used > committed even
* if used <= max would still be true (for example,
* when the system is low on virtual memory).
*
*
*
*
*
* Below is a picture showing an example of a memory pool:
*
*
* +----------------------------------------------+
* + | +
* + | +
* +----------------------------------------------+
*
* |--------|
* init
* |---------------|
* used
* |---------------------------|
* committed
* |----------------------------------------------|
* max
*
实验:import java.util.ArrayList;
import java.util.List;
public class VMTest {
public static void main(String[] args) {
List l = new ArrayList();
while(true) {
try {
Thread.sleep(1);
l.add(new Test());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Test {
int[] a = new int[2560];
}相当于每秒钟分配10M内存。
启动参数 -Xmx512m -Xms10m
结果:
init:10485760 略小于xms的10m
max:477233152 略小于xmx的512m
committed和used不停地增大,used始终小于committed,40几秒后达到max
,报java.lang.OutOfMemoryError: Java heap space错误。
结论:init约等于xms的值,max约等于xmx的值。used是已经被使用的内存大小,committed是当前可使用的内存大小(包括已使用的),committed >= used。committed不足时jvm向系统申请,若超过max则发生OutOfMemoryError错误。