一、概念扫盲
弄明白Xms、Xmx、Permsize、MaxPermsize这几个名词的设置,就不得不先弄明白Java程序运行过程中的使用的内存是何物?如果我们把服务器(或者个人开发计算机)的物理内存比作一个大圆圈,如图:
-
蓝色部分为Java虚拟机未使用的物理内存,一般JVM内存的最大值与当前操作系统有很大关系,32位操作系统处理器的话,JVM的限制最大只有4G,如果操作系统为64位处理器的话,则没有这个限制。
-
绿色部分为JVM使用内存中的非堆内存,有一种说法叫栈内存,存放基本类型数据存储,具有明确的生命周期,符合后进先出的原则,超出当前变量使用域后,进行销毁栈内存的使用,回收容量。还有一种说法,这部分包括两部分:静态存储区和栈存储两部分,静态存储策略主要存放具有定量周期的类对象变量。
-
黄色部分为堆内存,应用运行过程中,存储new的对象实例以及引用类型数据,默认初始化大小为物理内存的1/64,最大容量为物理内容的1/4,默认空余堆内存小于40%的时候,JVM就会增大堆内存的容量直到设置的-Xmx的最大限制,超出之后就会报内存溢出。
PS:
如果-Xmx 不指定或者指定偏小,应用可能会导致java.lang.OutOfMemo