• 1. 内部培训资料Jprofiler内存监控及系统调优李元乾
  • 2. 内存监控目的1.发现内存泄露 2.发现主要占用内存的数据 3.帮助修正代码结构,系统结构,提高 系统的运行效率 Jprofiler内存监控及系统调优
  • 3. Jprofiler简介 Jprofiler: JVM监控工具,可很好的监视CPU、线程和内存 可与Eclipse进行整合,也可单独监控某一进程 可监控远程计算机上的进程 观察每个对象的生存情况,提升模块性能 可观察GC情况、CPU使用情况、堆使用情况等
  • 4. Jprofiler使用界面
  • 5. 安装程序存放路径:ftp://192.168.9.8/新员工学习输出/平台/李元乾 文件:jprofiler_windows_6_0_2.exe现有可用key: L-Larry_Lau@163.com#78484-akisfpr22a5j#268 L-Larry_Lau@163.com#85756-laf1m81o8l0am#03510 L-Larry_Lau@163.com#54329-1okktf1zoaw6#340 L-Larry_Lau@163.com#2308-rawrdt14n3yp8#0331 L-Larry_Lau@163.com#95931-19bzzha12jyss4#433Jprofiler安装
  • 6. Jprofiler安装注: 一个key在局域网中只能同时使用一个,否则会把前一个使用的成员强行中断 建议每个组分配一个key,因为组内同时使用Jprofiler进行调优的概率较低。可防止在使用中被踢下去造成的工作进度损失
  • 7. Jprofiler配置(应用程序)开启Jprofiler会弹出上述菜单,选择application项 (也可以在StartCenter中创建一个新项目)
  • 8. Jprofiler配置(应用程序)选择Generic application项
  • 9. Jprofiler配置(应用程序)选择On this computer项
  • 10. Jprofiler配置(应用程序)选择JVM的厂家及版本。我们可以选择Sun公司的1.6.0 JVM版本
  • 11. Jprofiler配置(应用程序)第一项:程序等待Jprofiler监控开始在开始运行 第二项:程序立即启动(通常选择) 第三项:离线模式,生成记录文件(一般不用)
  • 12. Jprofiler配置(应用程序)选择监控端口,一般采用默认的8849。 注:若需要监控两个程序,需要修改监控端口
  • 13. Jprofiler配置(应用程序) 得到配置命令行
  • 14. Jprofiler配置(应用程序)这一步比较重要 拷贝上文中的配置字符串-agentpath:C:\PROGRA~1\JPROFI~1\bin\windows\jprofilerti.dll=port=8849例如我们想监控NNM5的服务器端,需要在NMS\PLATFORM\NNM5\server\run.xml中加入上述字符串,如下图所示
  • 15. Jprofiler配置(应用程序)
  • 16. Jprofiler配置(应用程序)经过上述步骤,Jprofiler在应用程序上的配置就完成了。我们可以开启应用程序及Jprofiler,进入监控界面:
  • 17. Jprofiler配置(Eclipse)Jprofiler可以作为插件,在Eclipse中配置使用,免去的配置的繁琐性。如右图所示,选择主菜单,Session项,选择IDE Integrations 项
  • 18. Jprofiler配置(Eclipse)选择 Eclipse 3.5 (经测试,如版本为Eclipse 3.6,选择3.5也可集成 ),点击出现的按钮”Integrate”
  • 19. Jprofiler配置(Eclipse)打开Eclipse,点击windows--customize perspective—Command Group Availability 在列表中将Profile这一项前面打勾
  • 20. Jprofiler配置(Eclipse)经过如上配置,就将Jprofiler同Eclipse集成完毕了,我们可以通过界面上的标志进行调用(配置参数同debug configuration中) 各种需要的参数Jprofiler都会自动生成
  • 21. Jprofiler基本使用Jprofiler基本使用主要涉及以下几个界面: Memory View界面:最经常使用,用于观察系统内存具体情况——实例化的类数量、大小、引用关系 Thread View界面:线程界面,用于监控线程的数量、每个线程的具体运行状态及线程的引用模块 VM Telemetry View界面:显示系统总体运行情况,包括堆视图、非堆视图、CPU、线程数、GC情况、记录类生成情况、类总数等内容
  • 22. Memory View界面
  • 23. Thread View界面
  • 24. VM Telemetry View界面
  • 25. 性能测试NNM5系统性能测试主要问题: 内存泄露 内存占用过大,响应速率慢 线程数不断增加,出现死锁或空闲线程 某些工具类实例化数目过多,占用多余的内存空间
  • 26. 性能测试——内存泄露内存泄露 出现情况: 应用第三方框架时,未调用某些类或方法的释放方法。 例:拓扑模块中,com.raisecom.nms.topo.client.core.view.ui.TopoViewRefreshTimerTask。该方法未调用释放方法,导致内存出现持续性上涨。
  • 27. 性能测试——内存泄露内存泄露 出现情况: ResultSet未释放。 例:在平台的模块中,有将ResultSet作为方法返回值进行返回的情况。在这种情况中,调用该方法的方法未进行ResultSet的释放,就可能会造成ResultSet长期存在的情况。建议不将其作为返回值返回,在需要返回的情况下将数据读出,转移到集合类中返回。
  • 28. 性能测试——内存泄露内存泄露 检验方式: 内存泄露需要进行时长测试,既将监控界面及系统界面全部打开,进行长时间运行(如12小时),观察系统类的增长情况。 如果在Jprofiler的视图中,有如下两种情况出现,可以基本判定为内存泄露:
  • 29. 性能测试——内存泄露1.如上文所示,堆视图: 打开方式:Jprofiler,VM Telemetry View 界面 Memory 标签页,Heap选项
  • 30. 性能测试——内存泄露2.打开Jprofiler的Memory views界面(初始界面) 打开Recorded Object标签,在界面上点击右键菜单,选择 Mark current values(记录当前值),经过时长测试, 出现较大规模的红色部分(增长部分),且无法GC
  • 31. 性能测试——系统内存占用大系统内存占用大 检验方式: 进行某些特定的操作,如资源同步。若系统内存数突发性的增长,且之后不回落,说明某些模块在持续性的占用系统资源。 若出现以下现象,可定位系统内存占用问题:
  • 32. 性能测试——系统内存占用大同上,选择 Mark current values(记录当前值),经过系统模块测试,出现较大规模的红色部分(增长部分),且无法GC(非始终增加)
  • 33. 性能测试——系统内存占用大堆视图如下:有增长,无法回落,但并非持续性增长
  • 34. 性能测试——系统内存占用大测试实例: MibNodes节点问题,如上文图中所示。 SNMP模块在缓存MibNode节点信息是,将所有的值长期持有在HashTable中 随着设备发现及同步的进行,该类的数量出现大规模增加,并且在系统退出之前不会进行释放 解决方案: 编写缓存,将这种规模的数据进行了缓存及释放
  • 35. 性能测试——线程数过多线程数过多 检验方式: 进行某些特定的操作,如资源同步。若系统线程数突发性的增长或持续增长,且之后不回落,说明某些模块在持续性的占用线程。 观察是否有许多线程来自同一个模块、长期处于waiting或block状态 观察如下视图:
  • 36. 性能测试——线程数过多Thread Views 界面 Thread History标签 Thread Views 界面 Thread Monitor标签
  • 37. 性能测试——线程数过多测试实例: 资源模型缓存问题 资源模型缓存在使用线程时,采用了自建线程的方式,在某个线程锁上发生了阻塞,导致系统线程数居高不下 解决方案: 检验代码,修正发生阻塞的地方。 建议以后的模块在有类似的需求是,采用线程池的方式
  • 38. 性能测试——工具类实例化多工具类实例化多: 某些工具类未采用static方式,但系统实例化地方较多,导致实例化出来的类数量很多 该问题会浪费实例化时间以及空间 检验方式: Memory Views界面,Record Object 标签 观察类的实例化数量。如果某个NNM5系统类实例化数量较大,可观察代码,是否为工具类
  • 39. 性能测试——内存泄露如下图所示:这一系列的实例化数都较多
  • 40. 性能测试——内存泄露如下图所示:一般的工具类实例化数都为1
  • 41. 性能测试——线程数过多测试实例: 告警映射生成类问题 如上图所示,在对NNM5系统压力的一期测试中,发现告警映射的类有大量生成问题(量级约为万) 经阅读代码,其中的某些类中没有成员变量,应为工具类型的类 建议阅读相关代码,进行修改
  • 42. 其他的内存监控工具如果电脑上安装了JDK1.6以上的版本,可以使用Java自带的一个快捷内存监控工具: jvisualvm 其路径为: Java安装目录\ Java\jdk1.6.0_25\bin\ jvisualvm.exe 该软件可进行内存、线程及cpu的相关监控,其使用界面较为简洁。
  • 43. 内存调优方向健康系统内存表现: 不出现内存泄露 不会出现频繁的GC 是否出现频繁实例化对象 每次GC之后,Heap中的剩余内存量最好占Heap上限值的35%—50%左右,且不出现迅速的增长 GC不会消耗太多的时间,最好在0.5s以下(可通过 –XX:+PrintGCDetails查看GC细节) 线程数量适当
  • 44. 内存调优方向——推荐文档选择合适的GC算法: –XX:+UseSerialGC Serial –XX:+UseParallelGC Parallel –XX:+UseParallelOldGC Parallel compacting –XX:+UseConcMarkSweepGC Concurrent mark–sweep (CMS) 调整Heap中Young Generation的大小 调整Heap中Old Generation的大小 –XX:NewRatio=n 调整GC在整个程序运行期间的时间比重 –XX:GCTimeRatio=n 其他
  • 45. 内存调优方向——推荐文档Sun 公司出的官方文档: Memory Management in the Java Hotspot™ Virtual Machine该文档包含了: Sun公司对GC机制的官方解释 4种垃圾回收机制的区别和联系 几乎所有-x系列Jvm指令
  • 46. 内存调优方向——推荐文档
  • 47. 结束谢谢!