JVM角度调试优化MyEclipse

在将工作电脑的操作系统更换为win7之后,我的MyEclipse的启动速度和运行速率一直很不理想。特别是在同时修改调试多个页面模板的时候,来回切换两个文件总是会卡个十来秒。试过关掉各种插件和验证也无济于事。于是在大致的研究完JVM后,决定从JVM的角度来试着解决这个问题。

启动优化:

首先来看下我的myeclipse.ini里面的默认启动参数:

-Xmx512m :设置堆内存最大值为512M
-XX:MaxPermSize=256m :设置持久代最大值为256m
-XX:ReservedCodeCacheSize=64m :设置代码占用的内存大小为64m

从启动参数上看不出什么,于是往里面加入打印内存变化相关参数:

-XX:+PrintGCTimeStamps : 打印每次GC的时间戳
-XX:+PrintGCDetails : 打印每次GC的详细信息
-Xloggc:myEclipseGC.log :将GC的记录输出到文件
-verbose:gc : 输出每次GC的相关情况

然后启动MyEclipse,然后查看myEclipseGC.log里面的信息:

启动耗时大概在30秒左右,选择性的截取一小部分日志,可以看到,在myeclipse启动的前10秒内,JVM总共执行了300多次的GC和9次的FULL GC。

从GC频率和信息可以看出内存的回收率很高,且大小在不断调整,这应该是由于年轻代的空间不足导致,需要设定一个不小的初始值。

然后来重点关注FULL GC:

代码如下:

5.961: [Full GC 5.961: [Tenured: 34568K->34456K(49676K), 0.1397651 secs] 35336K->34456K(53452K), [Perm : 26623K->26458K(26624K)], 0.1398562 secs] [Times: user=0.14 sys=0.00, real=0.14 secs]
9.030: [Full GC 9.030: [Tenured: 53310K->52332K(64588K), 0.2034757 secs] 56020K->52332K(69516K), [Perm : 43007K->42996K(43008K)], 0.2036030 secs] [Times: user=0.20 sys=0.00, real=0.20 secs]

从两次日志的对比中可以看到,FULL GC主要是在回收Tenured和Perm这两个区域,并且这两个区域的大小都在不断的调整中,所以决定先把它们的大小固定下来。

于是调整后的参数如下:

-Xms512m :设定堆的最小值为512m
-Xmn192m : 设定年轻代的大小为192m
-XX:PermSize=192m : 设定持久代的初始值为192m
-XX:MaxPermSize=192m
-XX:ReservedCodeCacheSize=64m
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
-Xloggc:myEclipseGC.log
-verbose:gc

重新启动一次MyEclipse,查看日志信息:

启动耗时12秒左右,从日志可以看出,在前10秒内总共只进行了5次GC,不涉及各区域大小的调整,这个结果还是可以接受的,因为工作时不怎么需要频繁重启。

工作响应速度优化:

接下来研究困扰了我很久的来回切换html文件时的经常性延时和大卡问题,为了更直观的研究JVM的内存变化,决定借助jconsole这个java自带的辅助工具。先把myeclipse.ini的参数还原,避免被第一阶段的优化干扰。

启动myeclipse,启动jconsole并接入myeclipse所在的JVM,稳定后的整个堆的内存图如下:

接下来试着打开几个模板,然后观察内存的变化。

首先是堆内存的整体使用情况:

可以看到,在打开了几个模板之后,堆内存的使用从原先的100M以下突增至300M以上。使用量增加了三倍,但是还在我设置的512M范围之内。所以可以暂时不考虑继续增加堆内存,转而考虑调整各区内存大小比例问题。

于是观察下各个区在这段时间的内存使用情况,其中,Eden区如下:

Eden区在这段时间的内存使用率大增,且发生了多次GC。通过底下的监控信息可以知道,eden区在默认情况下只分配了31M的最大内存,这显然是不够用的。稍微执行点操作都会触发eden区的GC,这应该是模板打开切换发生延时卡顿的原因之一,需要调整。

