调优我的Eclipse

        通过学习之后,决定尝试一次真正意义上的Java调优,于是就开始从自己的Eclipse开始。 准备环境 首先是准备环境使用的是JDK自带的JVM监控插件,一般是在JDK文件夹下的bin目录下,jvisualVM.运行的时候直接./jvisualVM就行,windows下应该是直接点击运行。然后再添加ViualGC插件进行查看Java内存的分配情况。 为了了解我的调优结果,需要知道Eclipse的启动时间,但是Eclipse自己没有类似功能,于是自己写了一个Eclipse的插件,用来记录Eclipse的启动时间。 插件的运行效果: 监视器的运行效果:           进行第一步的分析 按照我的插件的提示,还有监视器的数据,我们可以知道,我的Eclipse在启动的时候一共消耗了22.2秒的时间, 按照我的上一张监视器的图片,我们可以看到,在Eden区域内,总共进行了17次的垃圾回收消耗了377ms,在Old区域也进行了2次回收消耗了361ms,然后进行JIT编译消耗了26.809秒,在加载class的时候消耗了15秒, 而且在Eclipse开启的时候,JVM为Eden分配了170.5MB内存,两个Survivor区分配了56.875MB,永久态分配了256MB,老年态则被分配了341MB。 由于启动时间的大头之一JIT编译时间上,所以可行的办法并不多,只能从JVM入手,一般可选的方案是更新JVM来更新JIT的,但是本机上我只有JDK1.7,所以这个方面不进行优化。 还有一个地方在类加载,这个地方需要扯到Java的字节码验证,所以我决定采用激进的办法去优化,就是去掉验证字节码过程,因为Eclipse在我电脑上已经多次运行无错,所以我认为字节码已经正确,无需验证。 接着就是内存的调优,因为在我的电脑上,内存的GC并不严重,加起来不到1s的时间,但是从内存的分配上,我发现由于系统没有设置最小值,导致了很多次的扩展,这消耗了一部分的时间,所以我可以从设置最小内存下限的办法减小扩展次数。 结果 取消类加载时的字节码验证,方法很简单,就是在Eclipse的配置文件中加上-Xverify:none,修改之后的效果如下: 发现Eclipse在加载类上所花的时间大概快了500ms,多次测试之后,发现确实是500ms+-60ms之间,所以加载速度还是的到了提高。总时间也下降到了21.9s。 接下来就是内存的调优了,根据这几张数据,可以看到最后的内存稳定在,perm:155MB,old:133MB,Eden:76MB,我开始尝试直接在perm处申请128MB内存,避免频繁的扩充,结果是: 类加载的时间明显的下降,但是128m并不是最终值,最终是99MB,但是依旧伴随这一次扩容,因为perm容纳了过80%的类,所以扩容,接于此,我将128增加到200MB,事实证明,提高不是那么明显。。。接着开始处理Old和Eden的GC问题。也是提高Old的容量,将Old的初始容量设置为256之后,我们发现,在Old区域内,已经不会产生收集动作。数据: 然后想通过增加Eden部分来减少该部分的垃圾回收操作,但是在我的电脑上,传统的-Xmn参数是报错的,所以这个暂时先不进行。…

阿里笔试之行收获

本来想22号考完就写的,结果一直拖到现在。 阿里的题目还是很基础的,比如说Java附加题的第一题,要求写出程序的运行结果、 本来一看还是蛮开心的,因为构造块和静态块我都知道,但是又一看呆了。。。 我不知道静态块的运行顺序。所以只好瞎猜了。。 Java 类的初始化顺序 规则1:在类第一次加载的时候,将会进行静态域的初始化: 1. 将所有的静态数据域初始化为默认值(0、false 和 null) 2. 按照在类中定义的顺序依次执行静态初始化语句和静态初始化块 规则2:调用构造器的具体处理步骤: 1. 将所有的数据域初始化为默认值(0、false 和 null) 2. 按照在类中定义的顺序依次执行初始化语句和初始化块…

学习MarkDown语法(2)

列表 Markdown 支持有序列表和无序列表。 无序列表使用星号、加号或是减号作为列表标记:     * Red     * Green     * Blue 等同于:     + Red     + Green     + Blue 也等同于:     – Red…