`
xinklabi
  • 浏览: 1591392 次
  • 性别: Icon_minigender_1
  • 来自: 吉林
文章分类
社区版块
存档分类
最新评论

一同事为中间件处理内存泄漏问题的解决方案(调整JVM参数)

 
阅读更多
author: li guangju @ HT
今天外汇交易中心的out of memory error的问题基本解决,截止到下班为止,测试环境系统运行稳定,没有出现问题。

(1).这两天观察到的问题主要是JVM配置不当的问题,已基本解决。
在处理JVM配置之前,测试环境初始的JVM配置参数为:
-Xms768m -Xmx768m
JVM某一时刻的heap情况如下(其他时刻也跟此基本一致):
Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 805306368 (768.0MB)
   NewSize          = 2686976 (2.5625MB)
   MaxNewSize       = -65536 (-0.0625MB)
   OldSize          = 1835008 (1.75MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 88080384 (84.0MB)
 
Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 241631232 (230.4375MB)
   used     = 92984096 (88.67654418945312MB)
   free     = 148647136 (141.76095581054688MB)
   38.48182009848793% used
Eden Space:
   capacity = 214827008 (204.875MB)
   used     = 92607000 (88.3169174194336MB)
   free     = 122220008 (116.5580825805664MB)
   43.10770831943067% used
From Space:
   capacity = 26804224 (25.5625MB)
   used     = 377096 (0.35962677001953125MB)
   free     = 26427128 (25.20287322998047MB)
   1.406852890051956% used
To Space:
   capacity = 26804224 (25.5625MB)
   used     = 0 (0.0MB)
   free     = 26804224 (25.5625MB)
   0.0% used
tenured generation:
   capacity = 536870912 (512.0MB)
   used     = 31052128 (29.613616943359375MB)
   free     = 505818784 (482.3863830566406MB)
   5.783909559249878% used
Perm Generation:
   capacity = 27787264 (26.5MB)
   used     = 27771432 (26.484901428222656MB)
   free     = 15832 (0.01509857177734375MB)
   99.94302425744398% used
 
从上面可以看出,JVM的NewSize 、MaxNewSize、OldSize、PermSize 设置太小。PermSize使用率已达到99.9%,这应该是造成OutOfMemoryError错误的主要原因之一。另外,新生代分配较小,当遇到大 的对象分配(从开发处了解到InternalHub2.0相对之前的1.0版本增加了许多大对象的分配),而新生代又不够时,就会直接向老年代申请分配担 保,直接将大对象分配到老年代,而此时老年代也太小,容不下大对象,这时也会造成OutOfMemoryError错误。在测试环境的默认JVM参数情况下,系统一直在多次的进行full GC, 而minor GC基本没有,这也从另一个测面验证了full GC太过频繁。

针对上述情况,对测试环境的JVM进行了重新配置,配置参数如下:
-Xms768m -Xmx768m -Xmn288m -XX:OldSize=30m -XX:PermSize=40m -XX:MaxPermSize=80m -XX:+UseParNewGC -XX:+UseCMSCompactAtFullCollection -XX:CMSFullGCsBeforeCompaction=4 -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCApplicationStoppedTime -Xloggc:/home/imix/imixapp/InternalHub2.0/perf_test/log/gc.log -Dcom.sun.management.jmxremote.port=10900 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -agentpath:/home/imix/imixapp/InternalHub2.0/perf_test/jprofiler/jprofiler8/bin/linux-x64/libjprofilerti.so=port=9949,nowait,id=106,config=/home/imix/imixapp/InternalHub2.0/perf_test/jprofiler/jprofiler8/config/config.xml

其中,-Dcom.sun.management.jmxremote.port=10900 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false三个参数作用是为了远程jconsole或 jvisualVM监控所用。建议在测试环境或生产环境中都加上此参数,以方便随时监控系统运行情况(在没打开jconsole或jvisualVM的情 况下,基本不会影响系统性能)。
-agentpath:/home/imix/imixapp/InternalHub2.0/perf_test/jprofiler /jprofiler8/bin/linux-x64 /libjprofilerti.so=port=9949,nowait,id=106,config=/home/imix/imixapp /InternalHub2.0/perf_test/jprofiler/jprofiler8/config/config.xml参数为配置的 jprofiler剖析工具所用。在开发环境或测试环境可以加上此参数,在生产系统中,建议关闭,以免影响性能。
 
在对测试环境的JVM做如上设置之后,系统某一时刻heap如下:
Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 805306368 (768.0MB)
   NewSize          = 301989888 (288.0MB)
   MaxNewSize       = 301989888 (288.0MB)
   OldSize          = 31457280 (30.0MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 41943040 (40.0MB)
   MaxPermSize      = 83886080 (80.0MB)
 
Heap Usage:
New Generation (Eden + 1 Survivor Space):
   capacity = 271843328 (259.25MB)
   used     = 127598560 (121.68746948242188MB)
   free     = 144244768 (137.56253051757812MB)
   46.9382717386391% used
Eden Space:
   capacity = 241696768 (230.5MB)
   used     = 125549928 (119.7337417602539MB)
   free     = 116146840 (110.7662582397461MB)
   51.945224190999525% used
From Space:
   capacity = 30146560 (28.75MB)
   used     = 2048632 (1.9537277221679688MB)
   free     = 28097928 (26.79627227783203MB)
   6.795574685801631% used
To Space:
   capacity = 30146560 (28.75MB)
   used     = 0 (0.0MB)
   free     = 30146560 (28.75MB)
   0.0% used
tenured generation:
   capacity = 503316480 (480.0MB)
   used     = 33062704 (31.531051635742188MB)
   free     = 470253776 (448.4689483642578MB)
   6.568969090779622% used
Perm Generation:
   capacity = 41943040 (40.0MB)
   used     = 27670656 (26.3887939453125MB)
   free     = 14272384 (13.6112060546875MB)
   65.97198486328125% used
 
可以明显看到系统各项指标使用率降了下来。同时,minor GC的次数明显上升,数倍于full GC次数,JVM运行基本回到正常状态。
在今天近一天的测试过程中,我们一直对JVM进行了监控,观察到系统运行一直很稳定,GC回收功能正常,占用的内存也没有明显的增加,没有出现outofmemory error的错误。
下午我们去生产环境看了一下JVM的配置,基本跟测试环境的问题一样,可能也需要对JVM参数进行类似设置,以确保系统运行良好。之前1.0版本在如此配置的生产环境上运行,没有出现outofmemory error的错误,而2.0出现错误,原因应该是1.0跟2.0的差别:2.0新增加了许多大对象的操作,导致在之前配置情况下出错。

(2).至于代码中是否存在内存泄漏,在我测试的这一天时间内,暂时还未发现明显的内存泄漏的迹象。不过,下午我对2.0项目的代码使用findbugs工具进行了扫描,发现了99个可疑的bugs,已报给开发,开发可以对这些bugs进行一一排查。
分享到:
评论

相关推荐

    weblgicJVM内存不释放,CPU使用率居高不下建议.

    - **内存参数配置不当**:JVM的内存参数设置为`-Xms2048m -Xmx2048m`,即初始堆大小和最大堆大小均为2048M。这种配置方式可能会导致JVM内存出现大量碎片化,进一步加剧垃圾回收的压力。 **建议解决方案**: - 调整...

    Weblogic内存大小配置

    本文将深入探讨Weblogic内存大小配置的基本概念、原理、常见问题及其解决方案。 #### Java堆、本地内存与进程大小 Weblogic服务器的内存主要分为三部分:Java堆、本地内存和进程大小。理解这三者之间的关系对于...

    weblogic定期故障分析

    本次故障分析聚焦于WebLogic在特定配置下(例如JVM设置为1G内存)遇到的内存泄漏问题。 #### 二、故障现象及分析 **1. 内存溢出现象** - **系统环境**:AIX 5.3.08操作系统上部署的WebLogic 9.2 MP3集群环境。 - ...

    BlazeDS+Spring+activeMQ outofmemory

    5. **调整JVM参数**:根据应用程序的需求,适当调整JVM的内存分配参数(如-Xms, -Xmx等)。 6. **代码审查**:检查所有相关的源码,找出可能导致内存泄漏的代码片段。 7. **使用消息确认**:在ActiveMQ中启用消息...

    WebLogic宕机大全总结

    - 使用工具如VisualVM或JConsole等监控JVM的内存使用情况,及时调整JVM参数。 #### 四、服务器挂起问题 ##### 1. 表现现象 - 服务器不再响应客户端请求,页面加载缓慢或无法打开。 - 请求超时,长时间无响应。 - ...

    Java ️总结:JVM,NIO,并发编程,MySQL,分库分表,微服务,分布式缓-Java-Summarize.zip

    理解JVM的工作原理,包括类加载机制、内存模型(堆、栈、方法区)以及垃圾回收机制,对于优化代码性能和解决内存泄漏问题至关重要。熟悉JVM调优技巧,如设置合理的堆大小、选择合适的垃圾收集器,能有效提升应用程序...

    WebLogic Server 故障诊断

    根据给定的信息,本文将详细探讨 WebLogic Server 的故障诊断方法与步骤,旨在为用户提供一套系统性的解决方案。文章首先简要介绍了故障诊断的基本流程,随后深入讲解了 Thread Dump 的概念及其在故障诊断中的应用,...

    Spring Boot性能优化与架构设计:应对技术瓶颈及改进建议

    微服务架构章节则着重讨论了服务注册与发现、分布式事务等复杂问题,提出了使用Kubernetes、引入消息中间件和服务网格的解决方案。 适合人群:具有一定的Java开发经验和Spring Boot使用经验的技术人员,特别是负责...

    IT运维服务系统方案设计.docx

    此方案涉及到多个关键组件和技术,包括PaaS层监控中心、基础设施监控、性能实时监控、JVM监控、应用拓扑可视化、慢SQL语句分析、线程监控分析、内存泄露分析和服务可用性监控。 1.1.1 Paas层监控中心是系统的核心,...

    深入JVM剖析Java的线程堆栈

    堆内存的大小可以通过JVM启动参数进行调整,比如`-Xms`和`-Xmx`分别设置初始堆大小和最大堆大小。堆内存的管理涉及到垃圾回收机制,用于自动回收不再使用的对象,防止内存泄漏。 线程堆栈则是每个线程独立拥有的,...

    IT运维服务系统方案设计.pdf

    11. 内存泄露分析:通过监控元素和对象数量变化,为内存泄露诊断提供数据支持。 12. 服务可用性监控:主动检查系统服务、数据库、中间件、应用服务和关键业务的健康状态,定时收集信息,智能分析并及时报警,确保...

    架构师最新面试专题.zip

    2. Spring Cloud:为微服务提供一套完整的解决方案,包括服务发现、配置中心、断路器、路由、熔断等。 3. Spring Data:简化数据库操作,支持JPA、MyBatis等持久层框架。 4. Spring AOP:实现切面编程,进行非业务...

    java面试题目

    - **概述**:JVM的GC机制负责自动回收不再使用的对象占用的内存空间,以避免内存泄漏等问题。 - **主要算法**: - **标记-清除**:标记不再使用的对象,然后清理这些标记的对象。 - **复制算法**:将内存分为两个...

    互联网大厂Java工程师岗位面试真题

    设计模式是软件设计中的一些通用解决方案,如单例模式(确保类只有一个实例)、工厂模式(创建对象的抽象方法)、装饰器模式(动态添加功能)等。 【数据库事务】 事务实现原理涉及ACID特性,确保事务的原子性、...

    性能调优方案arthus

    ### 性能调优方案Arthus:一次真实的性能调优实践与探索 #### 一、性能调优的必要性及难点 **1.1 性能满足业务需求** 随着互联网技术的发展,用户对系统的响应速度、稳定性等性能指标提出了更高的要求。例如,在...

    浅谈IT系统运维检查的工作内容.docx

    2. **网络问题解决**:针对发现的问题制定解决方案,提高网络稳定性。 3. **性能优化**:通过对网络性能的持续监控和分析,不断优化网络配置。 #### 六、主机、存储系统运维服务 1. **日常监控**:监控主机和存储...

    Websphere portal tuning调优

    1. **JVM参数调整**:适当增加JVM的最大堆内存(`-Xmx`)可以有效减少垃圾回收的频率,从而降低系统延迟。然而,需要注意的是,过多的内存分配可能会导致其他问题,例如内存泄漏或长时间的垃圾回收暂停时间(GC ...

    WebLogic培训资料

    7. **性能调优**:讨论如何通过调整JVM参数、线程池大小、内存分配等方式优化WebLogic Server的性能。可能会涉及JRockit或JDK的性能分析工具,如JConsole和VisualVM。 8. **监控与诊断**:介绍如何使用JMX(Java ...

Global site tag (gtag.js) - Google Analytics