我是如何让Eclipse的启动速度提升1.5秒的

本文介绍了如何通过调整Eclipse的JVM参数,将Eclipse的启动时间从5953ms优化到4693ms,提升了21%的效率。主要通过禁用类加载验证、更改垃圾收集器组合以及调整堆内存大小来实现。调优过程包括分析启动时间、选择合适的垃圾收集器和优化类加载时间。
摘要由CSDN通过智能技术生成

本文是Effective Java专栏Java虚拟机专题的第十讲,如果你觉得看完之后对你有所帮助,欢迎订阅本专栏,也欢迎您将本专栏分享给你身边的工程师同学。

前言

在这之前,我写过一篇文章 —— 关于Java虚拟机性能调优的清单,文章里我梳理了JVM调优的所需理论知识和常用工具清单,今天就让我们使用这份清单,进行一次JVM的调优实战!

我为什么选择Eclipse来调优

虽然IntelliJ IDEA的风头似乎已经盖过了Eclipse,但由于工作的原因,在大多数时候我还是使用Eclipse作为开发工具,我想现在使用Eclipse的程序员也一定很多。

那么,正在使用或者曾经使用过Eclipse的你,有没有想过:

  • Eclipse是采用什么垃圾收集器?
  • 启动的时候,都执行了多少次GC?
  • 能不能对Eclipse的启动速度进行调优?

这篇文章,介绍一下我是如何对Eclipse进行调优,使得它的启动速度提升了1.5秒的。

你可能会说,才1.5秒,需要说的是,笔者的电脑性能比较牛,优化前启动Eclipse只需要5953ms,优化结束后是4693ms,提升了21%的速度,这就像百米赛跑,第一名的博尔特和最后一名的差了不到1秒钟,但已经完全是不同的境界了!

下面让我们开始提速吧!

环境信息

调优前的启动速度

为了方便计算Eclipse的启动速度,这里使用了周志明老师写的一个Eclipse插件,该插件可以在Eclipse启动完成后,计算当前时间和Eclipse开始启动时间直接的间隔,然后在界面上打印出总的启动时间,就像这样:

这里写图片描述

插件下载地址:华章图书 - 深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)
下载里面的教辅源代码,插件在第五章的源代码中。

笔者一开始的eclipse.ini配置是这样的:

-vm
C:/Program Files/Java/jdk1.7.0_51/bin/javaw.exe
-startup
plugins/org.eclipse.equinox.launcher_1.3.0.v20130327-1440.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.win32.win32.x86_64_1.1.200.v20130521-0416
-product
org.eclipse.epp.package.standard.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
128M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
128M
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=1.6
-Xms40m
-Xmx128M

配置里面主要是指定了使用JDK7,初始堆大小(-Xms)是40m,最大堆(-Xmx)是128m.
接着,笔者启动了三次Eclipse,三次的启动时间分别是5960ms、5945ms、5954ms,取平均值之后,调优前的启动时间是5953ms.
同时笔者通过使用Visual VM,记录了调优前虚拟机的运行状况:

这里写图片描述

从Visual VM的监控信息看,启动时间主要有三大块:编译时间类加载时间以及垃圾回收的停顿时间
其中,编译时间是指JVM的JIT编译,笔者是64位的机器,只能采用server模式,因此在即时编译上没有什么优化的余地。

关于JIT编译器、server模式和client模式,可以参考 解释执行和即时编译器

因此,下面主要对耗时3.468秒的类加载时间,以及新生代(Eden Space)总耗时107ms的13次GC和老年代(Old Gen)总耗时156ms的Full GC,进行调优。

类加载时间调优

JVM的类加载,是指将Class文件,加载到虚拟机中。类加载的过程,包括加载、验证、准备、解析、使用、卸载等阶段。

其中验证,是由于Class文件不全都是由Java源码编译而来,Class文件可以使用任何途径产生,甚至可以直接使用十六进制编辑器来编写。因此虚拟机要对Class文件进行验证。而对于Eclipse来说,虚拟机要加载的文件,基本都是我们自己编写的源码,是值得信任的,因此,可以加入参数-Xverify:none将类加载时的验证阶段去掉。

去掉之后,再来看Visual VM里的类加载时间,可以看到类加载时间一下子下降到2s:

这里写图片描述

同样的,再来启动三次Eclipse,时间分别是4687ms、4700ms、4695ms,取平均值,去掉验证阶段后的Eclipse的启动时间为4694ms

垃圾收集的时间调优

再来对垃圾收集进行调优,首先,我们打印一下GC日志,来看看现在Eclipse采用的是什么垃圾收集器,在eclipse.ini中加入:

-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:gc.log

启动后查看gc.log:

0.373: [GC [PSYoungGen: 10752K->1528K(12288K)] 10752K->2853K(39936K), 0.0087200 secs] [Times: user=0.05 sys=0.01, real=0.01 secs] 
0.641: [GC [PSYoungGen: 12280K->1512K(23040K)] 13605K->5449K(50688K), 0.0053889 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
1.205: [GC [PSYoungGen: 23016K->1522K(23040K)] 26953K->13258K(50688K), 0.0089067 secs] [Times: user=0.00 sys=0.00, real=0.01 secs] 
1.667: [GC [PSYoungGen: 23026K->1515K(42496K)] 34762K->16585K(70144K), 0.0061016 secs] [Times: user=0.00 sys=0.02, real=0.01 secs] 
1.809: [GC [PSYoungGen: 42475K->1515K(42496K)] 57545K->16937K(70144K), 0.0049001 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 
2.372: [GC [PSYoungGen: 42475K->1528K(23040K)] 57897K->24396K(50688K), 0.0109632 secs] [Times: user=0.05 sys=0.02, real=0.01 secs] 
2.383: [Full GC [PSYoungGen: 1528K->0K(23040K)] [ParOldGen: 22868K->22517K(51200K)] 24396K->22517K(74240K) [PSPermGen: 23460K->23448K(47104K)], 0.1348976 secs] [Times: user=0.38 sys=0.00, real=0.13 secs] 
2.970: [GC [PSYoungGen: 21504K->8905
提高 JAVA IDE 的性能的JVM开关 Submitted by 小天蝎 on 2005, August 18, 2:45 PM. integration 我的本本是p4 1.8G的dell c640 内存1G,eclipse 3.1 + myeclipse 4.0m2 速度还不错。 运行参数如下:eclipse.exe -vmargs -Xverify:none -XX:+UseParallelGC -XX:PermSize=20M -------------- JVM 提供了各种用于调整内存分配和垃圾回收行为的标准开关和非标准开关。其中一些设置可以提高 JAVA IDE 的性能。 注意,由于 -X (尤其是 -XX JVM)开关通常是 JVMJVM 供应商特定的,本部分介绍的开关可用于 Sun Microsystems J2SE 1.4.2。 以下设置在大多数系统上将产生比工厂更好的设置性能。 -vmargs - 表示将后面的所有参数直接传递到所指示的 Java VM。 -Xverify:none - 此开关关闭Java字节码验证,从而加快了类装入的速度,并使得在仅为验证目的而启动的过程中无需装入类。此开关缩短了启动时间,因此没有理由不使用它。 -Xms24m - 此设置指示 Java 虚拟机将其初始堆大小设置为 24 MB。通过指示 JVM 最初应分配给堆的内存数量,可以使 JVM 不必在 IDE 占用较多内存时增加堆大小。 -Xmx96m - 此设置指定 Java 虚拟机应对堆使用的最大内存数量。为此数量设置上限表示 Java 进程消耗的内存数量不得超过可用的物理内存数量。对于具有更多内存的系统可以增加此限制,96 MB 设置有助于确保 IDE 在内存量为 128MB 到 256MB 的系统上能够可靠地执行操作。注意:不要将该值设置为接近或大于系统的物理内存量,否则将在主要回收过程中导致频繁的交换操作。 -XX:PermSize=20m - 此 JVM 开关不仅功能更为强大,而且能够缩短启动时间。该设置用于调整内存"永久区域"(类保存在该区域中)的大小。因此我们向 JVM 提示它将需要的内存量。该设置消除了许多系统启动过程中的主要垃圾收集事件。SunONE Studio 或其它包含更多模块的 IDE 的用户可能希望将该数值设置得更高。 下面列出了其它一些可能对 ECLIPSE 在某些系统(不是所有系统)上的性能产生轻微或明显影响的 JVM 开关。尽管使用它们会产生一定的影响,但仍值得一试。 -XX:CompileThreshold=100 - 此开关将降低启动速度,原因是与不使用此开关相比,HotSpot 能够更快地将更多的方法编译为本地代码。其结果是提高了 IDE 运行时的性能,这是因为更多的 UI 代码将被编译而不是被解释。该值表示方法在被编译前必须被调用的次数。 -XX:+UseConcMarkSweepGC -XX:+UseParNewGC - 如果垃圾回收频繁中断,则请尝试使用这些开关。此开关导致 JVM 对主要垃圾回收事件(如果在多处理器工作站上运行,则也适用于次要回收事件)使用不同的算法,这些算法不会影响整个垃圾回收进程。注意:目前尚不确定此收集器是提高还是降低单处理器计算机的性能。 -XX:+UseParallelGC - 某些测试表明,至少在内存配置相当良好的单处理器系统中,使用此回收算法可以将次要垃圾回收的持续时间减半。注意,这是一个矛盾的问题,事实上此回收器主要适用于具有千兆字节堆的多处理器。尚无可用数据表明它对主要垃圾回收的影响。注意:此回收器与 -XX:+UseConcMarkSweepGC 是互斥的。=====================================================================================================================建议启动参数:c:\eclipse\eclipse.exe -vmargs -Xverify:none -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值