本系列是用来记录《深入理解Java虚拟机》这本书的读书笔记。方便自己查看,也方便大家查阅。

欲速则不达,欲达则欲速!

这两天看了JVM的内存优化,决定尝试一下,对Eclipse进行内存调优。
本次使用的机器为64位Win10系统,虚拟机为Java HotSpot(TM) 64-Bit。硬件是台式联想电脑,Intel Pentium G630,8G物理内存。
一、Eclipse配置文件eclipse.ini

-startup
plugins/org.eclipse.equinox.launcher_www.shentuylzc.cn 1.4.0.v20161219-1356.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.www.tengyao3zc.cn win32.win32.x86_64_1.1.551.v20171108-1834
-product
org.eclipse.epp.package.www.xinyueylzc.cn  jee.product
-showsplash
org.eclipse.epp.package.www.huizhonggjpt.cn common
--launcher.defaultAction
openFile
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=www.lafei6d.cn  1.8
-Dosgi.instance.area.default=@user.home/eclipse-workspace
-XX:+UseG1GC
-XX:+UseStringDeduplication
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=1.8
-Xms256m
-Xmx1024m
--add-modules=ALL-SYSTEM
-Dcom.sun.management.jmxremote

初始设置指定了1.8版本的JDK,采用G1收集器,设置最大堆为1024M以及开启了JMX管理。

二、调优前的运行状况

写了个eclipse启动计时插件(将Jar包放到Eclipse的plugins目录下,启动Eclipse,可以显示Eclipse的启动时间),记录优化前的启动时间,为了保证测试结果的准确性,应该多次启动最后一次结果:

根据Visual GC和插件得到以上的信息截图,我们可以总结出原始配置下的启动状况:
1.整个启动耗时35秒。
2.垃圾收集总耗时1.126秒,其中Full GC 0 次,Minor GC 25 次,耗时1.126秒。
3.加载类19991个,共耗时38.131秒。
4.JIT编译时间为46.103秒(随着时间流逝,编译次数和时间不停增长)。
5.虚拟机1024MB的堆内存被分配为,新生代当前分配63M,老年代187M。
总的来说启动时间不算短,所以还是有可以调优的空间。

三、堆内存与Metaspace优化

打开VisualVM,直接查看内存曲线变化

从上图看,不管是Java堆的曲线变化还是Mwtaspace曲线变化,运作都完全正常。
暂时找不到可优化的条件。

四、编译时间和类加载时间的优化

看上图调优前的运行状况,编译时间和类加载时间应该是优化的重头戏了。

先看类加载时间。由于类加载需要进行字节码验证耗时,考虑到eclipse使用者众多,它的编译代码我们认为是可靠的,不需要加载的时候再进行字节码验证,因此通过参数-Xverify:none禁止掉字节码验证过程也可以认为是优化手段。

在取消掉字节码验证之后,确实可以看到Ecipse启动速度有了一定的提升,但仍还不够。
在类加载个数上,可以看出初始状况加载了19991个类,可以在eclipse中关掉不需要的启动项。

但是编译时间上目前没找到太好的办法~~~不知道怎么解决,希望有高人指点

五、调整内存,减少垃圾收集次数

上面说到了编译时间 类加载时间,那么剩下的就是GC时间了。
可以看出,此次Full GC被触发了 4 次,Minor GC 8 次。

此次GC次数并不算多,但是从监视器中可以看出,堆内存的使用不应该发生Full GC才对。
为了能够更好的看到eclipse启动期间所做的GC收集操作,我们加入配置-Xloggc:gc.log。

可以看出每次的Full GC 都是有Metadata GC Threshold造成的,也就是元空间引发的full GC。
从JDK8开始,永久代(PermGen)的概念被废弃掉了,取而代之的是一个称为Metaspace的存储空间。Metaspace使用的是本地内存,而不是堆内存,也就是说在默认情况下Metaspace的大小只与本地内存大小有关。每次Full GC,Metaspace都在调整阈值。因此,再加入-XX:MetaspaceSize=256M
但是仍可以看到每次发生的Minor GC都是有新生代内存不够所导致,因此,仍需提升配置
**-Xms2048m
-Xmx2048m
-Xmn512m**
本次调优完毕,只有3次Minor GC 耗时600毫秒。
但是启动时间仍需要27秒。。。。。。。。。灰常尴尬。
目测时间还是花费在了类加载与编译上。需要更加进一步的优化。最后,贴出本次调优后的最终eclipse.ini配置

-startup
plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar
--launcher.library
plugins/org.eclipse.equinox.launcher.www.baihua178.cn win32.win32.x86_64_1.1.551.v20171108-1834
-product
org.eclipse.epp.package.jee.product
-showsplash
org.eclipse.epp.package.common
--launcher.defaultAction
openFile
--launcher.defaultAction
openFile
--launcher.appendVmargs
-vmargs
-Dosgi.requiredJavaVersion=www.letianhuanchao.cn 1.8
-Dosgi.instance.area.default=@user.home/eclipse-workspace
--add-modules=ALL-SYSTEM
-Dosgi.requiredJavaVersion=1.8
--add-modules=ALL-SYSTEM

-Xms2048m
-Xmx2048m
-Xmn512m

