以下摘抄自JDK1.7
* <table>
* <tr>
* <td valign=top> <tt>init</tt> </td>
* <td valign=top> 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 <tt>init</tt> may be undefined.
* </td>
* </tr>
* <tr>
* <td valign=top> <tt>used</tt> </td>
* <td valign=top> represents the amount of memory currently used (in bytes).
* </td>
* </tr>
* <tr>
* <td valign=top> <tt>committed</tt> </td>
* <td valign=top> 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 <tt>committed</tt> could be less than <tt>init</tt>.
* <tt>committed</tt> will always be greater than
* or equal to <tt>used</tt>.
* </td>
* </tr>
* <tr>
* <td valign=top> <tt>max</tt> </td>
* <td valign=top> 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 <tt>max</tt> if <tt>max</tt> is defined.
* A memory allocation may fail if it attempts to increase the
* used memory such that <tt>used > committed</tt> even
* if <tt>used <= max</tt> would still be true (for example,
* when the system is low on virtual memory).
* </td>
* </tr>
* </table>
* </ul>
*
* Below is a picture showing an example of a memory pool:
* <p>
* <pre>
* +----------------------------------------------+
* +//////////////// | +
* +//////////////// | +
* +----------------------------------------------+
*
* |--------|
* init
* |---------------|
* used
* |---------------------------|
* committed
* |----------------------------------------------|
* max
* </pre>
實驗:
import java.util.ArrayList;
import java.util.List;
public class VMTest {
public static void main(String[] args) {
List<Test> l = new ArrayList<Test>();
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錯誤。