Eclipse设置、调优、使⽤
⼀般在不对eclipse进⾏相关设置的时候,使⽤eclipse总是会觉得启动好慢,⽤起来好卡,其实只要对eclipse的相关参数进⾏⼀些配置,就会有很⼤的改善
Eclipse的启动由$ECLIPSE_HOME/eclipse.ini控制,如果$ECLIPSE_HOME 没有被定义,则Eclipse安装⽬录下的默认eclipse.ini会⽣效。
eclipse.ini是⼀个⽂本⽂件,其内容相当于在Eclipse运⾏时添加到 之后的命令⾏参数。
eclipse.ini 不仅仅可以设置eclipse的堆栈内存⼤⼩,也可设置默认使⽤的jdk版本。
其格式要求:
1:所有的选项及其相关的参数必须在单独的⼀⾏之内
2:所有在-vmargs之后的参数将会被传输给JVM,所有如果所有对Eclipse 设置的参数必须写在-vmargs之前(就如同你在命令⾏上使⽤这些参数⼀样)
3.所有的选项及其相关的参数必须在单独的⼀⾏之内,若参数形如“项值”形式,中间的空格需要换⾏书写,如果值中有空格则需要⽤双引号括起来
堆(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以上的处理器就不会有限制了。
设置VM参数导致程序⽆法启动主要有以下⼏种原因:
1)参数中-Xms的值⼤于-Xmx,或者-XX:PermSize的值⼤于-XX:MaxPermSize;
2) -Xmx的值和-XX:MaxPermSize的总和超过了JVM内存的最⼤限制,⽐如当前操作系统最⼤内存限制,或者实际的物理内存等等。
说到实际物理内存这⾥需要说明⼀点的是,如果你的内存是1024MB,但实际系统中⽤到的并不可能是1024MB,因为有⼀部分被硬件占⽤了。
-startup
lipse.equinox.launcher_1.1.0.v20100507.jar
--launcher.library
lipse.equinox.launcher.win32.win32.x86_1.1.1.R36x_v20100810
-product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize  (PS:注意前⾯是两个连接线,其和XX:MaxPermSize基本⼀致,唯⼀的区别是前者是启动时设置的参数,后者是eclipse所使⽤的JVM中的参数,可以⽤#注释掉⼀个。
)
256M
-showsplash
-vm
E:\java\java11\jdk-11.0.8\(创建项⽬时的默认jdk版本)
-vmargs
-quiredJavaVersion=1.7  (PS:告诉Eclipse在 Launch 的时候⾄少要使⽤JRE1.7)
-Xms256m
-Xmx1024m
(服务器⼀般设置-Xms、-Xmx相等以避免在每次GC 后调整堆的⼤⼩。)
-
-ding=UTF-8  (PS: ding 影响⽂件名的创建,⽽ ding 则影响到⽂件内容。)
机器物理内存16GB (8G内存请将参数减半)
(⼀般8G的⼀般情况  -Xmx1024m 就够了)
eclipse版本:IBM Rational® Software Architect Designer for WebSphere(Version:9.5)
如果⾮IBM Rational 的eclipse、请将下列标有[IBM]标识的参数⽤'#'注掉或将其删除、
-vm
jdk/jre/
-startup
lipse.equinox.launcher_1.3.0.v20140415-2008.jar
--launcher.library
lipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20150204-1316
-install
C:/IBM/SDP
-vmargs
-Xquickstart
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
#-Xloggc:C:\temp\logs\gc\gc.log
-Xverbosegclog:C:\temp\logs\gc\gc.log
-Xms4096m
-
Xmx4096m
#-Xgcpolicy:gencon
#-Xmn1536m
-Xmns1024m
-Xmnx1024m
-Xscmx512m
-Xshareclasses:name=IBMSDP_%u
-XX:PermSize=1024m
-XX:MaxPermSize=4096m
-Xverify:none
-XX:CompileThreshold=100
-
XX:ParallelGCThreads=4
-XX:+DisableExplicitGC
-XX:+UseParNewGC
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=80
-Xcompressedrefs
-Dcom.ibm.ws.management.event.max_polling_interval=1000
-Djava.util.Arrays.useLegacyMergeSort=true
参数解释及相关优化⽅案:
Ⅰ、内存代的优化
-
Xms  初始总堆内存,默认是物理内存的1/64;JVM最⼤分配的内存由-Xmx指定,默认是物理内存的1/4。默认空余堆内存⼩于40%时,JVM就会增⼤堆直到-Xmx的最⼤限制;空余堆内存⼤于70%时,JVM会减少堆直到-Xms的最⼩限制。因此服务⾮堆内存分配
-Xmx  最⼤总堆内存,⼀般设置为物理内存的1/4
-Xmn  年轻带堆内存,sun官⽅推荐为整个堆的3/8
使⽤ -Xgcpolicy:gencon 或 -Xgcpolicy:balanced 时,-Xmn 选项相当于设置 -Xmns 和 -Xmnx 选项[IBM]。
使⽤ -Xgcpolicy:gencon 时,-Xmnx 设置新区域的最⼤⼤⼩。缺省情况下,此选项设置为 -Xmx 选项值的 25%。如果禁⽤ scavenger,将忽略 -Xmnx 选项[IBM]。
使⽤ -Xgcpolicy:balanced 时,-Xmnx 设置 Eden 空间的最⼤⼤⼩。缺省情况下,此选项设置为 -Xmx 选项值的 25%[IBM]。
对于 -Xgcpolicy:gencon 和 -Xgcpolicy:balanced 策略,如果您尝试同时使⽤ -Xmnx 和 -Xmn,那么 JVM 会返回错误[IBM]。
-Xmns  选项根据指定的垃圾回收策略,为新区域或 Eden 空间设置初始⼤⼩[IBM]。
-Xmnx  选项根据指定的垃圾回收策略,为新区域或 Eden 空间设置最⼤⼤⼩[IBM]。
-Xscmx  指定缓存的⼤⼩;这个参数只应⽤于 JVM 创建新缓存的情况。如果省略这个选项,那么选择⼀个与平台相关的默认值(通常是 16MB)。注意,⼀些操作系统设置可能会限制可分配的共享内存量,例如 Linux 上的 SHMMAX 通常设置为⼤-XX:PermSize=2048m    持久带堆的初始⼤⼩
-XX:MaxPermSize=2048M  持久带堆的最⼤⼤⼩、根据所需设置。如要编译jdk这种、因所编译的类⾮常多、⼀定要将该参数设置较⼤。
疑问解答
Q:-Xmn、-XX:NewSize/-XX:MaxNewSize、-XX:NewRatio 3组参数都可以影响年轻代的⼤⼩,混合使⽤的情况下,优先级是什么?
A:
⾼:-XX:NewSize/-XX:MaxNewSize
中:-Xmn
低:-XX:NewRatio
推荐使⽤-Xmn参数,原因是这个参数简洁,相当于⼀次设定 NewSize/MaxNewSIze,⽽且两者相等,适⽤于⽣产环境。-Xmn 配合 -Xms/-Xmx,即可将堆内存布局完成。
-Xmn参数是在JDK 1.4 开始⽀持。
Ⅱ、字节码验证优化
-Xverify:none(关闭Java字节码验证,从⽽加快了类装⼊的速度)
Ⅲ、预热⽅法的缓存
-XX:CompileThreshold=100  ⽅法调⽤多少次就会被编译成本地机器码
-XX:ParallelGCThreads=4    配置并⾏收集器的线程数,即:同时有多少个线程⼀起进⾏垃圾回收。此值建议配置与CPU数⽬相等。
Ⅳ、垃圾回收器选择
  JVM给出了3种选择:串⾏收集器、并⾏收集器、并发收集器。串⾏收集器只适⽤于⼩数据量的情况,所以⽣产环境的选择主要是并⾏收集器和并发收集器。
  默认情况下JDK5.0以前都是使⽤串⾏收集器,如果想使⽤其他收集器需要在启动时加⼊相应参数。JDK5.0以后,JVM会根据当前系统配置进⾏智能判断。