-Dcom.sun.management.jmxremote
-Xverify:none
-Xloggc:gc.log
-XX:MetaspaceSize=256M 

相关博文:

素小暖讲JVM:第一章 走进Java,第二章 Java内存区域与内存溢出异常,第三章 垃圾收集器与内存分配策略

素小暖讲JVM:第四章 虚拟机性能监控与故障处理工具总结,第五章 调优案例分析与实战

素小暖讲JVM:第六章 类文件结构,第七章 类加载机制,第八章 字节码执行引擎

素小暖讲JVM:Eclipse运行速度调优的更多相关文章

  1. java jvm eclipse 性能调优

    低配配置 -Dfile.encoding=UTF-8-Xms960m-Xmx960m-Xmn384m-Xverify:none-Xss256k-XX:MaxTenuringThreshold=2-XX ...

  2. 【JVM.4】调优案例分析与实战

    之前已经介绍过处理Java虚拟机内存问题的知识与工具,在处理实际项目的问题时,除了知识与工具外,经验同样是一个很重要的因素.本章会介绍一些具有代表性的案例. 本章的内容推荐还是原文全篇看完的好,实在不 ...

  3. Java系列笔记(4) - JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之.通过学习,我觉得JVM ...

  4. JVM监控与调优

    目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     转:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html光说不练假把式,学习J ...

  5. [java] JVM监控与调优

    原文出处:http://www.cnblogs.com/zhguang/p/java-jvm-gc.html   光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分 ...

  6. Tomcat性能调优-JVM监控与调优

    参数设置 在Java虚拟机的参数中,有3种表示方法用"ps -ef |grep "java"命令,可以得到当前Java进程的所有启动参数和配置参数: 标准参数(-),所有 ...

  7. 【Eclipse】Eclipse性能调优

    Eclipse性能调优 eclipse 吃内存_百度搜索 eclipse 性能调优之内存分配 - Defonds 的专栏 - CSDN博客 优化JVM参数提高eclipse运行速度 - Java综合 ...

  8. 深入理解java:1.3.2 JVM监控与调优

    学习Java GC机制的目的是为了实用,也就是为了在JVM出现问题时分析原因并解决之. 本篇,来看看[ 如何监控和优化GC机制.] 通过学习,我觉得JVM监控与调优,主要在3个着眼点上: 1,如何配置 ...

  9. Java系列笔记(4) - JVM监控与调优【转】

    Java系列笔记(4) - JVM监控与调优[转]   目录 参数设置收集器搭配启动内存分配监控工具和方法调优方法调优实例     光说不练假把式,学习Java GC机制的目的是为了实用,也就是为了在 ...

随机推荐

  1. REST接口

    全名是Representational State Transfer REST是设计风格而不是标准 建议将JSON格式作为标准响应格式 -------------------------------- ...

  2. Python基础笔记:input()输入与数据类型转换

    input就是个万能输入,不过input输入的元素都是以str形式保存的,如果要他作为一个整数的话,就需要进行数据类型转换. input的使用 name=input('please input you ...

  3. Codeforces 176B 经典DP

    非常好的一个题目,CF上的DP都比较经典 题意就是 给定一个串A,B,正好执行K次操作,每次操作可以把 A串从中间切开,并调换两部分的位置,问最后得到B串共有多少种不同的切法(只要中间有一次不同,即视 ...

  4. SciKit-Learn 可视化数据:主成分分析(PCA)

    ## 保留版权所有,转帖注明出处 章节 SciKit-Learn 加载数据集 SciKit-Learn 数据集基本信息 SciKit-Learn 使用matplotlib可视化数据 SciKit-Le ...

  5. ES6中字符串的新增方法梳理

    1.String.fromCodePoint(); String,fromCodePoint()方法可以认为是对String.fromCharCode()方法的扩展,这两个方法的共同点在于都是用于Un ...

  6. UVA - 11892 ENimEN(博弈)

    题意:有n堆石子,两个人拿,拿走最后的石子的人赢,poopi先拿,条件是,每个人必须从另外一个人最后拿过的石子堆中取石子,若那堆石子被拿没了,才可以自由地拿其他堆.要求每次拿的石子数不能为0.问谁赢. ...

  7. Git - 版本管理 - 版本回退

    1 在历史里找到 SHA-1 的值 0c6ab03dbbfe61e39af92dfe5450bf693a72b7d9 2 命令行里执行:git reset --hard 0c6ab03dbbfe61e ...

  8. 2.7 app的本地化(根据手机的系统进行语言切换)

    首先设计一个基本的界面:系统默认为英文 如图所示: 找到如下路径: res/values/strings/strings.xml 如图所示: 然后点击右上方的open editor 添加需要的字符串如 ...

  9. 实验吧Web-易-简单的sql注入之3(报错的sql盲注之exp)

    题目提示是报错注入,于是就用盲注技巧来注入. 这里注入时发现floor,extractvalue,updatexml被吃掉了,用exp可以注入成功.(记住大小写绕过等技巧) 1.爆库 ' or exp ...

  10. 10 Json(unity3D)

    //写入json文档注意事项: 1.在Asset下要有一个StreamingAssets文件夹 2.在文件夹内,有一个已创建好的json空文档 3.引入命名空间 using Litjson; usin ...