接下来是Tenured区:

JVM默认给这个区域分配的最大空间是470M。随着内存使用的变化,这个区域的实际大小一直在调整,每次区域大小的调整都会发生FULL GC,这应该是经常性大卡的原因之一。而新模板的打开是触发这种调整的主要原因。从这个区域内存的使用上来看,将这个区域的内存空间维持并固定在450M左右,保持一定的冗余还是有必要的。

从这点来看,jvm的堆内存还是有必要稍微扩充下以维持一个较大的Tenured区和Eden区。

最后来看下perm区:

作为方法区的一部分,这个区域的内存变化并不大,并且比较稳定,本来不需要留太多的冗余。但是考虑到当前打开的工程实际代码量并不大,决定暂时维持在128M左右,日后慢慢调整。

于是根据上面的分析将参数调整为:

-Xmx768m
-Xms768m
-Xmn256m
-XX:PermSize=192m
-XX:MaxPermSize=192m
-XX:ReservedCodeCacheSize=64m

重启myeclipse,接入Jconsole,同时打开三十来个模板做了下测试。在观查各个区的内存使用率时发现一个问题,在将年轻代调整为256M以后,由于Eden不再频繁的发生GC,进入 Tenured区的数据量明显减少 ,Tenured区的内存使用图如下:

如上图,在特意打开很多模板的情况下,450M+的空间只使用了不到250M,空间利用率太低,需再做调整。

总结

以上是我对自己的myeclipse进行调优的一些思路和实际调优的过程,在实际使用中又根据自己的喜好进行了一些调整定制,最终形成的myeclipse.ini的参数如下:

-vmargs
-Xmx512m
-Xms512m
-Xmn192m
-XX:PermSize=128m
-XX:MaxPermSize=128m
-XX:ReservedCodeCacheSize=64m

在这个参数设置下,myeclipse的响应速度比较有保证,各种延时卡顿的现象的出现频率大大降低。缺点是常驻的占用的系统内存偏高,喜欢同时打开多个myeclipse的同学可根据自己的需要和实际情况进行适当的调整。

以上就是本文的全部内容,希望能够对大家的学习有所帮助。

(0)