-XX:+DisableExplicitGC  禁⽤()的显⽰内存回收
-XX:+UseParNewGC      使⽤并发内存回收(年轻GC)、关注响应时间。注:另⼀个年轻GC为: -XX:+UseParallelGC  关注吞吐量
-XX:+UseConcMarkSweepGC
-XX:CMSInitiatingOccupancyFraction=80
点击显⽰详解
2.关闭所有的验证,validation,选择 disableal。只保留Classpath Dependency Validator 。
3.关闭拼写检查
拼写检查功能可以帮助您快速查代码中的拼写错误。检查时将扫描代码或代码中的选定区域,然后将其中的单词与其内置词典和⾃定义词典中的单词进⾏
⽐较。如果代码中出现了词典中没有的单词,将被视为拼写错误的单词。
⽐如,
你的⽅法名是单词的缩写,IDE会有提⽰,类似这种就是拼写检查。
⼀般没⽤,关掉即可。
4.关于要不要关闭Build AutoMatically的问题
1、⾃动编译:在菜单栏【Project】中到【Build AutoMatically】,选中该条⽬表⽰当你保存项⽬下的某个⽂件时,项⽬将会⾃动编译(只编译修改了的⽂件);如果没有选中,当你保存某个⽂件时,Eclipse将不会⾃动编译修改了的⽂件;有时候,如果电脑⽐较卡,可以先不勾选该条⽬,等调试的时候再打开,但是切记,⼀定别忘了,有时候你修改好了⼀个⽂件,启动Tomcat调试时,项⽬还是跑的⽼⽅法,这时候可能是新代码没有被编译,项⽬运⾏的还是⽼代码;
2、⼿动编译:在菜单来【Project】中到【Clean…】,这个Clean条⽬就是⼿动编译,个⼈感觉这个名字起得很不好,应该起名为Clean and Build;它不光是清理,⽽且会重新编译;如果项⽬⽐较⼤,⾃动编译很卡,很耗时,开发的时候可以关闭⾃动编译,使⽤的时候再⼿动编译;
建议不要关闭⾃动编译关了很⿇烦也不是 eclipse 卡的主要原因关了再写代码会很⿇烦,很难受,很不习惯
5.取消所有启动时要激活的插件(在⽤时激活也⼀样)和其它的相关的在启动时执⾏的操作
6.⼿动释放内存
在eclipse菜单栏,选择Window,看到最下⽅的preferences,点击选中,在弹出的选项框中,右边显⽰有三个勾选框,勾选第三个Show heap status,点击右下的Apply,点击确认后,在eclipse的右下⽅会出现eclipse堆内存使⽤情况的数据,也可以看到前⾯提到的Xms和Xmx参数值,并且旁边有个垃圾桶的图标,那是Garbage Collector,中⽂叫垃圾回收,是java⼀个优点,⾃动回收机制,释放内存。如果eclipse卡到想哭,可以⼿动点击那个垃圾桶图标释放内存。eclipse安装卡在绿条