<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>聚沙成塔-小哈的记事薄 &#187; gc performance tuning</title>
	<atom:link href="http://www.hashei.me/tag/gc-performance-tuning/feed" rel="self" type="application/rss+xml" />
	<link>http://www.hashei.me</link>
	<description>一个系统工程师的絮叨</description>
	<lastBuildDate>Tue, 10 Jan 2012 18:03:42 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		
<!-- Start Of Script Generated By WP-PostViews Plus -->
<script type='text/javascript' src='http://hashei.me/wp-includes/js/jquery/jquery.js?ver=1.3.2'></script>
<script type="text/javascript">
/* <![CDATA[ */
jQuery.ajax({type:'GET',url:'http://hashei.me/wp-content/plugins/wp-postviews-plus/postviews_plus.php',data:'todowppvp=add&type=tag&id=91_1',cache:false,dataType:'script'});
/* ]]> */
</script>
<!-- End Of Script Generated By WP-PostViews Plus -->
	<item>
		<title>用HPjtune分析GC日志（一个实际案例的诊断过程）</title>
		<link>http://www.hashei.me/2009/07/use-hpjtune-to-analysis-gc-log.html?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=use-hpjtune-to-analysis-gc-log</link>
		<comments>http://www.hashei.me/2009/07/use-hpjtune-to-analysis-gc-log.html#comments</comments>
		<pubDate>Thu, 02 Jul 2009 08:48:14 +0000</pubDate>
		<dc:creator>hashei</dc:creator>
				<category><![CDATA[Websphere系列]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[排错]]></category>
		<category><![CDATA[gc performance tuning]]></category>
		<category><![CDATA[gc日志分析]]></category>
		<category><![CDATA[内存优化]]></category>

		<guid isPermaLink="false">http://www.hashei.me/2009/07/use-hpjtune-to-analysis-gc-log.html</guid>
		<description><![CDATA[上次介绍了IBM的两款分析gc log的工具（GCMV和PMAT），这次讲讲HP推出的HPjmeter。HPjmeter集成了以前的HPjtune功能，可以分析在HP机器上产生的垃圾回收日志文件。你可以到Hewlett-Packard Java website免费下载最新的4.0版本，当然会让你填一些信息。
接下来我将分析一个实际生产环境下的日志文件，这个生产系统在启用新的功能后应用访问速度变慢，每个操作都要耗时10s左右，通过对比前后不同的gc信息，希望能从JVM的层面来优化当前的性能。
HP小机（Pa-Risc和安腾平台）使用HP的JDK后，使用-Xloggc:filename或者-Xverbosegc:file=filename参数会生成形如
&#60;GCH: vmrelease=&#8221;1.4.2 1.4.2.10-060112-16:07-PA_RISC2.0 PA2.0 (aCC_AP)
……
&#60;GCH: mode=n &#62;
&#60;GCH: ncpu=8 &#62;
&#60;GCH: availswap=33554432 &#62;
&#60;GCH: usedswap=0 &#62;
……
&#60;GC: 2 4  9.625554 1 0 31 48539536 0 286392320 0 0 35782656 0 2409608 715849728 20971424 20971424 20971520 0.279391 0.279391 &#62;
&#60;GC: 2 4  10.879321 2 0 31 9797920 0 286392320 0 0 35782656 2409608 2742416 715849728 25165568 25165568 25165824 [...]]]></description>
			<content:encoded><![CDATA[<p style="text-indent: 24pt">上次介绍了IBM的两款分析gc log的工具（GCMV和PMAT），这次讲讲HP推出的<strong>HPjmeter</strong>。HPjmeter集成了以前的HPjtune功能，可以分析在HP机器上产生的垃圾回收日志文件。你可以到<a href="http://www.hp.com/go/java">Hewlett-Packard Java website</a>免费下载最新的4.0版本，当然会让你填一些信息。</p>
<p style="text-indent: 24pt">接下来我将分析一个实际生产环境下的日志文件，这个生产系统在启用新的功能后应用访问速度变慢，每个操作都要耗时10s左右，通过对比前后不同的gc信息，希望能从JVM的层面来优化当前的性能。</p>
<p style="text-indent: 24pt">HP小机（Pa-Risc和安腾平台）使用HP的JDK后，使用-Xloggc:filename或者-Xverbosegc:file=filename参数会生成形如</p>
<div style="border-right: #000000 1px dashed; padding-right: 14px; border-top: #000000 1px dashed; padding-left: 14px; padding-bottom: 14px; border-left: #000000 1px dashed; padding-top: 14px; border-bottom: #000000 1px dashed; background-color: #ffffe0">&lt;GCH: vmrelease=&#8221;1.4.2 1.4.2.10-060112-16:07-PA_RISC2.0 PA2.0 (aCC_AP)<br />
……<br />
&lt;GCH: mode=n &gt;<br />
&lt;GCH: ncpu=8 &gt;<br />
&lt;GCH: availswap=33554432 &gt;<br />
&lt;GCH: usedswap=0 &gt;<br />
……<br />
&lt;GC: 2 4  9.625554 1 0 31 48539536 0 286392320 0 0 35782656 0 2409608 715849728 20971424 20971424 20971520 0.279391 0.279391 &gt;<br />
&lt;GC: 2 4  10.879321 2 0 31 9797920 0 286392320 0 0 35782656 2409608 2742416 715849728 25165568 25165568 25165824 0.307422 0.307422 &gt;</div>
<p>的日志，这种格式人肉分析就别想了，它可以在PMAT中以Xverbosegc/hpux文件格式打开，但是图象功能我这里没法使用，只好求助于HP自家的工具——HPjmeter了。</p>
<h4>分析过程</h4>
<p style="text-indent: 24pt">用HPjmeter加载日志文件后，会自动打开HPjtune的窗口。首先会看到Heap Usage After GC标签页，这是四月份正常的情况（请先忽略systemgc，这点留待后面分析）</p>
<p style="text-indent: 24pt"><span id="more-500"></span></p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/April-Heap-Usage-After-GC.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/April-Heap-Usage-After-GC_thumb.png" border="0" alt="April Heap Usage After GC" width="504" height="285" /></a></p>
<p style="text-indent: 24pt">下面是六月份速度慢的情况：</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/June-Heap-Usage-After-GC.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/June-Heap-Usage-After-GC_thumb.png" border="0" alt="June Heap Usage After GC" width="504" height="285" /></a></p>
<p style="text-indent: 24pt">明显能看到Old full（with perm）代表的黄点增多了，从之前的日志文件头我们了解到这个系统所用的<strong>JDK为1.4.2 32位版本（64位版本会写明Java VM name = Java HotSpot(TM) 64-Bit Server VM）</strong>，默认的回收策略是串行收集器，在Old区发生垃圾回收时是Stop the world的full gc，每次full gc耗时基本在10s～12s</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/Duration-6.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/Duration-6_thumb.png" border="0" alt="Duration 6" width="504" height="285" /></a></p>
<p style="text-indent: 24pt">切换到&#8221;Summary&#8221;标签页</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/GC-Summary-4.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/GC-Summary-4_thumb.jpg" border="0" alt="GC Summary 4" width="504" height="304" /></a></p>
<p style="text-indent: 24pt">4月花在gc上的时间占整个JVM运行时间的3.036%，Full GC占整个JVM运行时间的0.993%，应该说是情况良好。</p>
<p style="text-indent: 24pt">到了6月份，情况却变化很大，时间分别为<span style="color: #ff0000;">10.791%</span>和<span style="color: #ff0000;">8.417%</span>，因为超过了5%的警戒线而显示为红色，而且79%的GC时间花在full gc上。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/GC-Summary-6.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/GC-Summary-6_thumb.jpg" border="0" alt="GC Summary 6" width="504" height="304" /></a></p>
<p style="text-indent: 24pt">这还是一周的情况，包括了周末和晚间空闲时刻，让我们看看在上班高峰期间的运行情况。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/GC-Summary-6-4.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/GC-Summary-6-4_thumb.jpg" border="0" alt="GC Summary 6-4" width="504" height="227" /></a></p>
<p style="text-indent: 24pt">乖乖，有61%的时间花在gc上，速度不慢才怪了。我们查看当前对应的Heap Usage After GC</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/June-22-morning.png" target="_blank"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/June-22-morning_thumb.png" border="0" alt="June 22 morning" width="504" height="285" /></a></p>
<p style="text-indent: 24pt">除了开始的少数年轻代中发生的快速Scavenge，大部分都是慢速的Full GC，而且可以看到每次回收后使用的堆空间并没有减小，反而越来越大，有内存泄漏的征兆。不过堆空间并没有一路增长下去直到OutOfMemory，而是像下图般那样反复。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/Jun22-Heap-Usage-After-GC.png" target="_blank"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/Jun22-Heap-Usage-After-GC_thumb.png" border="0" alt="Jun22 Heap Usage After GC" width="504" height="285" /></a></p>
<p style="text-indent: 24pt">早上和下午两个业务繁忙期全是full gc，性能表现很差，而4月正常的情况应是如此</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/April-23-Heap-Usage-After-GC.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/April-23-Heap-Usage-After-GC_thumb.png" border="0" alt="April 23 Heap Usage After GC" width="504" height="285" /></a></p>
<p style="text-indent: 24pt">Eden区满了后，经过Scavenge动作一部分对象被转移到了Old区，所以堆中占用空间上升，直到Old区也无法分配了，那么发生full gc，内存又重新回到一个较低的位置，这是正常的情况。现在6月份出现一直Full GC也无法回收，但又没有发生OutOfMemory，可以判断为原来设置的参数无法满足新内容投产后的需求</p>
<p style="text-indent: 24pt">例如没有使用并行回收，没有发挥8个CPU的效果，没有采用低响应时间的CMS回收模式。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/system-details-hpjtune.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/system-details-hpjtune_thumb.jpg" border="0" alt="system details hpjtune" width="504" height="237" /></a></p>
<p style="text-indent: 24pt">同时新系统产生的对象数量也大大增加，从四月一天的500000个增加到900000个（左边四月，右边六月）。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/April-Cumulative-Allocation.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/April-Cumulative-Allocation_thumb.png" border="0" alt="April Cumulative Allocation" width="244" height="139" /></a> <a href="http://hashei.me/wp-content/uploads/2009/07/June-Cumulative-Allocation.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/June-Cumulative-Allocation_thumb.png" border="0" alt="June Cumulative Allocation" width="244" height="139" /></a></p>
<p style="text-indent: 24pt">导致每次回收后，从新生代转移到年老区的对象数量也变多，其实它们并非是长存对象，只是新生代暂时无法容纳下它们了。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/April-Promoted-Bytes.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/April-Promoted-Bytes_thumb.png" border="0" alt="April Promoted Bytes" width="244" height="139" /></a> <a href="http://hashei.me/wp-content/uploads/2009/07/June-Promoted-Byte.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/June-Promoted-Byte_thumb.png" border="0" alt="June Promoted Byte" width="244" height="139" /></a></p>
<p style="text-indent: 24pt">而且full gc会导致Survivor区里的所有对象都被转移到old区，这造成了恶性循环。（黄色的Full GC后，Survivor里的对象为零）</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/07/June22-Survivor-After.png"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/07/June22-Survivor-After_thumb.png" border="0" alt="June22 Survivor After" width="504" height="285" /></a></p>
<h4>优化操作</h4>
<p style="text-indent: 24pt"><strong>调整目标</strong>：尽可能的将短时间存活的对象在年轻代就能被丢弃掉，而不要转移到年老代中；采用并行回收方式增加效率；避免产生不必要的Full GC；或者采用响应时间短的垃圾回收方式。</p>
<p style="text-indent: 24pt"><strong>调整方法</strong>：增大年轻代大小，减小SurvivorRatio加大Survivor区（也就是From or To）；设置并行回收参数;设置初始堆和最大堆为同样值、设置初始PermSize为一个合理值，避免运行过程中增长；设置回收策略为CMS。</p>
<p style="text-indent: 24pt"><strong>参数设置一</strong>：-Xms1500m -Xmx1500m -Xmn800m -XX:SurvivorRatio=4 -XX:PermSize=160m  -XX:+UseParallelGC（-XX:ParallelGCThreads=8我觉得可以不用显示的声明，可以再上述参数设置后分析新的gc log，看一下System Details页面中ParallelGCThreads的数目再做定夺，1.4.2的JDK不能再Old区做并行回收，也是一个遗憾）</p>
<p style="text-indent: 24pt"><strong>参数设置二</strong>：-Xms1500m -Xmx1500m -Xmn800m -XX:PermSize=160m  -XX:+UseConcMarkSweepGC -XX:+UseParNewGC -XX:CMSFullGCsBeforeCompaction=5（或者最后一个参数设置为-XX:+UseCMSCompactAtFullCollection）</p>
<p style="text-indent: 24pt">上述参数的意义可以看<a title="Sun Hotspot JDK参数设置" href="http://www.hashei.me/2009/05/tuning-the-sun-hotspot-jdk.html" target="_blank">《JAVA性能优化—Sun Hotspot JDK JVM参数设置》</a></p>
<h4>后续进展</h4>
<p style="text-indent: 24pt">参数设置后还有一个观察过程，如果效果不佳，那从系统集成的角度，一是更换64位JDK，这样可以设置更大的堆空间（不过WebSphere更换JDK不像Weblogic那么简单，如果没有买过64位WebSphere的话只好作罢）；二是启用WebSphere的集群，但这需要ND版本的WAS。</p>
<p style="text-indent: 24pt">从应用的角度，可以在早上8点做一次heapdump，9点半做一次heapdump，分析一下full gc内存回收不下来的原因，确定不是程序的错误造成的。或者启用-agentlib:hprof参数，用HPjmeter来trace应用的表现、用HPjmeter来直接监控应用的运行情况。不过这两个方法对性能影响较大，要在测试环境下进行。</p>
<h4>其它的一些碎碎念</h4>
<p style="text-indent: 24pt">现在我们来说说日志中那么多的systemgc，刚开始看到我大吃一惊，但放大图像后发现这些自行调用的full gc都是下班后做的，应该是另一个应用触发的，对白天的性能影响应该不大。</p>
<p style="text-indent: 24pt">不过这里还是要再申明一句：自行调用System.gc（）函数会损害到JVM的性能，因为这时候是Stop the World的回收，消耗的时间长，但效果并非最佳。你也许会认为你对程序很熟悉，可以在空闲的时间执行system.gc，不会影响到客户访问，但是正如之前所说，full gc后survivor里的所有内容都被转移到了old区长久保存，所以在某个将来，JVM就不得不因为这个原因再做一次不必要的full gc。</p>
<p style="text-indent: 24pt">IBM JDK下避免主动回收的参数是“<strong>-Xdisableexplicitgc</strong><span style="font-weight: bold;">”，Sun JDK下的参数是“<strong>-XX:+DisableExplicitGC</strong>”，注意区别。</span></p>
<hr /><h2>Related posts:</h2><ul><li><a href="http://www.hashei.me/2009/06/websphere-tools-preview.html" rel="bookmark" title="Permanent Link: 预告">预告</a></li><li><a href="http://www.hashei.me/2009/12/critical_thinking.html" rel="bookmark" title="Permanent Link: 什么是真正的思考？">什么是真正的思考？</a></li><li><a href="http://www.hashei.me/2009/06/gc-performance-tuning-with-isa.html" rel="bookmark" title="Permanent Link: WebSphere troubshooting-用工具分析GC Log">WebSphere troubshooting-用工具分析GC Log</a></li><li><a href="http://www.hashei.me/2009/07/heapanalyzer-and-mod4j-introduction.html" rel="bookmark" title="Permanent Link: 用IBM HeapAnalyzer和MOD4J分析Java内存泄漏">用IBM HeapAnalyzer和MOD4J分析Java内存泄漏</a></li><li><a href="http://www.hashei.me/2009/08/serverhang_application_deadlock.html" rel="bookmark" title="Permanent Link: 应用程序死锁导致服务器挂起的介绍">应用程序死锁导致服务器挂起的介绍</a></li></ul><hr /><small>  Copyright &copy; 2008 This feed is for personal, non-commercial use only<br />
<a href=www.hashei.com >聚沙成塔-小哈的记事薄</a> by hashei 
如果喜欢，欢迎订阅<a href=feed.hashei.com >feed.hashei.com</a><br />
Digital Fingerprint:
 10f920a9f2bae51c3c73c4f5fb50a949</small>]]></content:encoded>
			<wfw:commentRss>http://www.hashei.me/2009/07/use-hpjtune-to-analysis-gc-log.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>WebSphere troubshooting-用工具分析GC Log</title>
		<link>http://www.hashei.me/2009/06/gc-performance-tuning-with-isa.html?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=gc-performance-tuning-with-isa</link>
		<comments>http://www.hashei.me/2009/06/gc-performance-tuning-with-isa.html#comments</comments>
		<pubDate>Tue, 09 Jun 2009 14:52:59 +0000</pubDate>
		<dc:creator>hashei</dc:creator>
				<category><![CDATA[Websphere系列]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[排错]]></category>
		<category><![CDATA[gc performance tuning]]></category>
		<category><![CDATA[gc日志分析]]></category>

		<guid isPermaLink="false">http://www.hashei.me/2009/06/gc-performance-tuning-with-isa.html</guid>
		<description><![CDATA[要进行gc performance tuning，不得不对gc log进行分析。之前说到了“人肉”的方法，总觉得不够形象，无法让不了解的开发人员抑或是技术负责人有个直观的了解，所以本文介绍几个分析GC log的工具。
首先需要下载IBM Support Assistant，下载之后就可以从Update-Tools add on中下载我们需要的工具了，ISA使用方法。ISA把所有的工具集成在一个界面内，省去了设置启动参数的麻烦，同时能保持最及时的更新。分析垃圾回收日志，我主要用“The IBM Monitoring and Diagnostic Tools for Java™ &#8211; Garbage Collection and Memory Visualizer”和“IBM Pattern Modeling and Analysis Tool for Java Garbage Collector (PMAT)”这两个工具。我会用实际例子来说明如何使用这个工具。
用Garbage Collection and Memory Visualizer载入native_stderr.log，首先你会看到
 点击展开大图
这是一个500分钟的垃圾回收曲线图，可以观察到一天以内的大致情况。总的来说，蓝色的Used heap（after collection）运行在“平行通道”内，没有走“上升通道”（炒股的朋友应该知道上升通道的图形是咋样的）。所以在Report这个标签内，可以看到“The memory usage of the application does not indicate any obvious leaks.”。
Report中的Summary是需要关注的，它向我们显示了GC发生的次数，所用的policy（optthruput），平均停顿时间248ms，平均间隔时间3.37分钟，还有垃圾回收的速率（垃圾产生多并非不好，反而是吞吐率高的一种表现）。

让我们再切回Line plot视图，现在可以框选某一个时间段进行放大，同时在右边Axes中选择X轴的坐标系，默认的是相对时间，以分钟为单位，适用于你的应用程序总在启动N个小时后出现问题。如果是每天固定时间发生性能问题，那么应该选用绝对时间。
默认的曲线开启了Heap size和Used heap（after collection），你可以根据需要，在VGC Pause [...]]]></description>
			<content:encoded><![CDATA[<p style="text-indent: 24pt">要进行gc performance tuning，不得不对gc log进行分析。之前说到了“<a title="直接分析GC日志" href="http://www.hashei.me/2009/06/analyse-the-gc-logs.html" target="_blank">人肉</a>”的方法，总觉得不够形象，无法让不了解的开发人员抑或是技术负责人有个直观的了解，所以本文介绍几个分析GC log的工具。</p>
<p style="text-indent: 24pt">首先需要<a title="下载IBM Support Assistant" href="http://www-01.ibm.com/software/support/isa/download.html" target="_blank">下载IBM Support Assistant</a>，下载之后就可以从Update-Tools add on中下载我们需要的工具了，<a title="使用 IBM Support Assistant 进行快速的问题诊断" href="http://www.ibm.com/developerworks/cn/websphere/library/techarticles/0710_pengfei/index.html" target="_blank">ISA使用方法</a>。ISA把所有的工具集成在一个界面内，省去了设置启动参数的麻烦，同时能保持最及时的更新。分析垃圾回收日志，我主要用“The IBM Monitoring and Diagnostic Tools for Java™ &#8211; Garbage Collection and Memory Visualizer”和“IBM Pattern Modeling and Analysis Tool for Java Garbage Collector (<strong>PMAT</strong>)”这两个工具。我会用实际例子来说明如何使用这个工具。</p>
<p style="text-indent: 24pt">用Garbage Collection and Memory Visualizer载入native_stderr.log，首先你会看到</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/06/gclog1.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/gclog1-thumb.jpg" border="0" alt="gclog1" width="244" height="144" /></a> 点击展开大图</p>
<p style="text-indent: 24pt">这是一个500分钟的垃圾回收曲线图，可以观察到一天以内的大致情况。总的来说，蓝色的Used heap（after collection）运行在“平行通道”内，没有走“上升通道”（炒股的朋友应该知道上升通道的图形是咋样的）。所以在Report这个标签内，可以看到“The memory usage of the application does not indicate any obvious leaks.”。</p>
<p style="text-indent: 24pt">Report中的Summary是需要关注的，它向我们显示了GC发生的次数，所用的policy（optthruput），平均停顿时间248ms，平均间隔时间3.37分钟，还有垃圾回收的速率（垃圾产生多并非不好，反而是吞吐率高的一种表现）。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/06/summary.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/summary-thumb.jpg" border="0" alt="Summary" width="243" height="244" /></a></p>
<p style="text-indent: 24pt">让我们再切回Line plot视图，现在可以框选某一个时间段进行放大，同时在右边Axes中选择X轴的坐标系，默认的是相对时间，以分钟为单位，适用于你的应用程序总在启动N个小时后出现问题。如果是每天固定时间发生性能问题，那么应该选用绝对时间。</p>
<p style="text-indent: 24pt">默认的曲线开启了Heap size和Used heap（after collection），你可以根据需要，在VGC Pause Date和VGC Date、VGC Heap Data中勾选你需要查看的曲线。比如你觉得程序响应时间很长，那么可以勾选上Intervals between garbage collection triggers和Pause time，看看上一条曲线是否和下面一条靠的“太近”。</p>
<p><span id="more-415"></span></p>
<p style="text-indent: 24pt">
<p style="text-indent: 24pt">通过在Tabbed data查看表格模式的回收信息（同样可以勾选上节提到的内容来增加列），我们看到GC reason都是af。通过查看Free heap before collection，我们发觉有些af发生的时候，堆中剩余空间其实还很多</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/06/tabbed-data.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/tabbed-data-thumb.jpg" border="0" alt="tabbed data" width="244" height="243" /></a> <a href="http://hashei.me/wp-content/uploads/2009/06/free-heap.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/free-heap-thumb.jpg" border="0" alt="free heap" width="244" height="223" /></a></p>
<p style="text-indent: 24pt">我覆盖上Compact times曲线，发现十分吻合，原来这时候是堆中的碎片太多，所以导致即使剩余空间很大，但是没有连续空间分配给新的请求，这时候就发生了压缩（Compact）。加了Unuseable heap due to fragmentatiion的第二副图可以更明显的看到这一点。进一步的，可以根据第一列的collection id去查看引起压缩的requested_bytes，是否是需要比较大的空间（比如大于64K），然后结合一下所有requested_bytes中大对象的数量，确定是否需要调整LOA大小。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/06/compact-time.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/compact-time-thumb.jpg" border="0" alt="compact time" width="244" height="206" /></a> <a href="http://hashei.me/wp-content/uploads/2009/06/compact-time2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/compact-time2-thumb.jpg" border="0" alt="compact time2" width="244" height="231" /></a></p>
<p style="text-indent: 24pt">你会发现还有些曲线是灰色不能选择状态，那是因为根据我现在的gc policy，关于gencon模式下的nursery和tenured曲线在这个模式下是没有的。</p>
<p style="text-indent: 24pt">总的来说，运用不同的曲线组合，合适的缩放比例，不同的日志显示方法对照，我们可以验证gc是否符合我之前说过的一些“最优原则”——回收的间隔是否大大大于持续时间，整个回收时间是否在整个运行时间的5%以下，压缩的次数是否仅占一小部分（太多的话要考虑设置-Xk -Xp和调整LOA）……Report标签中的Tuning recommendation是你需要参考的内容，但不要一上来就根据它的提示去优化。</p>
<p style="text-indent: 24pt">下一个例子就是一个有问题的垃圾回收日志。</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/06/problem3.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/problem3-thumb.jpg" border="0" alt="problem3" width="244" height="226" /></a> 整个垃圾回收曲线，当中有一个Excessive GC引发的OutOfMemory</p>
<blockquote>
<h4><a name="cms.oom"></a></h4>
<p>The concurrent collector will throw an OutOfMemoryError if too much time is being spent in garbage collection: if more than 98% of the total time is spent in garbage collection and less than 2% of the heap is recovered, an OutOfMemoryError will be thrown. This feature is designed to prevent applications from running for an extended period of time while making little or no progress because the heap is too small.</p></blockquote>
<p style="text-indent: 24pt">放大出问题的地方的曲线</p>
<p style="text-indent: 24pt"><a href="http://hashei.me/wp-content/uploads/2009/06/problem.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/problem-thumb.jpg" border="0" alt="problem" width="244" height="210" /></a> <a href="http://hashei.me/wp-content/uploads/2009/06/problem2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" src="http://hashei.me/wp-content/uploads/2009/06/problem2-thumb.jpg" border="0" alt="problem2" width="244" height="241" /></a></p>
<p style="text-indent: 24pt">根据ID查看原始文件</p>
<blockquote><p>&lt;af type=&#8221;tenured&#8221; id=&#8221;1030&#8243; timestamp=&#8221;Tue Nov 04 14:57:26 2008&#8243; intervalms=&#8221;11.440&#8243;&gt;<br />
&lt;minimum requested_bytes=&#8221;216&#8243; /&gt;<br />
&lt;time exclusiveaccessms=&#8221;0.322&#8243; /&gt;<br />
&lt;tenured freebytes=&#8221;0&#8243; totalbytes=&#8221;1342177280&#8243; percent=&#8221;0&#8243; &gt;<br />
&lt;soa freebytes=&#8221;0&#8243; totalbytes=&#8221;1342177280&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;loa freebytes=&#8221;0&#8243; totalbytes=&#8221;0&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;/tenured&gt;<br />
&lt;gc type=&#8221;global&#8221; id=&#8221;1031&#8243; totalid=&#8221;1031&#8243; intervalms=&#8221;11.837&#8243;&gt;<br />
&lt;compaction movecount=&#8221;3301258&#8243; movebytes=&#8221;196674784&#8243; reason<strong>=&#8221;low free space (less than 4%)&#8221;</strong> /&gt;<br />
&lt;refs_cleared soft=&#8221;0&#8243; weak=&#8221;15&#8243; phantom=&#8221;7&#8243; /&gt;<br />
&lt;finalization objectsqueued=&#8221;40&#8243; /&gt;<br />
&lt;timesms mark=&#8221;1753.108&#8243; sweep=&#8221;10.302&#8243; compact=&#8221;1858.390&#8243; total=&#8221;3622.032&#8243; /&gt;<br />
&lt;tenured freebytes=&#8221;519040&#8243; totalbytes=&#8221;1342177280&#8243; percent=&#8221;0&#8243; &gt;<br />
&lt;soa freebytes=&#8221;519040&#8243; totalbytes=&#8221;1342177280&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;loa freebytes=&#8221;0&#8243; totalbytes=&#8221;0&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;/tenured&gt;<br />
&lt;/gc&gt;<br />
&lt;warning details=&#8221;excessive gc activity detected&#8221; /&gt;<br />
&lt;tenured freebytes=&#8221;518352&#8243; totalbytes=&#8221;1342177280&#8243; percent=&#8221;0&#8243; &gt;<br />
&lt;soa freebytes=&#8221;518352&#8243; totalbytes=&#8221;1342177280&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;loa freebytes=&#8221;0&#8243; totalbytes=&#8221;0&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;/tenured&gt;<br />
&lt;time totalms=&#8221;3623.033&#8243; /&gt;<br />
&lt;/af&gt;</p>
<p>&lt;af type=&#8221;tenured&#8221; id=&#8221;1031&#8243; timestamp=&#8221;Tue Nov 04 14:57:30 2008&#8243; intervalms=&#8221;3.715&#8243;&gt;<br />
&lt;minimum requested_bytes=&#8221;120&#8243; /&gt;<br />
&lt;time exclusiveaccessms=&#8221;0.232&#8243; /&gt;<br />
&lt;tenured freebytes=&#8221;0&#8243; totalbytes=&#8221;1342177280&#8243; percent=&#8221;0&#8243; &gt;<br />
&lt;soa freebytes=&#8221;0&#8243; totalbytes=&#8221;1342177280&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;loa freebytes=&#8221;0&#8243; totalbytes=&#8221;0&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;/tenured&gt;<br />
&lt;gc type=&#8221;global&#8221; id=&#8221;1032&#8243; totalid=&#8221;1032&#8243; intervalms=&#8221;4.385&#8243;&gt;<br />
&lt;compaction movecount=&#8221;3170275&#8243; movebytes=&#8221;192337800&#8243; reason=&#8221;<strong>compact to aid heap contraction&#8221; </strong>/&gt;<br />
&lt;contraction type=&#8221;tenured&#8221; amount=&#8221;67108352&#8243; newsize=&#8221;1275068928&#8243; timetaken=&#8221;0.001&#8243; reason=&#8221;<strong>excess free space following gc</strong>&#8221; /&gt;<br />
&lt;refs_cleared soft=&#8221;0&#8243; weak=&#8221;0&#8243; phantom=&#8221;0&#8243; /&gt;<br />
&lt;finalization objectsqueued=&#8221;9&#8243; /&gt;<br />
&lt;timesms mark=&#8221;245.373&#8243; sweep=&#8221;12.272&#8243; compact=&#8221;482.748&#8243; total=&#8221;745.486&#8243; /&gt;<br />
&lt;tenured freebytes=&#8221;1022923992&#8243; totalbytes=&#8221;1275068928&#8243; percent=&#8221;80&#8243; &gt;<br />
&lt;soa freebytes=&#8221;1022923992&#8243; totalbytes=&#8221;1275068928&#8243; percent=&#8221;80&#8243; /&gt;<br />
&lt;loa freebytes=&#8221;0&#8243; totalbytes=&#8221;0&#8243; percent=&#8221;0&#8243; /&gt;<br />
&lt;/tenured&gt;<br />
&lt;/gc&gt;</p></blockquote>
<p style="text-indent: 24pt">考虑到垃圾回收频率也较高，每次请求的空间都不大，所以我讲垃圾回收模式改为了gencon，之后没有OutOfMemory发生。不过我那份回收日志没有留下来，否则应该在文件Compare file中导入修改后生成的日志，进行比较，确定修改的结果。</p>
<p style="text-indent: 24pt"><strong>注意事项：</strong>对于IBM JDK，直接勾选“详细垃圾回收”即可，但是对于HP 或者Sun JDK，最好使用-Xverbosegclog:file_name（生成能解析的XML格式）来指定一下，否则默认文件中会包含其它信息，工具讲无法以图像显示，还要自己修改文件，比较麻烦的。</p>
<p style="text-indent: 24pt">IBM Pattern Modeling and Analysis Tool for Java Garbage Collector (<strong>PMAT</strong>)这个工具大同小异，个人使用它只是觉得提供的优化建议可以和上述工具互补，比如它会计算一个适合的-Xk -Xp值出来。</p>
<p style="text-indent: 24pt">对于HP-UX上生成的垃圾回收日志，我们还可以<a title="用HPjtune分析GC日志" href="http://www.hashei.me/2009/07/use-hpjtune-to-analysis-gc-log.html" target="_blank">用HPjmeter下的HPjtune来分析</a>。</p>
<hr /><h2>Related posts:</h2><ul><li><a href="http://www.hashei.me/2009/07/java-performance-tuning-resources.html" rel="bookmark" title="Permanent Link: Java性能优化参考资料">Java性能优化参考资料</a></li><li><a href="http://www.hashei.me/2010/05/linux-system-performance-monitoring.html" rel="bookmark" title="Permanent Link: Linux 性能监控">Linux 性能监控</a></li><li><a href="http://www.hashei.me/2009/05/adjust-proper-pool-size.html" rel="bookmark" title="Permanent Link: 你需要多大的池？&mdash; WebSphere性能优化（一）">你需要多大的池？&mdash; WebSphere性能优化（一）</a></li><li><a href="http://www.hashei.me/2009/12/java_performance_slides.html" rel="bookmark" title="Permanent Link: 两个关于JAVA性能优化的PPT">两个关于JAVA性能优化的PPT</a></li><li><a href="http://www.hashei.me/2009/05/code-optimization-for-gc.html" rel="bookmark" title="Permanent Link: JAVA性能优化&mdash;编写符合GC胃口的程序">JAVA性能优化&mdash;编写符合GC胃口的程序</a></li></ul><hr /><small>  Copyright &copy; 2008 This feed is for personal, non-commercial use only<br />
<a href=www.hashei.com >聚沙成塔-小哈的记事薄</a> by hashei 
如果喜欢，欢迎订阅<a href=feed.hashei.com >feed.hashei.com</a><br />
Digital Fingerprint:
 10f920a9f2bae51c3c73c4f5fb50a949</small>]]></content:encoded>
			<wfw:commentRss>http://www.hashei.me/2009/06/gc-performance-tuning-with-isa.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>JAVA性能优化-GC日志分析</title>
		<link>http://www.hashei.me/2009/06/analyse-the-gc-logs.html?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=analyse-the-gc-logs</link>
		<comments>http://www.hashei.me/2009/06/analyse-the-gc-logs.html#comments</comments>
		<pubDate>Mon, 01 Jun 2009 15:16:14 +0000</pubDate>
		<dc:creator>hashei</dc:creator>
				<category><![CDATA[Websphere系列]]></category>
		<category><![CDATA[性能优化]]></category>
		<category><![CDATA[gc performance tuning]]></category>
		<category><![CDATA[gc日志分析]]></category>
		<category><![CDATA[内存优化]]></category>

		<guid isPermaLink="false">http://www.hashei.me/2009/06/analyse-the-gc-logs.html</guid>
		<description><![CDATA[如何分析WebSphere产生的GC日志]]></description>
			<content:encoded><![CDATA[<p style="text-indent: 24pt">前两篇说到IBM JDK和Sun的HotSpot JDK的调优策略，当中一直提到的重要一点是<strong>需要根据GC详细日志来调整参数的设置</strong>，那么当我们收集到日志后如何分析，如何根据日志的情况来调整参数？这就是本文所要阐述的。</p>
<p style="text-indent: 24pt">使用IBM的JDK的Windows平台和AIX平台，我们只要在WebSphere管理控制台的java进程属性里勾选“详细垃圾回收”，那么就会在native_stdout.log中生成如下的信息。</p>
<p><a href="http://hashei.me/wp-content/uploads/2009/06/image.png"><img style="border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" src="http://hashei.me/wp-content/uploads/2009/06/image-thumb.png" border="0" alt="image" width="606" height="341" /></a></p>
<p style="text-indent: 24pt">这幅图很形象的给出了gc日志的主要关注点：垃圾回收的原因、垃圾回收的间隔、垃圾回收前后的剩余空间、垃圾回收持续的时间……</p>
<p style="text-indent: 24pt">“nursery”表示这次分配失败（Allocation Failure）发生在新生代（<a title="New area allocation failures" href="http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/tools/gcpd_verbosegc_alloc_new.html" target="_blank">nursery</a>），是第44次（id=44）因为新生代的分配失败而进行垃圾回收了（开启GC日志以来），离上一次发生GC的间隔是12746ms，无法分配的空间大小是8216Byte，而进行垃圾回收前，新生代的可用空间为1776Byte，小于8216Byte，虽然年老区还剩余45%的空间，但是新的内存空间是无法直接在年老区分配的，由此引发了一次清理过程（<a title="Scavenger collections" href="http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/tools/gcpd_verbosegc_scavenger.html" target="_blank">scavenger</a>）。</p>
<p style="text-indent: 24pt">GC type表明了这次垃圾回收是一个清理过程，也是第44次scavenger过程，同时恰是第44个gc过程，说明没有发生过诸如<a title="Global collections" href="http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=/com.ibm.java.doc.diagnostics.50/diag/tools/gcpd_verbosegc_global.html" target="_blank">&lt;gc type=&#8221;global&#8221;&gt;</a>的垃圾回收过程。flipped objectcount说明将要把4523143个存活下来的对象被复制到了幸存区（survivor space），而73768个对象则经过多次幸存区的复制，有幸熬出头，被转移到了长存区（tenured space）。我们看到清理的倾斜比率（scavenger tiltratio）为89%，而不是对半开，说明经过多次复制清理，JVM已经意识到每次只有很少的对象能存活下来，于是它自动增大了年轻代中Eden区的大小，以使得为新对象可以腾出更多的内存。</p>
<p style="text-indent: 24pt">接下来的就比较简单，经过垃圾回收，新生代的空间剩余89%，因为分配失败发生在新生代，进行的是快速的Minor gc，所以长存区的可用空间依然是45%，这次回收的时间为384.469ms。在长存区发生的是Major gc，回收时间一般要长于Minor gc，所以健康的JVM 环境Minor gc：Minor gc=1：10（也不用太在意）。</p>
<p style="text-indent: 24pt">在垃圾回收准备开始的那一段时间（time exclusiveaccessms），以及回收的过程中，另一个线程发现内存无法分配了，于是也要求一次gc过程，这时候就产生了gc队列（会有&lt;warning details=&#8221;exclusive access time includes previous garbage collections&#8221; /&gt;显示）。一般前一次垃圾回收就会释放出足够这两次分配需要的空间，于是第二次gc过程就终止了，当然要是无法足够分配的话，马上就会再进行一次垃圾回收。不过这种情况下，估计要进行Full GC了。</p>
<p style="text-indent: 24pt">Full GC的gc type就是global，这是stop the world的最耗费时间的回收方式，所以需要通过尽量调整参数来避免。如果发现不是由AF引起的，而是在开头写着SYS标签，那么就要好好问问开发，有没有使用System.gc()的必要？可以的话使用<strong>-Xdisableexplicitgc</strong>来禁止（Sun等JDK下为<strong>-XX:+DisableExplicitGC</strong>）。</p>
<p style="text-indent: 24pt">以上所说的都是IBM JDK下垃圾回收日志的情况。在Sun和HP的JDK下情况相似，不过需要使用<strong>-XX:PrintHeapAtGC</strong>:参数来打印GC前后的详细堆栈信息。另外我建议加上<strong>-Xloggc:filename</strong><strong><span style="font-weight: normal;">或者</span>-Xverbosegclog:file_name（方便用工具分析）<span style="font-weight: normal;">输出到特定文件，因为不知为何有时候会输出到native_stderr.log，或者在native_stdout.log中和thread dump夹杂在一起，不方便分析。</span></strong></p>
<p style="text-indent: 24pt"><strong> </strong></p>
<blockquote><p>{Heap before GC invocations=116:<br />
Heap<br />
def new generation   total 157376K, used 139904K [63400000, 6dec0000, 78950000)<br />
eden space 139904K, 100% used [63400000, 6bca0000, 6bca0000)<br />
from space 17472K,   0% used [6bca0000, 6bca0000, 6cdb0000)<br />
to   space 17472K,   0% used [6cdb0000, 6cdb0000, 6dec0000)<br />
tenured generation   total 349568K, used 79067K [38800000, 4dd60000, 632b0000)<br />
the space 349568K,  22% used [38800000, 3d536ce0, 3d536e00, 4dd60000)<br />
compacting perm gen  total 132096K, used 132023K [28800000, 30900000, 38800000)<br />
the space 132096K,  99% used [28800000, 308edf50, 308ee000, 30900000)<br />
[GC 218971K-&gt;83116K(506944K), 0.0976948 secs]<br />
Heap after GC invocations=117:<br />
Heap<br />
def new generation   total 157376K, used 4049K [63400000, 6dec0000, 78950000)<br />
eden space 139904K,   0% used [63400000, 63400000, 6bca0000)<br />
from space 17472K,  23% used [6cdb0000, 6d1a4628, 6dec0000)<br />
to   space 17472K,   0% used [6bca0000, 6bca0000, 6cdb0000)<br />
tenured generation   total 349568K, used 79067K [38800000, 4dd60000, 632b0000)<br />
the space 349568K,  22% used [38800000, 3d536ce0, 3d536e00, 4dd60000)<br />
compacting perm gen  total 132096K, used 132023K [28800000, 30900000, 38800000)<br />
the space 132096K,  99% used [28800000, 308edf50, 308ee000, 30900000)<br />
}</p></blockquote>
<p style="text-indent: 24pt">这是一个在使用HPJDK输出的实例，基本和IBM JDK没啥区别，可以加上<strong>-XX:+PrintGCTimeStamps</strong>显示每次回收的间隔。</p>
<p style="text-indent: 24pt">这些“人肉”分析可以让我们清楚JVM运行的情况，但是还是不够直观，所以下次会介绍分析JVM日志的工具，尽情期待。现已完成，<a title="用工具分析GC日志" href="http://www.hashei.me/2009/06/gc-performance-tuning-with-isa.html" target="_blank">欢迎访问</a></p>
<hr /><h2>Related posts:</h2><ul><li><a href="http://www.hashei.me/2009/04/was-too-many-open-files.html" rel="bookmark" title="Permanent Link: 一次因为系统参数而导致的WAS无响应">一次因为系统参数而导致的WAS无响应</a></li><li><a href="http://www.hashei.me/2009/08/java-heap-fragmentation-with-ibm-jdk.html" rel="bookmark" title="Permanent Link: IBM JDK的Java堆空间的碎片问题">IBM JDK的Java堆空间的碎片问题</a></li><li><a href="http://www.hashei.me/2009/06/gc-performance-tuning-with-isa.html" rel="bookmark" title="Permanent Link: WebSphere troubshooting-用工具分析GC Log">WebSphere troubshooting-用工具分析GC Log</a></li><li><a href="http://www.hashei.me/2009/09/basic_websphere_troubleshooting.html" rel="bookmark" title="Permanent Link: WebSphere简单故障排查">WebSphere简单故障排查</a></li><li><a href="http://www.hashei.me/2009/09/investigating_out_of_memory_and_memory_leak_problems.html" rel="bookmark" title="Permanent Link: Investigating Out of Memory/Memory Leak Problems">Investigating Out of Memory/Memory Leak Problems</a></li></ul><hr /><small>  Copyright &copy; 2008 This feed is for personal, non-commercial use only<br />
<a href=www.hashei.com >聚沙成塔-小哈的记事薄</a> by hashei 
如果喜欢，欢迎订阅<a href=feed.hashei.com >feed.hashei.com</a><br />
Digital Fingerprint:
 10f920a9f2bae51c3c73c4f5fb50a949</small>]]></content:encoded>
			<wfw:commentRss>http://www.hashei.me/2009/06/analyse-the-gc-logs.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

