zoukankan      html  css  js  c++  java
  • 【转载】JRockit检测Tomcat内存溢出JAVA内存泄漏问题

     公司的一个JAVA应用系统上线以来,基本每1天OutOfMemoryError: PermGen space一次。JAVA堆上限1个G,出现了好多次,想到JRockit可以分析内存泄漏的问题:
    1. JRockit简介
    Jrockit是Bea开发的符合JAVA虚拟机规范的虚拟机+虚拟机监控软件。
    虚拟机:Jrockit Real Time
    监控软件:Jrockit Mission Control
    Jrockit Real Time与SUN的JDK是完全兼容的,也就是说以前在SUN的虚拟机上跑的程序,在Jrockit Real Time上不会出现任何问题。
    以前这套软件只提供1个小时的免费监控时间。就是说虚拟机启动1个小时内监控软件可以连上,过了一个小时就连不上了。这对一天才泄漏20M的应用程序来说,没有什么意义。现在已经完全免费了。这是开发者的福音。
    最重要的,Jrockit是目前作者尝试过的,唯一一套可以在生产环境中进行内存监控的软件,其他软件都会严重降低虚拟机的效率应用基本无法使用。因为内存泄漏有时就算在压力测试中也很难发现。大部分都是在生产环境中产生的。如果没有一个基本不影响运行效率的软件,想解决只能靠运气。以前我解决过一次JAVA内存泄漏的问题,将程序从WEBLOGIC迁移到TOMCAT上解决了决完全属于运气。现在有了这个工具,解决起来就非常方便了。

    2. 下载JRockit3.1.0,并安装
    下载地址:http://www.oracle.com/technology/software/products/jrockit/index.html
    要同时下载Jrockit Mission Control 3.1.0(监控软件)和Jrockit Real Time 3.1.0(虚拟机)


    3. 服务器端配置
    1. 在服务器段安装Jrockit Real Time 3.1.0,
    2. 设置应用程序,使用此Jrockit启动应用程序。
    Tomcat 6的设置方法是:
    在catalina.sh顶部加入
    JAVA_OPTS=" -verbosegc -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=本机IP "和
    JRE_HOME="Jrockit虚拟机路径"
    将JRE_HOME改为JAVA_HOME也行。
    3. 下载http://download2.bea.com/pub/license/All%20Products/BEA_WebLogic.zip,解压后将其中的LIC-WLRT20.txt文件改名为license.bea上传到%JROCKIT_HOME%/jre/下。
    4. 监控端设置
    首先安装Jrockit Mission Control 3.1.0,然后运行之。
    在JVM浏览器视图中,对连接器文件夹右键,选择新建连接。弹出下图:
    点击在新窗口中浏览此图片


    在“主机”处输入IP,服务器开放的端口已经是7091,所以不必修改。其他的不用动。点击“测试连接”状态如果是确定则代表已经连接。点击Finish保存新建的连接。在“连接器”文件夹新建了一个连接。
    5. 开始监控内存
    在新建的连接器上点击右键,选择“启动Memleak”,如图:
    点击在新窗口中浏览此图片

    弹出内存泄露检测器,如图:
    点击在新窗口中浏览此图片


    最先看见的是“趋势”选项卡,里边标注了占用JAVA堆大于0.1%的类和数组。
    “类型”选项卡,显示了类型与类型之间的引用情况。
    “实例”选项卡,显示了实例之间的引用情况。
    “分配堆栈跟踪”选项卡,显示了指定类型在虚拟机运行过程中被使用的情况。
    6. 实战
    公司的一个JAVA应用系统上线以来,基本每1天OutOfMemory一次。JAVA堆上限1个G。
    6.1 10点45分内存使用情况抓屏(趋势选项卡)
    注:抓屏前都进行了完全的垃圾回收。
    点击在新窗口中浏览此图片


    6.2 13点17分内存使用情况抓屏

    点击在新窗口中浏览此图片


    6.3 结论
    占用内存最高的类为:
    edu.emory.mathcs.java.util.concurrent.ConcurrentHashMap$Segment
    此类从10点多的95M涨到13点的129M。没有释放内存。此类引起内存泄露。
    edu.emory.mathcs属于backport-util-concurrent开源项目。用于线程并发编程。属于java.util.concurrent包的另一个实现。
    7. 堆栈分配跟踪
    知道是那个类出了问题,然后就需要知道系统中都那些类使用了这个问题。在edu.emory.mathcs.java.util.concurrent.ConcurrentHashMap$Segment上右键,选择“显示分配跟踪”,进入“分配堆栈跟踪”选项卡,
    跟踪一段时间如图:
    点击在新窗口中浏览此图片


    此时就会发现,使用backport-util-concurrent的是AXIS2,使用AXIS2的是我们项目里的文件,并且里边已经标注了堆栈(包名.类名.方法名(文件名:行数) ),这样就知道那里出现问题,对症下药就能够解决了。去修改代码吧。HOHO~


    来源:Heck's Blog
    地址:http://www.hecks.tk/JRockit-testing-OutOfMemoryError-PermGen-space/
  • 相关阅读:
    组装query,query汇总,query字段
    POJ 1276, Cash Machine
    POJ 1129, Channel Allocation
    POJ 2531, Network Saboteur
    POJ 1837, Balance
    POJ 3278, Catch That Cow
    POJ 2676, Sudoku
    POJ 3126, Prime Path
    POJ 3414, Pots
    POJ 1426, Find The Multiple
  • 原文地址:https://www.cnblogs.com/wasp520/p/2436604.html
Copyright © 2011-2022 走看看