MyEclipseJVM内存配置及性能调优在使用MyEclipse的过程中经常出现内存不足的提示:MyEclipsehasdetectedthatlessthan5%ofthe31MBofEdenSpace(Heapmemory)spaceremains.ItisstronglyrecommendedthatyouexitandrestartMyEclipsewithnewvirtualmachinememoryparamterstoincreasethismemory.Failuretodosocanresultindataloss.Recommendedmemoryarguments:-vmargs-Xmx512m-XX:MaxPermSize=256m-XX:ReservedCodeCacheSize=64m提示中说的很明白:“MyEclipsehasdetectedthatlessthan5%ofthe64MBofPermGen(Non-heapmemory)spaceremains.”意思是说当前只有小于5%的非堆内存是空闲的。解决办法:打开Eclipse目录,找到Eclipse.ini配置文件。打开可以看到如下配置信息-vmargs-Xmx256m-XX:MaxPermSize=64m修改如下:-vmargs-Xms512m//配置堆内存的最小值-Xmx512m//配置堆内存的最大值-XX:PermSize=128M//配置非堆内存的最小值-XX:MaxPermSize=128M//配置非堆内存的最大值堆(Heap)和非堆(Non-heap)内存按照官方的说法:“Java虚拟机具有一个堆,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在Java虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heapmemory)”。可以看出JVM主要管理两种类型的内存:堆和非堆。简单来说堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给自己用的,所以方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。1)堆内存的分配JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制。因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。2)非堆内存的分配JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。JVM性能调优jvm将内存分为new(存放jvm刚分配的java对象)、tenured(存放没被垃圾回收掉的java对象)、perm(存放class、method元信息--代码)三种,其中New和Tenured属于堆内存,堆内存会从JVM启动参数(-Xmx:3G)指定的内存中分配;Perm不属于堆内存,由jvm直接分配,但可以通过-XX:PermSize-XX:MaxPermSize等参数调整其大小。New又分为几个部分:1)Eden:Eden用来存放JVM刚分配的对象2)Survivor13)Survivro2:两个Survivor空间一样大,当Eden中的对象经过垃圾回收没有被回收掉时,会在两个Survivor之间来回Copy,当满足某个条件,比如Copy次数,就会被Copy到Tenured。显然,Survivor只是增加了对象在年轻代中的逗留时间,增加了被垃圾回收的可能性。垃圾回收算法可以分为三类,都基于标记-清除(复制)算法:1)Serial算法(单线程)2)并行算法3)并发算法JVM会根据机器的硬件配置对每个内存代选择适合的回收算法,比如,如果机器多于1个核,会对年轻代选择并行算法,关于选择细节请参考JVM调优文档。稍微解释下的是,并行算法是用多线程进行垃圾回收,回收期间会暂停程序的执行,而并发算法,也是多线程回收,但期间不停止应用执行。所以,并发算法适用于交互性高的一些程序。经过观察,并发算法会减少年轻代的大小,其实就是使用了一个大的年老代,这反过来跟并行算法相比吞吐量相对较低。垃圾回收动作执行条件:1)当年轻代内存满时,会引发一次普通GC,该GC仅回收年轻代。需要强调的时,年轻代满是指Eden代满,Survivor满不会引发GC2)当年老代满时会引发FullGC,FullGC将会同时回收年轻代、年老代3)当永久代满时也会引发FullGC,会导致Class、Method元信息的卸载4)抛出OutOfMemoryException的条件(不是内存被耗空的时候才抛出)5)JVM98%的时间都花费在内存回收6)每次回收的内存小于2%满足这两个条件将触发OutOfMemoryException,这将会留给系统一个微小的间隙以做一些Down之前的操作,比如手动打印HeapDump。