扩大Eclipse的内存

作项目的时候,MyEclipse提示内存不足。
错误提示大概以下:
MyEclipse has detected that less than 5% of the 64MB of Perm 
Gen (Non-heap memory) space remains. It is strongly recommended
that you exit and restart MyEclipse with new virtual machine memory
paramters to increase this memory.   Failure to do so can result in
data loss. The recommended Eclipse memory parameters are: 
eclipse.exe -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M

如下是个人MyEclipse快捷方式的参数:
"D:/Eclipse 3.2.2/eclipse.exe" -product com.genuitec.myeclipse.product.ide -vmargs -Duser.language=en -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M   -Dosgi.splashLocation="d:/MyEclipse 5.0GA/eclipse/MyEclipseSplash.bmp"

对于MyEclipse的话,直接修改MyEclipse在桌面的快捷方式的参数就能够啦。如今解释这些参数的意思。

-vmargs:说明后面是VM的参数
-Xms40m:虚拟机占用系统的最小内存
-Xmx256m:虚拟机占用系统的最大内存
-XX:PermSize:最小堆大小。通常报内存不足时,都是说这个过小,
                      堆空间剩余小于5%就会警告,建议把这个稍微设
                           大一点,不过要视本身机器内存大小来设置
-XX:MaxPermSize:最大堆大小。这个也适当大些
-Xmx512M的5%为25.6M,理论上要求-Xmx的数值与-XX:MaxPermSize必须大于25.6M

把里面的参数改成
-vmargs  
-Xms128M  
-Xmx512M  
-XX:PermSize=128M  
-XX:MaxPermSize=256M

因此对于我而言,我只要把个人MyEclipse5.0改-XX:PermSize=128M -XX:MaxPermSize=256M,问题解决! 
(我的补充一点:参数在你安装的exlipse目录下的eclipse.ini文件中)java

 

 

 

   这一段时间,Eclipse老是死掉,几乎是稍微操做快一点就会死掉,几分钟一次,搞得人郁闷至极。浪费了很多时间,在网上搜了下,看到不少朋友也出现类 似的状况,在网上求救,可是网上的办法都只是说经过修改eclipse.ini文件来加大Eclipse的内存。 

本身试了下,发现无论用。今天,又死掉了,不过爆出一个常常出现的错误,大意是:permgen space致使内存溢出。实在忍无可忍,上网一搜,发现网络真是个好东西,尤为是对咱们这种自学者而言,无疑是授业解惑的良师益友。 

这里总结一下本身的经验和网友的经验,但愿可以对受此问题折磨的朋友有所参考价值。 

解决办法以下: 

在eclipse.ini配置文件中加上如下两行 
-XX:PermSize=128M 
-XX:MaxPermSize=128M 

加上上2行后,个人eclipse.ini文件以下所示: 

-showsplash 
org.eclipse.platform 
--launcher.XXMaxPermSize 
512m 
-vmargs 
-Xms256m 
-Xmx512m 
-XX:PermSize=128M 
-XX:MaxPermSize=128M 

这里的内存大小根据本身的物理内存状况来决定吧。 

从网上的资料看PermSize大一点确定更好,并且最好是设置PermSize和MaxPermSize同样大。理由以下: 
PermSize 和MaxPermSize若是设置为相同还能够在必定程度上提升性能,由于,PermSize在不断的变化中会须要转移其中的数据。若是固定了之后,则能够减小每次扩大PermSize带来的性能损失。 



一、PermGen space简介 

PermGen space的全称是Permanent Generation space,是指内存的永久保存区域OutOfMemoryError: PermGen space从表面上看就是内存益出,解决方法也必定是加大内存。 

说说为何会内存益出: 
(1)这一部分用于存放Class和Meta的信息,Class在被 Load的时候被放入PermGen space区域,它和和存放Instance的Heap区域不一样。 
(2) GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,因此若是你的APP会LOAD不少CLASS 的话,就极可能出现PermGen space错误。这种错误常见在web服务器对JSP进行pre compile的时候。 

若是你的WEB APP下都用了大量的第三方jar,其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。 


解决方法: 手动设置MaxPermSize大小 

修改TOMCAT_HOME/bin/catalina.sh,在echo "Using CATALINA_BASE: $CATALINA_BASE"上面加入如下行: 
JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128m 
建议:将相同的第三方jar文件移置到tomcat/shared/lib目录下,这样能够减小jar 文档重复占用内存web

 

