http://blog.csdn.net/liyanhui1001/article/details/8240473

公司的一个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/

JRockit检测Tomcat内存溢出JAVA内存泄漏问题的更多相关文章

  1. 牛客网Java刷题知识点之内存溢出和内存泄漏的概念、区别、内存泄露产生原因、内存溢出产生原因、内存泄露解决方案、内存溢出解决方案

    不多说,直接上干货! 福利 => 每天都推送 欢迎大家,关注微信扫码并加入我的4个微信公众号:   大数据躺过的坑      Java从入门到架构师      人工智能躺过的坑          ...

  2. java中的内存溢出和内存泄漏

    内存溢出:对于整个应用程序来说,JVM内存空间,已经没有多余的空间分配给新的对象.所以就发生内存溢出. 内存泄露:在应用的整个生命周期内,某个对象一直存在,且对象占用的内存空间越来越大,最终导致JVM ...

  3. 【java虚拟机】内存溢出与内存泄漏

    作者:平凡希 原文地址:https://www.cnblogs.com/xiaoxi/p/7354857.html 一.基本概念 内存溢出:简单地说内存溢出就是指程序运行过程中申请的内存大于系统能够提 ...

  4. Java虚拟机6:垃圾收集(GC)-1(内存溢出和内存泄漏的区别)

    1.前言 在进行垃圾收集之前需要普及几个比较重要的概念. 2.内存溢出和内存泄露的概念和区别: (1):内存溢出(out of memory):是指程序在申请内存时,没有足够的内存空间可以分配,系统不 ...

  5. java中内存溢出和内存泄漏的区别

    虽然在java中我们不用关心内存的释放, 垃圾回收机制帮助我们回收不需要的对象,但实际上不正当的操作也会产生内存问题:如,内存溢出.内存泄漏 内存溢出:out of memory:简单通俗理解就是内存 ...

  6. java虚拟机(四)--内存溢出、内存泄漏、SOF

    学习了java运行时数据区,知道每个内存区域保存什么数据,可以参考:https://www.cnblogs.com/huigelaile/p/diamondshine.html,然后了 解内存溢出和内 ...

  7. Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

    前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出 ...

  8. Java内存溢出和内存泄露后怎么解决

    1.首先这里先说一下内存溢出和内存泄露的区别: 内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但 ...

  9. 内存溢出和内存泄漏的区别(ZZ)

      内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory:比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出 ...

随机推荐

  1. IP通信基础课堂笔记----第四章(重点中的重点)

    IPv4编址方法 一个IPv4地址可表示为一个32位的二进制数. IP地址前面的网络部分表示一个网段,后面部分(主机位)表示这个网段上的一台设备. 常用IP地址分为四类:A.B.C.D. 每类的网络地 ...

  2. DB9接口定义

    注意公头和母头的引脚序号是不一样的.

  3. 石头的Xcode学习列表

    http://www.cnblogs.com/JangoJing/tag/xcode/

  4. windows与sql身份登录

    windows身份验证:1.“.”代表本地2.127.0.0.1代表本地3.本地ip地址,在dos中可查4.localhost代表本地 sql身份验证:首先用windows登上去,之后再安全性中找到登 ...

  5. sqlserver智能提示插件-sql prompt(9.4.6)的安装及注册流程

    官网下在地址:https://www.red-gate.com/products/sql-development/sql-prompt/ CSDN下载地址(对应的版本是9.4.6,其中包含安装包和注册 ...

  6. IPC 简说

    IPC(inter-process communication)进程间通信 多进程分为两种情况 1. 同一个应用,使用android:process属性启动的四大组件 2. 多应用 通过android ...

  7. scrum第二次冲刺

    1.本次冲刺内容 实现长大一条龙的登陆注册.    本次冲刺我们团队实现了长大一条龙的登录注册功能.我们的这个项目严格遵守MVC架构,采用前后端分离的策略.我们将登陆注册分为三层,DAO层:负责与数据 ...

  8. slurm作业提交系统常用命令

    写下自己的关于slurm感悟一二 与各人pc不同,slurm的基本架构是,一个中专节点,之后有很多局域网ip对应不同的计算节点,在中专节点敲命令,命令中可以指定需要用到哪些计算节点 1. 查看有哪些分 ...

  9. Alienware R8外星人台式机安装双系统(WIN10+Ubuntu)的总结

    新电脑终于到了,然而外星人的系统比较特殊,很多东西和别的品牌(包括DELL)不一样, 同时NVIDIA显卡也带来了很多问题.重装了十几遍,查阅了上百篇文章后之后终于搞定了双系统. 其实核心问题很傻,就 ...

  10. DataBase——Mysql的DataHelper

    源帖 https://www.cnblogs.com/youuuu/archive/2011/06/16/2082730.html 保护原帖,尊重技术,致敬工匠! using System; usin ...