相关推荐

  • myeclipse8.5优化技巧详解

    还在为自己的配置低而抛弃MyEclipse8.5?还在为那低下的速度而苦恼吗?下面我们看看myeclipse8.5优化技巧的具体方法. 取消自动validation validation有一堆,什么xml.jsp.jsf.js等等,我们没有必要全部都去自动校验一下,只是需要的时候才会手工校验一下! 取消方法: windows–>perferences–>myeclipse–>validation 除开Manual下面的复选框全部选中之外,其他全部不选 手工验证方法: 在要验证的文件上,单

  • JVM角度调试优化MyEclipse

    在将工作电脑的操作系统更换为win7之后,我的MyEclipse的启动速度和运行速率一直很不理想.特别是在同时修改调试多个页面模板的时候,来回切换两个文件总是会卡个十来秒.试过关掉各种插件和验证也无济于事.于是在大致的研究完JVM后,决定从JVM的角度来试着解决这个问题. 启动优化: 首先来看下我的myeclipse.ini里面的默认启动参数: -Xmx512m :设置堆内存最大值为512M -XX:MaxPermSize=256m :设置持久代最大值为256m -XX:ReservedCode

  • 解析Android开发优化之:从代码角度进行优化的技巧

    通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.下面我们就从几个方面来了解Android开发过程中的代码优化. 1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意.静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁.所以,一般情况下,静态变量

  • 如何通过JVM角度谈谈Java的clone操作

    前言 最近在给熔断器组件增加一个降级策略(Hystrix好像没有这个配置),我们提供了如下几种策略: 1.默认策略 2.返回常量值 3.抛出指定异常 4.执行一段groovy脚本 当然了,这些配置都是可以在平台上配置,并立即生效的. 目前返回常量值的实现如下: 今天发现,如果每次都返回同一个对象,而且这个逻辑对业务来说是黑盒(业务不知道每次拿到的对象是同一个),如果对这个对象进行了操作,那肯定会影响到其它的请求,为了避免背锅,我们需要每次返回一个新的对象,第一反应是通过clone是否可行(因为每

  • eclipse修改jvm参数调优方法(2种)

    本文介绍了eclipse修改jvm参数调优方法(2种),分享给大家,具体如下: 一般在不对eclipse进行相关设置的时候,使用eclipse总是会觉得启动好慢,用起来好卡,其实只要对eclipse的相关参数进行一些配置,就会有很大的改善. 有两种方法: 1.打开eclipse配置文件eclipse.ini,更改把-Xmx(其数值代表jvm可以使用的最大内存数) 2.  运行java程序时,选择run->run configuration->arguments,输入-Xms100M -Xmx8

  • java自旋锁和JVM对锁的优化详解

    目录 背景 好处 AtomicLong的实现 getAndIncrement方法 实验 缺点 适用场景 JVM对锁做了哪些优化? 自适应的自旋锁 锁消除 锁粗化 偏向锁/ 轻量级锁/ 重量级锁 锁升级 背景 先上图 由此可见,非自旋锁如果拿不到锁会把线程阻塞,直到被唤醒: 自旋锁拿不到锁会一直尝试 为什么要这样? 好处 阻塞和唤醒线程都是需要高昂的开销的,如果同步代码块中的内容不复杂,那么可能转换线程带来的开销比实际业务代码执行的开销还要大. 在很多场景下,可能我们的同步代码块的内容并不多,所以

  • 关于Java多线程编程锁优化的深入学习

    正文 并发环境下进行编程时,需要使用锁机制来同步多线程间的操作,保证共享资源的互斥访问.加锁会带来性能上的损坏,似乎是众所周知的事情.然而,加锁本身不会带来多少的性能消耗,性能主要是在线程的获取锁的过程.如果只有一个线程竞争锁,此时并不存在多线程竞争的情况,那么JVM会进行优化,那么这时加锁带来的性能消耗基本可以忽略.因此,规范加锁的操作,优化锁的使用方法,避免不必要的线程竞争,不仅可以提高程序性能,也能避免不规范加锁可能造成线程死锁问题,提高程序健壮性.下面阐述几种锁优化的思路. 一.尽量不要

  • idea远程调试spark的步骤讲解

    spark 远端调试 本地调试远端集群运行的spark项目,当spark项目在集群上报错,但是本地又查不出问题时,最好的方式就是调试一步一步跟踪代码.但是在集群上的代码又不能像本地一样的调试.那么就试试这个调试方法吧. 远程调试spark其实就四步: * 第一步jar包拷贝到集群master节点. * 第二步在 idea 中配置远程机器的IP 和调试端口号. * 第三步:启动远端的spark项目. * 第四步 启动idea 进行调试. 首先 首先了解jvm一些参数属性 -Xdebug -Xrun

  • java进行远程部署与调试及原理详解

    这篇文章主要介绍了java进行远程部署与调试及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 远程调试,特别是当你在本地开发的时候,你需要调试服务器上的程序时,远程调试就显得非常有用. JAVA 支持调试功能,本身提供了一个简单的调试工具JDB,支持设置断点及线程级的调试同时,不同的JVM通过接口的协议联系,本地的Java文件在远程JVM建立联系和通信.此篇是Intellij IDEA远程调试的教程汇总和原理解释,知其然而又知其所以然.

  • JVM系列之:JIT中的Virtual Call接口操作

    简介 上一篇文章我们讲解了Virtual Call的定义并举例分析了Virtual Call在父类和子类中的优化. JIT对类可以进行优化,那么对于interface可不可以做同样的优化么? 一起来看看吧. 最常用的接口List List应该是大家最最常用的接口了,我想这个大家应该不会反驳. public interface List<E> extends Collection<E> { 今天我们就拿List来做例子,体验一下JIT优化接口的奥秘. 还是上代码,要分析的代码如下:

随机推荐