以下摘抄自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错误。
本文通过实验演示了Java虚拟机(JVM)的内存管理过程,包括初始化内存(init)、使用中内存(used)、已承诺内存(committed)及最大可用内存(max)的概念,并通过代码示例展示了这些内存值的变化及其相互之间的关系。

8270

被折叠的 条评论
为什么被折叠?



