最全的Eclipse 启动优化内存优化.docx
- 文档编号:3691191
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:9
- 大小:24.88KB
最全的Eclipse 启动优化内存优化.docx
《最全的Eclipse 启动优化内存优化.docx》由会员分享,可在线阅读,更多相关《最全的Eclipse 启动优化内存优化.docx(9页珍藏版)》请在冰豆网上搜索。
最全的Eclipse启动优化内存优化
最全的Eclipse启动优化、内存优化
-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-heapmemory)”。
可以看出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文件的设置规则:
参数形如“项值”这种形式,中间有空格的需要换行书写,如果值中有空格的需要用双引号包括起来。
比如我们使用-vmC:
Javajre1.6.0binjavaw.exe参数设置虚拟机,在eclipse.ini文件中要写成这样:
-vm
C:
Javajre1.6.0binjavaw.exe
按照上面所说的,最后参数在eclipse.ini中可以写成这个样子:
-vmargs
-Xms128M
-Xmx512M
-XX:
PermSize=64M
-XX:
MaxPermSize=128M
实际运行的结果可以通过Eclipse中“Help”-“AboutEclipseSDK”窗口里面的“ConfigurationDetails”按钮进行查看。
另外需要说明的是,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可以更快的执行。
(只是JDK5里对GC新增加的参数)
其实,Eclipse是一个可以进行非常灵活配置的系统,除了以缺省的方式启动以外,还可以指定各种参数来定制启动方式。
在参考了一些资料之后,我总结了一些比较常用的启动时CommandArguments,如果有不正确的地方希望大家予以指出。
-arch[processorarchitecture]
描述:
指定所使用的处理器的类别
举例:
eclipse-archx86或eclipse-archsparc
-application[id]
描述:
指定要运行的应用,id为扩展org.eclipse.core.applications扩展点的插件id加扩展id
举例:
例如有个插件id为edu.sdu.app,扩展id为myapp,则eclipse-applicationedu.sdu.app.myapp,就会执行你的扩展应用
-clean
描述:
清空插件缓存内容
举例:
eclipse-clean,有时插件显示不出来是因为Eclipse将插件进行了缓存以加速启动过程,若指定此参数则会清空缓存,从头加载
-configuration[cofigfilelocation]
描述:
指定配置文件的位置,在启动时使用此目录下的配置文件config.ini来启动
举例:
eclipse-configurationd:
/eclipse/configuration
-data[workspacelocation]
描述:
指定启动时的Workspace位置
举例:
例如Workspace位置设在D:
/myworkspace,则eclipse-dataD:
/myworkspace
-debug[optionfile]
描述:
以Debug状态启动Eclipse,所有的Debug开关在.options文件中指定
举例:
eclipse-debugd:
/eclipse/.options
-dev[classpathentry]
描述:
以开发状态启动Eclipse,这会添加所有指定的路径作为每个插件的Classpath
举例:
例如eclipse-devbin,会将产生在bin目录下的所有类加载到类路径中,这在开发插件时非常有用
-nosplash
描述:
指定启动时不显示闪屏
举例:
eclipse-nosplash
-vm[jrepath]
描述:
指定启动时所使用的Java虚拟机
举例:
例如要使用自己的Java虚拟机,则eclipse-vmD:
/j2sdk1.4.2_04/jre/bin/java.exe,这样还有一个好处,就是可以开启一个Console,能够显示控制台信息,当然若使用eclipse-vmD:
/j2sdk1.4.2_04/jre/bin/javaw.exe则不会再显示控制台
-vmargs[JavaVMarguments]
描述:
指定启动时要使用的Java虚拟机参数
举例:
例如要指定使用的内存容量,则eclipse-vmargs"-Xms256m-Xmx1024m"
注:
此参数一定要放在所有参数变量的最后面
永久空间内存不足java.lang.OutOfMemoryError:
PermGenspace,相比不少使用spring,hibernate等一堆jar包的人都遇到过这个问题,在tomcatreload一个Context多次后,tomcat就挂掉了。
PermGenspace这一部分用于存放Class和Meta的信息,Class在被Load的时候被放入PermGenspace区域,它和和存放Instance的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGenspace错误。
我在做TMS的发布工具的时候,就遇到了问题,这个工具的目的是把一个相同的系统,在tomcat下自动的发布多份,但当卸载,重新发布多次后,tomcat就挂了,整个电脑如同死机一般。
后来使用文章里的setJAVA_OPTS=-server-Xms800m-Xmx800m-XX:
PermSize=64M-XX:
MaxNewSize=256m-XX:
MaxPermSize=128m-Djava.awt.headless=true解决了问题,不过在2G的电脑上,我是把-XX:
MaxPermSize=128m调到了-XX:
MaxPermSize=256m。
另外我还尝试了把所有的lib都放到tomcat的lib下,一些lib就不能在本项目中再出现了。
现在看,还是spring,hibernate之类的产生的类导致PermGenspace空间不足造成的这些问题。
这个帖子里讨论了这个问题,有人做了些有益的分析可以看看。
我又继续在我的笔记本上做了测试T42,1G内存。
tomcat版本6.0.14。
setJAVA_OPTS=-server-Xms256m-Xmx256m-XX:
PermSize=64M-XX:
MaxNewSize=256m-XX:
MaxPermSize=256m-Djava.awt.headless=true
这个配置反复发布是可以的,另外又一次测试了将项目下的jar包放到tomcat的lib下的对比。
重新安装一个lib下为空的程序是10秒,否则是30秒。
tomcat出现OutOfMemoryError:
PermGenspace
最近在把在tomcat5.5上开发的项目deploy到JBoss4.2上时,在操作一段时间就会出现java.lang.OutOfMemoryError:
PermGenspace,开始以为是代码中存在死循环的地方造成这样的问题,但是后来发现,出问题的地方都是随机的,并不是某一处造成这样的问题出现,怀疑是内存泄露,通过增大heap内存的方法来尝试,依然不行,但是同样的问题却并没有在tomcat中出现过,难道是JBoss的问题?
在网上做了一番搜索得到一些相关的内容。
PermGenspace的全称是PermanentGenerationspace,是指内存的永久保存区域OutOfMemoryError:
PermGenspace从表面上看就是内存益出,解决方法也一定是加大内存。
说说为什么会内存益出:
这一部分用于存放Class和Meta的信息,Class在被Load的时候被放入PermGenspace区域,它和和存放Instance的Heap区域不同,GC(GarbageCollection)不会在主程序运行期对PermGenspace进行清理,所以如果你的APP会LOAD很多CLASS的话,就很可能出现PermGenspace错误。
这种错误常见在web服务器对JSP进行precompile的时候。
改正方法,在run.bat中加入:
-Xms256m-Xmx512m-XX:
MaxNewSize=256m-XX:
MaxPermSize=256m
因为项目中引用了很多的jar包,而这些jar包中的class信息会被JBoss的classloader加载到PermGenspace区域,在JVM默认的情况下,该部分空间的大小只有4M,在jar包非常多的情况下,显然是不够用的,所以通过-XX:
MaxPermSize=256m指定最大值后即可解决问题。
另外,如果heap内存不足出现java.lang.OutOfMemoryError:
Javaheapspace时,可以通过-Xmx512m指定最大heap内存来解决这样的问题。
文章出处:
3楼liudaoru2009-03-06
JVM调优总结-Xms-Xmx-Xmn-Xss
From:
堆大小设置
JVM中最大堆大小有三方面限制:
相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。
32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。
我在WindowsServer2003系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。
典型设置:
java-Xmx3550m-Xms3550m-Xmn2g-Xss128k
-Xmx3550m:
设置JVM最大可用内存为3550M。
-Xms3550m:
设置JVM促使内存为3550m。
此值可以设置与-Xmx相同,以避免每次垃圾回收完成后JVM重新分配内存。
-Xmn2g:
设置年轻代大小为2G。
整个堆大小=年轻代大小+年老代大小+持久代大小。
持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。
此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。
-Xss128k:
设置每个线程的堆栈大小。
JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K。
更具应用的线程所需内存大小进行调整。
在相同物理内存下,减小这个值能生成更多的线程。
但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右。
java-Xmx3550m-Xms3550m-Xss128k-XX:
NewRatio=4-XX:
SurvivorRatio=4-XX:
MaxPermSize=16m-XX:
MaxTenuringThreshold=0
-XX:
NewRatio=4:
设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。
设置为4,则年轻代与年老代所占比值为1:
4,年轻代占整个堆栈的1/5
-XX:
SurvivorRatio=4:
设置年轻代中Eden区与Survivor区的大小比值。
设置为4,则两个Survivor区与一个Eden区的比值为2:
4,一个Survivor区占整个年轻代的1/6
-XX:
MaxPermSize=16m:
设置持久代大小为16m。
-XX:
MaxTenuringThreshold=0:
设置垃圾最大年龄。
如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。
对于年老代比较多的应用,可以提高效率。
如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象再年轻代的存活时间,增加在年轻代即被回收的概论。
回收器选择
JVM给了三种选择:
串行收集器、并行收集器、并发收集器,但是串行收集器只适用于小数据量的情况,所以这里的选择主要针对并行收集器和并发收集器。
默认情况下,JDK5.0以前都是使用串行收集器,如果想使用其他收集器需要在启动时加入相应参数。
JDK5.0以后,JVM会根据当前系统配置进行判断。
吞吐量优先的并行收集器
如上文所述,并行收集器主要以到达一定的吞吐量为目标,适用于科学技术和后台处理等。
典型配置:
java-Xmx3800m-Xms3800m-Xmn2g-Xss128k-XX:
+UseParallelGC-XX:
ParallelGCThreads=20
-XX:
+UseParallelGC:
选择垃圾收集器为并行收集器。
此配置仅对年轻代有效。
即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。
-XX:
ParallelGCThreads=20:
配置并行收集器的线程数,即:
同时多少个线程一起进行垃圾回收。
此值最好配置与处理器数目相等。
java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:
+UseParallelGC-XX:
ParallelGCThreads=20-XX:
+UseParallelOldGC
-XX:
+UseParallelOldGC:
配置年老代垃圾收集方式为并行收集。
JDK6.0支持对年老代并行收集。
java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:
+UseParallelGC -XX:
MaxGCPauseMillis=100
-XX:
MaxGCPauseMillis=100:
设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。
java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:
+UseParallelGC -XX:
MaxGCPauseMillis=100-XX:
+UseAdaptiveSizePolicy
-XX:
+UseAdaptiveSizePolicy:
设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。
响应时间优先的并发收集器
如上文所述,并发收集器主要是保证系统的响应时间,减少垃圾收集时的停顿时间。
适用于应用服务器、电信领域等。
典型配置:
java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:
ParallelGCThreads=20-XX:
+UseConcMarkSweepGC-XX:
+UseParNewGC
-XX:
+UseConcMarkSweepGC:
设置年老代为并发收集。
测试中配置这个以后,-XX:
NewRatio=4的配置失效了,原因不明。
所以,此时年轻代大小最好用-Xmn设置。
-XX:
+UseParNewGC:
设置年轻代为并行收集。
可与CMS收集同时使用。
JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。
java-Xmx3550m-Xms3550m-Xmn2g-Xss128k-XX:
+UseConcMarkSweepGC-XX:
CMSFullGCsBeforeCompaction=5-XX:
+UseCMSCompactAtFullCollection
-XX:
CMSFullGCsBeforeCompaction:
由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。
此值设置运行多少次GC以后对内存空间进行压缩、整理。
-XX:
+UseCMSCompactAtFullCollection:
打开对年老代的压缩。
可能会影响性能,但是可以消除碎片
辅助信息
JVM提供了大量命令行参数,打印信息,供调试使用。
主要有以下一些:
-XX:
+PrintGC
输出形式:
[GC118250K->113543K(130112K),0.0094143secs]
[FullGC121376K->10414K(130112K),0.0650971secs]
-XX:
+PrintGCDetails
输出形式:
[GC[DefNew:
8614K->781K(9088K),0.0123035secs]118250K->113543K(130112K),0.0124633secs]
[GC[DefNew:
8614K->8614K(9088K),0.0000665secs][Tenured:
112761K->10414K(121024K),0.0433488secs]121376K->10414K(130112K),0.0436268secs]
-XX:
+PrintGCTimeStamps-XX:
+PrintGC:
PrintGCTimeStamps可与上面两个混合使用
输出形式:
11.851:
[GC98328K->93620K(130112K),0.0082960secs]
-XX:
+PrintGCApplicationConcurrentTime:
打印每次垃圾回收前,程序未中断的执行时间。
可与上面混合使用
输出形式:
Applicationtime:
0.5291524seconds
-XX:
+PrintGCApplicationStoppedTime:
打印垃圾回收期间程序暂停的时间。
可与上面混合使用
输出形式:
Totaltimeforwhichapplicationthreadswerestopped:
0.0468229seconds
-XX:
PrintHeapAtGC:
打印GC前后的详细堆栈信息
输出形式:
34.702:
[GC{Heapbeforegcinvocations=7:
defnewgeneration total55296K,used52568K[0x1ebd0000,0x227d0000,0x227d0000)
edenspace49152K, 99%used[0x1ebd0000,0x21bce430,0x21bd0000)
fromspace6144K, 55%used[0x221d0000,0x22527e10,0x227d0000)
to space6144K, 0%used[0x21bd0000,0x21bd0000,0x221d0000)
tenuredgeneration total69632K,used2696K[0x227d0000,0
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最全的Eclipse 启动优化内存优化 Eclipse 启动 优化 内存