Java虚拟机具有一个堆,是运行时的数据区域,所有类实例和数组内存均从此处分配。堆是在java虚拟机启动时创建的。
堆是留给开发人员用的内存区域。非堆就是JVM留给自己用的(方法区,JVM内部处理或优化所需的内存,运行时的常量池,字段方法数据等)。
JVM初始分配的内存由-Xms指定,默认为物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。
默认空余堆内存小于40%时,JVM会增大到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。
因此服务器一般设置-Xms,-Xmx相等以避免每次在GC后调整堆的大小。
JVM使用-XX:PermSize设置非堆区持久代(仅仅存在于HotSpot中的概念,最新的HotSpot中也进行
了移除)内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大的非堆内存的大小,默认是物理内存的1/4。
JVM内存限制(最大值)
32位的操作系统,处理器会控制内存空间有4G,64bit以上处理器就不会有限制
常用参数:
-Xmx Java Heap最大值,默认值为物理内存的1/4,最佳设值应该视物理内存大小及计算机内其他内存开销而定;
-Xms Java Heap初始值,Server端JVM最好将-Xms和-Xmx设为相同值,开发测试机JVM可以保留默认值;
-Xmn Java Heap Young区大小,增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8;
-Xss 每个线程的Stack大小,JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K;