JVM中MemoryUsage中init,committed,used,max的含义

来源:互联网 发布:淘宝9块9包邮报名资格 编辑:程序博客网 时间:2024/05/23 14:23

以下摘抄自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 blocke.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错误。

原创粉丝点击