-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M 
这里有几个问题:
1. 各个参数的含义什么?
2. 为何有的机器我将-Xmx和-XX:MaxPermSize都设置为512M以后Eclipse能够启动,而有些机器没法启动?
3. 为什么将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?
下面咱们一一进行回答
1. 各个参数的含义什么?
参数中-vmargs的意思是设置JVM参数,因此后面的其实都是JVM的参数了,咱们首先了解一下JVM内存管理的机制,而后再解释每一个参数表明的含义。
堆(Heap)和非堆(Non-heap)内存
按照官方的说法:“Java 虚拟机具备一个堆,堆是运行时数据区域,全部类实例和数组的内存均今后处分配。堆是在 Java 虚拟机启动时建立的。”“在JVM中堆以外的内存称为非堆内存(Non-heap memory)”。能够看出JVM主要管理两种类型的内存:堆和非堆。简单来讲堆就是Java代码可及的内存,是留给开发人员使用的;非堆就是JVM留给本身用的,因此方法区、JVM内部处理或优化所需的内存(如JIT编译后的代码缓存)、每一个类结构(如运行时常数池、字段和方法数据)以及方法和构造方法的代码都在非堆内存中。
堆内存分配
JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减小堆直到-Xms的最小限制。所以服务器通常设置-Xms、-Xmx相等以免在每次GC 后调整堆的大小。
非堆内存分配
JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4。
JVM内存限制(最大值)
首先JVM内存限制于实际的最大物理内存(废话!呵呵),假设物理内存无限大的话,JVM内存的最大值跟操做系统有很大的关系。简单的说就32位处理器虽然可控内存空间有4GB,可是具体的操做系统会给一个限制,这个限制通常是2GB-3GB(通常来讲Windows系统下为1.5G-2G,Linux系统下为2G-3G),而64bit以上的处理器就不会有限制了。
2. 为何有的机器我将-Xmx和-XX:MaxPermSize都设置为512M以后Eclipse能够启动,而有些机器没法启动?
经过上面对JVM内存管理的介绍咱们已经了解到JVM内存包含两种:堆内存和非堆内存,另外JVM最大内存首先取决于实际的物理内存和操做系统。因此说设置VM参数致使程序没法启动主要有如下几种缘由:
1) 参数中-Xms的值大于-Xmx,或者-XX:PermSize的值大于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最大限制,好比当前操做系统最大内存限制,或者实际的物理内存等等。说到实际物理内存这里须要说明一点的是,若是你的内存是1024MB,但实际系统中用到的并不多是1024MB,由于有一部分被硬件占用了。
3. 为什么将上面的参数写入到eclipse.ini文件Eclipse没有执行对应的设置?
那为何一样的参数在快捷方式或者命令行中有效而在eclipse.ini文件中是无效的呢?这是由于咱们没有遵照eclipse.ini文件的设置规则:
参数形如“项 值”这种形式,中间有空格的须要换行书写,若是值中有空格的须要用双引号包括起来。好比咱们使用-vm C:/Java/jre1.6.0/bin/javaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:
-vm
C:/Java/jre1.6.0/bin/javaw.exe
按照上面所说的,最后参数在eclipse.ini中能够写成这个样子:
-vmargs
-Xms128M
-Xmx512M
-XX:PermSize=64M
-XX:MaxPermSize=128M
实际运行的结果能够经过Eclipse中“Help”-“About Eclipse SDK”窗口里面的“Configuration Details”按钮进行查看。
另外须要说明的是,Eclipse压缩包中自带的eclipse.ini文件内容是这样的:
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
-vmargs
-Xms40m
-Xmx256m
其中–launcher.XXMaxPermSize(注意最前面是两个链接线)跟-XX:MaxPermSize参数的含义基本是同样的,我以为惟一的区别就是前者是eclipse.exe启动的时候设置的参数,然后者是eclipse所使用的JVM中的参数。其实两者设置一个就能够了,因此这里能够把–launcher.XXMaxPermSize和下一行使用#注释掉。

3. 其余的启动参数。 若是你有一个双核的CPU,也许能够尝试这个参数:数组

-XX:+UseParallelGC缓存

让GC能够更快的执行。(只是JDK 5里对GC新增长的参数)tomcat

 

补充:服务器

能够在myelipse里选中相应的服务器好比tomcat5,展开里面的JDK子项页面,来增长服务器启动的JVM参数设置:网络

-Xms128m 
-Xmx256m 
-XX:PermSize=128M 
-XX:MaxNewSize=256m 
-XX:MaxPermSize=256mless

 

原文: http://blog.csdn.net/xx_liuhui/article/details/4355199eclipse

相关文章
相关标签/搜索