<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/JRockit-testing-OutOfMemoryError-PermGen-space/</link>
<title><![CDATA[JRockit检测Tomcat内存溢出JAVA内存泄漏问题]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[Web开发]]></category>
<pubDate>Wed, 14 Dec 2011 14:36:06 +0000</pubDate> 
<guid>https://www.heckjj.com/JRockit-testing-OutOfMemoryError-PermGen-space/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="font-family: 微软雅黑;">公司的一个JAVA应用系统上线以来，基本每1天OutOfMemoryError： PermGen space一次。JAVA堆上限1个G，出现了好多次，想到JRockit可以分析内存泄漏的问题：<br/>1. JRockit简介<br/>Jrockit是Bea开发的符合JAVA虚拟机规范的虚拟机+虚拟机监控软件。<br/>虚拟机：Jrockit Real Time<br/>监控软件：Jrockit Mission Control<br/>Jrockit Real Time与SUN的JDK是完全兼容的，也就是说以前在SUN的虚拟机上跑的程序，在Jrockit Real Time上不会出现任何问题。<br/>以前这套软件只提供1个小时的免费监控时间。就是说虚拟机启动1个小时内监控软件可以连上，过了一个小时就连不上了。这对一天才泄漏20M的应用程序来说，没有什么意义。现在已经完全免费了。这是开发者的福音。<br/>最重要的，Jrockit是目前作者尝试过的，唯一一套可以在生产环境中进行内存监控的软件，其他软件都会严重降低虚拟机的效率应用基本无法使用。因为内存泄漏有时就算在压力测试中也很难发现。大部分都是在生产环境中产生的。如果没有一个基本不影响运行效率的软件，想解决只能靠运气。以前我解决过一次JAVA内存泄漏的问题，将程序从WEBLOGIC迁移到TOMCAT上解决了决完全属于运气。现在有了这个工具，解决起来就非常方便了。<br/><br/>2. 下载JRockit3.1.0，并安装<br/>下载地址：<a href="http://www.oracle.com/technology/software/products/jrockit/index.html<br/>" target="_blank">http://www.oracle.com/technology/software/products/jrockit/index.html</a><br/>要同时下载Jrockit Mission Control 3.1.0（监控软件）和Jrockit Real Time 3.1.0（虚拟机）</span> <span style="font-family: 微软雅黑;"><br/><br/>3. 服务器端配置<br/>1. 在服务器段安装Jrockit Real Time 3.1.0，<br/>2. 设置应用程序，使用此Jrockit启动应用程序。<br/>Tomcat 6的设置方法是：<br/>在catalina.sh顶部加入<br/>JAVA_OPTS=&quot; -verbosegc -Dcom.sun.management.jmxremote.port=7091 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Djava.rmi.server.hostname=本机IP &quot;和<br/>JRE_HOME=&quot;Jrockit虚拟机路径&quot;<br/>将JRE_HOME改为JAVA_HOME也行。<br/>3. 下载<a href="http://download2.bea.com/pub/license/All%20Products/BEA_WebLogic.zip" target="_blank">http://download2.bea.com/pub/license/All%20Products/BEA_WebLogic.zip</a>，解压后将其中的LIC-WLRT20.txt文件改名为license.bea上传到%JROCKIT_HOME%/jre/下。<br/>4. 监控端设置<br/>首先安装Jrockit Mission Control 3.1.0，然后运行之。<br/>在JVM浏览器视图中，对连接器文件夹右键，选择新建连接。弹出下图:<br/><a href="https://www.heckjj.com/attachment.php?fid=103" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=103" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>在“主机”处输入IP，服务器开放的端口已经是7091，所以不必修改。其他的不用动。点击“测试连接”状态如果是确定则代表已经连接。点击Finish保存新建的连接。在“连接器”文件夹新建了一个连接。<br/>5. 开始监控内存<br/>在新建的连接器上点击右键，选择“启动Memleak”，如图：<br/><a href="https://www.heckjj.com/attachment.php?fid=104" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=104" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/>弹出内存泄露检测器，如图：<br/><a href="https://www.heckjj.com/attachment.php?fid=105" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=105" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>最先看见的是“趋势”选项卡，里边标注了占用JAVA堆大于0.1%的类和数组。<br/>“类型”选项卡，显示了类型与类型之间的引用情况。<br/>“实例”选项卡，显示了实例之间的引用情况。<br/>“分配堆栈跟踪”选项卡，显示了指定类型在虚拟机运行过程中被使用的情况。<br/>6. 实战<br/>公司的一个JAVA应用系统上线以来，基本每1天OutOfMemory一次。JAVA堆上限1个G。<br/>6.1 10点45分内存使用情况抓屏（趋势选项卡）<br/>注：抓屏前都进行了完全的垃圾回收。<br/><a href="https://www.heckjj.com/attachment.php?fid=106" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=106" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>6.2 13点17分内存使用情况抓屏<br/><br/><a href="https://www.heckjj.com/attachment.php?fid=107" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=107" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>6.3 结论<br/>占用内存最高的类为：<br/>edu.emory.mathcs.java.util.concurrent.ConcurrentHashMap$Segment<br/>此类从10点多的95M涨到13点的129M。没有释放内存。此类引起内存泄露。<br/>edu.emory.mathcs属于backport-util-concurrent开源项目。用于线程并发编程。属于java.util.concurrent包的另一个实现。<br/>7. 堆栈分配跟踪<br/>知道是那个类出了问题，然后就需要知道系统中都那些类使用了这个问题。在edu.emory.mathcs.java.util.concurrent.ConcurrentHashMap$Segment上右键，选择“显示分配跟踪”，进入“分配堆栈跟踪”选项卡，<br/>跟踪一段时间如图：<br/><a href="https://www.heckjj.com/attachment.php?fid=108" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=108" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/><br/><br/>此时就会发现，使用backport-util-concurrent的是AXIS2，使用AXIS2的是我们项目里的文件，并且里边已经标注了堆栈(包名.类名.方法名(文件名：行数) )，这样就知道那里出现问题，对症下药就能够解决了。去修改代码吧。HOHO~</span><br/>Tags - <a href="https://www.heckjj.com/tags/jrockit/" rel="tag">jrockit</a> , <a href="https://www.heckjj.com/tags/tomcat/" rel="tag">tomcat</a> , <a href="https://www.heckjj.com/tags/%25E5%2586%2585%25E5%25AD%2598%25E6%25BA%25A2%25E5%2587%25BA/" rel="tag">内存溢出</a> , <a href="https://www.heckjj.com/tags/outofmemoryerror/" rel="tag">outofmemoryerror</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/JRockit-testing-OutOfMemoryError-PermGen-space/#blogcomment</link>
<title><![CDATA[[评论] JRockit检测Tomcat内存溢出JAVA内存泄漏问题]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/JRockit-testing-OutOfMemoryError-PermGen-space/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>