当前位置: 首页 > news >正文

JVM学习笔记之终:MyEclipse调优

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    在将工作电脑的操作系统更换为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这两个区域,并且这两个区域的大小都在不断的调整中,所以决定先把它们的大小固定下来。

    于是调整后的参数如下:

-Xmx512m
-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的同学可根据自己的需要和实际情况进行适当的调整。

转载于:https://my.oschina.net/GameKing/blog/200469

相关文章:

  • 2014年北京高端网站建设怎样对待移动互联
  • Spring3系列10- Spring AOP——Pointcut,Advisor拦截指定方法
  • 使用升腾linux瘦客户机连接xendesktop实现USB KEY映射时,需要修改的文件。
  • 图解Team Foundation Server 2013系列
  • 制作 Windows 8.1 ADK 离线安装包
  • AsyncTask异步加载跟listview的结合
  • Raphael入门实例:动画与箭头
  • Activity加载模式
  • Ubuntu下Alt+Tab快捷键不能用解决办法
  • Google Scholar 论文参考文献的自动生成
  • discuz X2.5自己写代码,获取当前登录的用户信息
  • 通过搭建一个精简的C语言开发环境了解一个C程序的执行过程
  • 【javascript基础】系列
  • 产品需求文档的写作(一) – 写前准备(信息结构图)
  • 【Nodejs开发】第1章 述与环境搭建
  • 分享的文章《人生如棋》
  • 《Java8实战》-第四章读书笔记(引入流Stream)
  • 5、React组件事件详解
  • css的样式优先级
  • C语言笔记(第一章:C语言编程)
  • MySQL的数据类型
  • Sass 快速入门教程
  • vagrant 添加本地 box 安装 laravel homestead
  • 电商搜索引擎的架构设计和性能优化
  • 高度不固定时垂直居中
  • 函数式编程与面向对象编程[4]:Scala的类型关联Type Alias
  • 记一次删除Git记录中的大文件的过程
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 使用SAX解析XML
  • 写给高年级小学生看的《Bash 指南》
  • 函数计算新功能-----支持C#函数
  • ​用户画像从0到100的构建思路
  • # 计算机视觉入门
  • $.ajax中的eval及dataType
  • $.each()与$(selector).each()
  • (02)Cartographer源码无死角解析-(03) 新数据运行与地图保存、加载地图启动仅定位模式
  • (2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (java)关于Thread的挂起和恢复
  • (多级缓存)多级缓存
  • (转)iOS字体
  • (状压dp)uva 10817 Headmaster's Headache
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET/C# 使用反射注册事件
  • .netcore 如何获取系统中所有session_如何把百度推广中获取的线索(基木鱼,电话,百度商桥等)同步到企业微信或者企业CRM等企业营销系统中...
  • .NET与 java通用的3DES加密解密方法
  • :如何用SQL脚本保存存储过程返回的结果集
  • @JsonSerialize注解的使用
  • []我的函数库
  • [Android 13]Input系列--获取触摸窗口
  • [C#]C#学习笔记-CIL和动态程序集
  • [C++从入门到精通] 14.虚函数、纯虚函数和虚析构(virtual)
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [CTF]2022美团CTF WEB WP