﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-金鳞-文章分类-java</title><link>http://www.cnitblog.com/chenxin9821/category/8603.html</link><description>目标-&gt;软件测试架构师</description><language>zh-cn</language><lastBuildDate>Tue, 27 Sep 2011 22:52:14 GMT</lastBuildDate><pubDate>Tue, 27 Sep 2011 22:52:14 GMT</pubDate><ttl>60</ttl><item><title>OLTP和OLAP</title><link>http://www.cnitblog.com/chenxin9821/articles/65672.html</link><dc:creator>金鳞</dc:creator><author>金鳞</author><pubDate>Wed, 28 Apr 2010 06:47:00 GMT</pubDate><guid>http://www.cnitblog.com/chenxin9821/articles/65672.html</guid><wfw:comment>http://www.cnitblog.com/chenxin9821/comments/65672.html</wfw:comment><comments>http://www.cnitblog.com/chenxin9821/articles/65672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chenxin9821/comments/commentRss/65672.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chenxin9821/services/trackbacks/65672.html</trackback:ping><description><![CDATA[<div class=blog_content>联机事务处理（OLTP）和联机分析处理（OLAP）的不同，主要通过以下五点区分开来。 <br>用户和系统的面向性: <br>OLTP是面向顾客的,用于事务和查询处理 <br>OLAP是面向市场的,用于数据分析 <br>数据内容: <br>OLTP系统管理当前数据. <br>OLAP系统管理大量历史数据,提供汇总和聚集机制. <br>数据库设计: <br>OLTP采用实体-联系ER模型和面向应用的数据库设计. <br>OLAP采用星型或雪花模型和面向主题的数据库设计. <br>视图: <br>OLTP主要关注一个企业或部门内部的当前数据,不涉及历史数据或不同组织的数据 <br>OLAP则相反. <br>访问模式: <br>OLTP系统的访问主要由短的原子事务组成.这种系统需要并行和恢复机制. <br>OLAP系统的访问大部分是只读操作<br><br><br>OLTP是传统的关系型数据库的主要应用，主要是基本的、日常的事务处理，例如银行交易。<br>OLAP是数据仓库系统的主要应用，支持复杂的分析操作，侧重决策支持，并且提供直观易懂的查询结果。<br><br>下表列出了OLTP与OLAP之间的比较:<br>
<table style="WIDTH: 491px; HEIGHT: 293px" cellPadding=0 width=491 align=center border=1>
    <tbody>
        <tr>
            <td width=80 height=23></td>
            <td style="BACKGROUND-COLOR: rgb(255,255,255)" align=middle width=177><font style="BACKGROUND-COLOR: rgb(255,255,255)" color=#000000><font size=2><font size=+0><strong>OLTP</strong></font></font></font></td>
            <td width=176>
            <p align=center><font color=#000066 size=2><strong>OLAP</strong></font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>用户</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>操作人员，低层管理人员</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>决策人员，高级管理人员</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>功能</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>日常操作处理</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>分析决策</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>DB 设计</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>面向应用</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>面向主题</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>数据</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>最新的，细节的，二维的，分立的</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>历史的，聚集的，多维的，集成的</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>存取规模</font></p>
            </td>
            <td>
            <p align=center><font color=#000066><font size=2>读/写数条（甚至数百条）记录</font></font></p>
            </td>
            <td>
            <p align=center><font color=#000066><font size=+0><font size=2>读上百万（甚至上亿）条记录</font></font></font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>操作频度</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>非常频繁（以秒计）</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>比较稀松（以小时甚至以周计）</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>工作单位</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>严格的事务</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>复杂的查询</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>用户数</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>数百个-数千万个</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>数个-数百个</font></p>
            </td>
        </tr>
        <tr>
            <td>
            <p align=center><font color=#000066 size=2>DB 大小</font></p>
            </td>
            <td>
            <p align=center><font color=#000066 size=2>100MB-GB</font></p>
            </td>
            <td>
            <p align=center><font color=#000066><font size=2>100GB-TB</font></font></p>
            </td>
        </tr>
    </tbody>
</table>
转载自 <a href="http://feigme.javaeye.com/blog/149641">http://feigme.javaeye.com/blog/149641</a> <script type=text/javascript><!--
google_ad_client = "pub-4348265167276910";
/* 468x60, 个人博客 */
google_ad_slot = "2046406163";
google_ad_width = 468;
google_ad_height = 60;
//-->
</script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript>
</script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script src="http://pagead2.googlesyndication.com/pagead/render_ads.js"></script><script>google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);</script></div>
<img src ="http://www.cnitblog.com/chenxin9821/aggbug/65672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chenxin9821/" target="_blank">金鳞</a> 2010-04-28 14:47 <a href="http://www.cnitblog.com/chenxin9821/articles/65672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JVM 垃圾回收机制与GC性能调优</title><link>http://www.cnitblog.com/chenxin9821/articles/64471.html</link><dc:creator>金鳞</dc:creator><author>金鳞</author><pubDate>Wed, 03 Mar 2010 07:27:00 GMT</pubDate><guid>http://www.cnitblog.com/chenxin9821/articles/64471.html</guid><wfw:comment>http://www.cnitblog.com/chenxin9821/comments/64471.html</wfw:comment><comments>http://www.cnitblog.com/chenxin9821/articles/64471.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chenxin9821/comments/commentRss/64471.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chenxin9821/services/trackbacks/64471.html</trackback:ping><description><![CDATA[<p>转自：<a href="http://www.51testing.com/?uid-23978-action-viewspace-itemid-141684">http://www.51testing.com/?uid-23978-action-viewspace-itemid-141684</a><font face=宋体 size=2><strong><br><br>一、GC概要：</strong></font></p>
<p><font face=宋体>JVM堆相关知识<br>&nbsp;&nbsp;&nbsp; 为什么先说JVM堆?<br>&nbsp;&nbsp;&nbsp; JVM的堆是Java对象的活动空间，程序中的类的对象从中分配空间，其存储着正在运行着的应用程序用到的所有对象。这些对象的建立方式就是那些new一类的操作，当对象无用后，是GC来负责这个无用的对象(地球人都知道)。<br><font color=#ff0000>JVM堆<br>&nbsp;&nbsp;&nbsp; (1) 新域：存储所有新成生的对象<br>&nbsp;&nbsp;&nbsp; (2) 旧域：新域中的对象，经过了一定次数的GC循环后，被移入旧域<br>&nbsp;&nbsp;&nbsp; (3)永久域：存储类和方法对象，从配置的角度看，这个域是独立的，不包括在JVM堆内。默认为4M。</font></font></p>
<p><font face=宋体><font color=#000000 size=2>新域会被分为3个部分：1.第一个部分叫Eden。(伊甸园？？可能是因为亚当和夏娃是人类最早的活动对象？)2.另两个部分称为辅助生存空间(幼儿园)，我这里一个称为A空间(From sqace)，一个称为B空间(To Space)。</font></font></p>
<p><font face=宋体 size=2></font></p>
<p><font face=宋体 size=2><a href="http://www.51testing.com/batch.download.php?aid=15066" target=_blank><img style="WIDTH: 400px" src="http://www.51testing.com/attachments/2009/07/23978_200907270935251R6en.jpg" border=0></a></font></p>
<p><font face=宋体 size=2>GC浅谈:<br>GC的<a onclick="javascript:tagshow(event, '%B9%A4%D7%F7');" href="javascript:;" target=_self><u><strong><font color=#3399cc>工作</font></strong></u></a>目的很明确：在堆中，找到已经无用的对象，并把这些对象占用的空间收回使其可以重新利用.</font><font face=宋体 size=2>大多数<a onclick="javascript:tagshow(event, '%C0%AC%BB%F8%BB%D8%CA%D5');" href="javascript:;" target=_self><u><strong><font color=#3399cc>垃圾回收</font></strong></u></a>的算法思路都是一致的：把所有对象组成一个集合，或可以理解为树状结构，从树根开始找，只要可以找到的都是活动对象，如果找不到，这个对象就是凋零的昨日黄花，应该被回收了。</font><font face=宋体 size=2><br>在sun 的文档说明中，对JVM堆的新域，是采用<font color=#ff0000>coping算法</font>，该算法的提出是为了克服句柄的开销和解决堆碎片的垃圾回收。它开始时把堆分成一个对象面和多个空闲面，程序从对象面为对象分配空间，当对象满了，基于 coping算法的垃圾收集就从根集中扫描活动对象，并将每个活动对象复制到空闲面(使得活动对象所占的内存之间没有空闲洞)，这样空闲面变成了对象面，原来的对象面变成了空闲面，程序会在新的对象面中分配内存。</font></p>
<pre><font face=宋体 size=2>对于新生成的对象，都放在Eden中；当Eden充满时（小孩太多了），GC将开始工作，首先停止应用程序的运行，开始收集垃圾，把所有可找到的对象都复制到A空间中，一旦当A空间充满，GC就把在A空间中可找到的对象都复制到B空间中(会覆盖原有的存储对象)，当B空间满的时间，GC就把在B空间中可找到的对象都复制到A空间中，AB在这个过程中互换角色，那位客官说了：拷来拷去，烦不烦啊？什么时候是头？您别急，在活动对象经过一定次数的GC操作后，这些活动对象就会被放到旧域中。对于这些活动对象，新域的幼儿园<a onclick="javascript:tagshow(event, '%C9%FA%BB%EE');" href="javascript:;" target=_self><u><strong><font color=#3399cc>生活</font></strong></u></a>结束了。</font><br><font face=宋体 size=2>新域为什么要这么折腾？<br>起初在这块我也很迷糊，又查了些资料，原来是这样：应用程序生成的绝大部分对象都是短命的，copying算法最理想的状态是，所有移出Eden的对象都会被收集，因为这些都是短命鬼，经过一定次数的GC后应该被收集，那么移入到旧域的对象都是长命的，这样可以防止AB空间的来回复制影响应用程序。<br>实际上这种理想状态是很难达到的，应用程序中不可避免地存在长命的对象，copying算法的发明者要这些对象都尽量放在新域中，以保证小范围的复制，压缩旧域的开销可比新域中的复制大得多(旧域在下面说)。</font></pre>
<pre>对于旧域，采用的是<font color=#ff0000>tracing算法</font>的一种，称为标记-清除-压缩收集器，注意，这有一个压缩，这是个开销挺大的操作。</pre>
<pre><font face=宋体 size=2>垃圾回收主要是对Young Generation块和Old Generation块内存进行回收，YG用来放新产生的对象，经过几次回收还没回收掉的对象往OG中移动，对YG进行垃圾回收又叫做MinorGC，对OG垃圾回收又叫MajorGC，两块内存回收互不干涉。</font></pre>
<div align=left><font face=宋体><font size=2><strong>二、Gc 流程</strong>：</font></font></div>
<div align=left><font face=宋体 size=2>[older generation][survivor 1][survivor 2][eden]</font></div>
<div align=left><font face=宋体 size=2></font></div>
<div align=left><font face=宋体 size=2>*young generation=eden + survivor</font></div>
<div align=left><font face=宋体 size=2></font></div>
<div align=left><font face=宋体 size=2>1.当eden满了，触发young GC；</font></div>
<div align=left><font face=宋体 size=2>2.young GC做2件事：一，去掉一部分没用的object；二</font><font face=宋体 size=2>，把老的还被引用的object发到survior里面，等下几次GC以后，survivor再放到old里面。</font></div>
<div align=left><font face=宋体 size=2>3.当old满了，触发full GC。full GC很消耗内存，把old，young里面大部分垃圾回收掉。这个时候用户线程都会被block。</font></div>
<div align=left><font face=宋体 size=2></font>&nbsp;</div>
<div align=left><font face=宋体 size=2><strong>三、young generation比例越大,不一定最好。</strong></font></div>
<div align=left><font face=宋体 color=#000000 size=2>将young的大小设置为大于总堆大小的一半时会造成效率低下。如果设置得过小，又会因为young generation收集程序不得不频繁运行而造成瓶颈。</font></div>
<div align=left><font face=宋体 size=2></font>&nbsp;</div>
<div align=left><font face=宋体 size=2></font></div>
<div align=left><font face=宋体 size=2><strong>四、总结</strong></font></div>
<div align=left><font face=宋体 size=2>从上面的推导可以得出很多结论，下面是前辈的经验总结与自已的认识<br>1.JVM堆的大小决定了GC的运行时间。如果JVM堆的大小超过一定的限度，那么GC的运行时间会很长。<br>2.对象生存的时间越长，GC需要的回收时间也越长，影响了回收速度。<br>3.大多数对象都是短命的，所以，如果能让这些对象的生存期在GC的一次运行周期内，wonderful！<br>4.应用程序中，建立与释放对象的速度决定了垃圾收集的频率。<br>5.如果GC一次运行周期超过3-5秒，这会很影响应用程序的运行，如果可以，应该减少JVM堆的大小了。<br>6.前辈经验之谈：通常情况下，JVM堆的大小应为物理内存的80%。</font></div>
<div align=left><font face=宋体 size=2></font><br><em><strong>五、看案例：</strong><br>jmap -heap 2343<br>Attaching to process ID 2343, please wait...<br>Debugger attached successfully.<br>Server compiler detected.<br>JVM version is 11.0-b16<br><br><span>using thread-local object allocation.</span><br><span>Parallel GC with 8 thread(s)</span><br><br>Heap Configuration:<br>&nbsp;&nbsp; MinHeapFreeRatio = 40<br>&nbsp;&nbsp; MaxHeapFreeRatio = 70<br>&nbsp;&nbsp; MaxHeapSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 4294967296 (4096.0MB)<br>&nbsp;&nbsp; NewSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2686976 (2.5625MB)<br>&nbsp;&nbsp; MaxNewSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = -65536 (-0.0625MB)<br>&nbsp;&nbsp; OldSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 5439488 (5.1875MB)<br>&nbsp;&nbsp; NewRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span>（YG，OG 大小比为1：2）</span><br>&nbsp;&nbsp; SurvivorRatio&nbsp;&nbsp;&nbsp; = 8<br>&nbsp;&nbsp; PermSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 21757952 (20.75MB)<br>&nbsp;&nbsp; MaxPermSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 268435456 (256.0MB)<br><br>Heap Usage:<br>PS Young Generation<br><span>Eden Space:</span><br><span>&nbsp;&nbsp; capacity = 1260060672 (1201.6875MB)</span><br><span>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 64868288 (61.86322021484375MB)</span><br><span>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 1195192384 (1139.8242797851562MB)</span><br><span>&nbsp;&nbsp; 5.148028935546367% used</span><br><span>From Space:</span><br><span>&nbsp;&nbsp; capacity = 85524480 (81.5625MB)</span><br><span>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 59457648 (56.70323181152344MB)</span><br><span>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 26066832 (24.859268188476562MB)</span><br><span>&nbsp;&nbsp; 69.52120375359195% used</span><br><span>To Space:</span><br><span>&nbsp;&nbsp; capacity = 85852160 (81.875MB)</span><br><span>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 0 (0.0MB)</span><br><span>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 85852160 (81.875MB)</span><br><span>&nbsp;&nbsp; 0.0% used</span><br>~~~~~~~~~~~~~~~~~~~~~~~~~~这三块为上面所说的YG大小和使用情况<br>PS Old Generation<br>&nbsp;&nbsp; capacity = 2291138560 (2185.0MB)<br>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 1747845928 (1666.8757705688477MB)<br>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 543292632 (518.1242294311523MB)<br>&nbsp;&nbsp; 76.28722062099989% used<br>~~~~~~~~~~~~~~~~~~~~~~~~~~OG大小和使用情况<br>PS Perm Generation<br>&nbsp;&nbsp; capacity = 108265472 (103.25MB)<br>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 107650712 (102.6637191772461MB)<br>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 614760 (0.5862808227539062MB)<br>&nbsp;&nbsp; 99.43217353728436% used<br><br>这台机器简单说YG内存1G，OG内存2G，总内存4G<br>在这样的配置下，GC运行情况：<br>jstat -gcutil -h5 2343 4s 100<br>&nbsp; S0&nbsp;&nbsp;&nbsp;&nbsp; S1&nbsp;&nbsp;&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P&nbsp;&nbsp;&nbsp;&nbsp; YGC&nbsp;&nbsp;&nbsp;&nbsp; YGCT&nbsp;&nbsp;&nbsp; FGC&nbsp;&nbsp;&nbsp; FGCT&nbsp;&nbsp;&nbsp;&nbsp; GCT&nbsp;&nbsp;<br>&nbsp;79.82&nbsp;&nbsp; 0.00&nbsp; 75.34&nbsp; 78.55&nbsp; 99.44&nbsp;&nbsp; 7646 1221.668&nbsp;&nbsp; 398 2052.993 3274.661<br>&nbsp; 0.00&nbsp; 79.52&nbsp;&nbsp; 0.62&nbsp; 78.63&nbsp; 99.44&nbsp;&nbsp; 7647 1221.782&nbsp;&nbsp; 398 2052.993 3274.775&nbsp;<span>这里发生了一次YG GC，也就是MinorGC，耗时0.12s</span><br>&nbsp; 0.00&nbsp; 79.52&nbsp; 28.95&nbsp; 78.63&nbsp; 99.44&nbsp;&nbsp; 7647 1221.782&nbsp;&nbsp; 398 2052.993 3274.775<br>&nbsp; 0.00&nbsp; 79.52&nbsp; 46.34&nbsp; 78.63&nbsp; 99.44&nbsp;&nbsp; 7647 1221.782&nbsp;&nbsp; 398 2052.993 3274.775<br><br><span>同时可以看到总共进行了398次Major GC 总耗时2052.993 所以每次Major GC时间为：2052.993/398=5.16秒</span><br><span>这是个很严重的问题，进行Major GC的时候程序会暂停，无法响应，居然会暂停5秒多，这谁都无法接受吧 :)</span><br><span>同样Minor GC进行了7647次，总用时1221.782 平均时间为0.16秒，算是可以接受</span><br><br><br><span>再来看看修改配置后：</span><br>jmap -heap 14103<br>Attaching to process ID 14103, please wait...<br>Debugger attached successfully.<br>Server compiler detected.<br>JVM version is 11.0-b16<br><br><span>using parallel threads in the new generation.</span><br><span>using thread-local object allocation.</span><br><span>Concurrent Mark-Sweep GC</span><br><br>Heap Configuration:<br>&nbsp;&nbsp; MinHeapFreeRatio = 40<br>&nbsp;&nbsp; MaxHeapFreeRatio = 70<br>&nbsp;&nbsp; MaxHeapSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 4294967296 (4096.0MB)<br>&nbsp;&nbsp; NewSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 536870912 (512.0MB)<br>&nbsp;&nbsp; MaxNewSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 536870912 (512.0MB)<br>&nbsp;&nbsp; OldSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 5439488 (5.1875MB)<br>&nbsp;&nbsp; NewRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =<span>4&nbsp;</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; YG：OG&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1：4 &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp; SurvivorRatio&nbsp;&nbsp;&nbsp; = 8<br>&nbsp;&nbsp; PermSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 268435456 (256.0MB)<br>&nbsp;&nbsp; MaxPermSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 268435456 (256.0MB)<br><br>Heap Usage:<br><span>New Generation (Eden + 1 Survivor Space):</span><br><span>&nbsp;&nbsp; capacity = 483196928 (460.8125MB)</span><br><span>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 428284392 (408.4438247680664MB)</span><br><span>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 54912536 (52.368675231933594MB)</span><br><span>&nbsp;&nbsp; 88.63557841162434% used</span><br><span>Eden Space:</span><br><span>&nbsp;&nbsp; capacity = 429522944 (409.625MB)</span><br><span>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 404788608 (386.0364990234375MB)</span><br><span>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 24734336 (23.5885009765625MB)</span><br><span>&nbsp;&nbsp; 94.24144010337199% used</span><br><span>From Space:</span><br><span>&nbsp;&nbsp; capacity = 53673984 (51.1875MB)</span><br><span>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 23495784 (22.407325744628906MB)</span><br><span>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 30178200 (28.780174255371094MB)</span><br><span>&nbsp;&nbsp; 43.77499534970238% used</span><br><span>To Space:</span><br><span>&nbsp;&nbsp; capacity = 53673984 (51.1875MB)</span><br><span>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 0 (0.0MB)</span><br><span>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 53673984 (51.1875MB)</span><br><span>&nbsp;&nbsp; 0.0% used</span><br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~YG 大小和使用状态<br>concurrent mark-sweep generation:<br>&nbsp;&nbsp; capacity = 3758096384 (3584.0MB)<br>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 1680041600 (1602.2125244140625MB)<br>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 2078054784 (1981.7874755859375MB)<br>&nbsp;&nbsp; 44.70459052494594% used<br>~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~OG 大小和使用状态<br>Perm Generation:<br>&nbsp;&nbsp; capacity = 268435456 (256.0MB)<br>&nbsp;&nbsp; used&nbsp;&nbsp;&nbsp;&nbsp; = 128012184 (122.0819320678711MB)<br>&nbsp;&nbsp; free&nbsp;&nbsp;&nbsp;&nbsp; = 140423272 (133.9180679321289MB)<br>&nbsp;&nbsp; 47.688254714012146% used<br><br>在这个配置下，GC运行情况：<br>jstat -gcutil -h5 14103 4s 100<br>&nbsp; S0&nbsp;&nbsp;&nbsp;&nbsp; S1&nbsp;&nbsp;&nbsp;&nbsp; E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; O&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; P&nbsp;&nbsp;&nbsp;&nbsp; YGC&nbsp;&nbsp;&nbsp;&nbsp; YGCT&nbsp;&nbsp;&nbsp; FGC&nbsp;&nbsp;&nbsp; FGCT&nbsp;&nbsp;&nbsp;&nbsp; GCT&nbsp;&nbsp;<br>&nbsp;47.49&nbsp;&nbsp; 0.00&nbsp; 64.82&nbsp; 46.08&nbsp; 47.69&nbsp; 20822 2058.631&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp; 22.734 2081.365<br>&nbsp; 0.00&nbsp; 37.91&nbsp; 38.57&nbsp; 46.13&nbsp; 47.69&nbsp; 20823 2058.691&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp; 22.734 2081.425&nbsp;<span>这里发生了一次YG GC，也就是MinorGC，耗时0.06s</span><br>&nbsp;46.69&nbsp;&nbsp; 0.00&nbsp; 15.19&nbsp; 46.18&nbsp; 47.69&nbsp; 20824 2058.776&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp; 22.734 2081.510<br>&nbsp;46.69&nbsp;&nbsp; 0.00&nbsp; 74.59&nbsp; 46.18&nbsp; 47.69&nbsp; 20824 2058.776&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp; 22.734 2081.510<br>&nbsp; 0.00&nbsp; 40.29&nbsp; 19.95&nbsp; 46.24&nbsp; 47.69&nbsp; 20825 2058.848&nbsp;&nbsp;&nbsp; 68&nbsp;&nbsp; 22.734 2081.582<br><br><span>MajorGC平均时间：22.734/68=0.334秒（上面是5秒多吧）</span><br><span>MinorGC平均时间：2058.691/20823=0.099秒（比上面略少）</span></em></div>
<br>
<img src ="http://www.cnitblog.com/chenxin9821/aggbug/64471.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chenxin9821/" target="_blank">金鳞</a> 2010-03-03 15:27 <a href="http://www.cnitblog.com/chenxin9821/articles/64471.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>利用jvmstat进行jvm性能监视</title><link>http://www.cnitblog.com/chenxin9821/articles/64469.html</link><dc:creator>金鳞</dc:creator><author>金鳞</author><pubDate>Wed, 03 Mar 2010 06:27:00 GMT</pubDate><guid>http://www.cnitblog.com/chenxin9821/articles/64469.html</guid><wfw:comment>http://www.cnitblog.com/chenxin9821/comments/64469.html</wfw:comment><comments>http://www.cnitblog.com/chenxin9821/articles/64469.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chenxin9821/comments/commentRss/64469.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chenxin9821/services/trackbacks/64469.html</trackback:ping><description><![CDATA[最近需要在 Linux 系统上对 Java 的应用系统进行监测，就用到了 JDK1.5 附带的工具 jps （ Java Virtual Machine Process Status Tool ，查看 JVM 进程状态的工具）， jstat(Java Virtual Machine Statistics Monitoring Tool ，运行数据监测工具 ) 以及 jstatd （ jstat 的 daemon 程序，利用 RMI 进行远程监控）。（建议可以使用 jvmstat 包，可视化的 jstat 监控工具，可以在 http://java.sun.com/performance/jvmstat/ 下载）
<p style="MARGIN: 0cm 0cm 0pt"></p>
<p style="MARGIN: 0cm 0cm 0pt">部署过程描述如下： </p>
<p style="MARGIN: 0cm 0cm 0pt"></p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">1. 在需要监测的机器（我这里是 Linux 机器）部署相关应用： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">a)在你需要进行监测的机器上安装 JDK1.5 （狂晕一阵子），别倒下（这个部分就不多说了，因为如果这里还要解释的话，那我就晕了）。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">b)正确设置 Java 的运行环境。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">c)启动 jstatd 进程。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">命令如下： ./jstatd -J-Djava.security.policy=all.policy </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">一般来说呢，这里是会出现问题的，那就是 permission 的问题了，还好， Sun 的网站上给了相关的解决方法，方法如下，在 vi $JAVA_HOME/jre/lib/security/java.policy文件中添加下面的代码： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">grant codebase "file:${java.home}/../lib/tools.jar" { </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: 21pt">permission java.security.AllPermission; </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">}; </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">然后重新启动 jstatd 进程。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">d)完了，别让人乱动就好了，我经常是不小心就按 CTRL+C 把程序关闭了。 </p>
<p style="MARGIN: 0cm 0cm 0pt 18pt; TEXT-INDENT: -18pt">2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 在客户端（监控者使用的机器）的操作： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">a)使用 jps 查看远端机器有哪些 JVM 进程在使用当中，命令如下： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">jps 172.25.1.24 // 远端机器的 IP 地址或名称 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">屏幕输入如下： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">13686 Jstatd </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">14115 XXXJavaServer </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">15117 Jserver </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">b)从上面可以看到远端机器的 Jstatd 进程已经启动起来了。我们就可以使用 jstat 对相关进程的具体情况进行查看。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">Jstat 命令用法如下： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">jstat -&lt;option&gt; [-t] [-h&lt;lines&gt;] &lt;vmid&gt; [&lt;interval&gt; [&lt;count&gt;]] </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">解释如下： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">Option 包括以下选项： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-class </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-compiler </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gc </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gccapacity </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gccause </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gcnew </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gcnewcapacity </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gcold </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gcoldcapacity </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gcpermcapacity </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-gcutil </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">-printcompilation </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt"></p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">Vmid 就是 jps 查看到的进程 id ，如上 Jserver 的进程 id 是 15117 。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">Interval 是时间间隔，单位为毫秒， 1000 就是一秒。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">Count 就是需要查看的次数。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt"></p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">例子假设我们需要查看 172.25.1.24 机器 vmid 为 15117 的 gc 的情况，可以输入下面的命令： </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">jstat -gc 15117@172.25.1.24 1000 3 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">然后你能看到四行信息（一行为 title ，剩下的就是你要的信息了），仔细看看就可以发现很多信息的了。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt; TEXT-INDENT: -21pt">c) 那么下面就开始配置可视化的监控包， jvmstat ，下载好了后，解压到任意目录。 </p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">执行 visualgc ，然后就可以看到可视化的监控窗口。</p>
<p style="MARGIN: 0cm 0cm 0pt 42pt">例： </p>
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; java -Xbootclasspath/p:"c:\Program Files\Java\jdk1.5.0_06\lib\tools.jar" -jar e:\jvmstat-3_0\jvmstat\jars\visualgc.jar 9088@10.5.1.116
<p style="MARGIN: 0cm 0cm 0pt 42pt">成功执行后你就能看见一个 java 的监视窗口（样子还蛮专业的），这个时候就 可以开始监视了。</p>
<br>以下提供一个短程序，您可以运行来测试使用 <code>jvmstat</code> 进行监视。<br>
<pre class=displaycode>StatGen.java<br>import java.util.ArrayList;<br>import java.util.List;<br><br>public class StatGen {<br><br>    static final int MAX_BLOCK = 8*1024*100;<br><br>    public static void main(String[] args) {<br>        try{<br>            int numLoops = 1;<br>            if (args.length &gt; 0){<br>                 numLoops = Integer.parseInt(args[0]);<br>            }<br>            System.out.println("#loops="+numLoops);<br>            <br>            List&lt;long[]&gt; list = new ArrayList&lt;long[]&gt;(numLoops);<br>            for (int i=0;i&lt;numLoops;i++){<br>                int sz = (int) (Math.random()*MAX_BLOCK);<br>                long[] garbage = new long[sz];<br>                if (sz % 5 == 0){<br>                    list.add(garbage);<br>                }<br>                System.out.println("Sleeping 0.5s");<br>                Thread.sleep(500);<br>            }<br>            System.out.println("Done");<br>        } catch (Throwable t) {<br>              t.printStackTrace();<br>        }<br>        System.exit(0);<br>    }<br>}</pre>
<br><br>参考：<br><a href="http://www.mit.msn.to/devel/jvmstat.html" target=_blank><font color=#0000ff><u>http://www.mit.msn.to/devel/jvmstat.html</u></font></a><br><a href="http://www.ibm.com/developerworks/cn/opensource/os-ag-stats/index.html" target=_blank><u><font color=#0000ff>http://www.ibm.com/developerworks/cn/opensource/os-ag-stats/index.html</font></u></a><br>原文地址：<br><a href="http://hi.baidu.com/tister/blog/item/cf36f8dd0d62d2ee76c6381c.html">http://hi.baidu.com/tister/blog/item/cf36f8dd0d62d2ee76c6381c.html</a> <br><br><br>结合文章的内容，亲手实践如下：<br>&nbsp;<img height=306 alt="" src="http://www.cnitblog.com/images/cnitblog_com/chenxin9821/Snap26.jpg" width=545 border=0>
<img src ="http://www.cnitblog.com/chenxin9821/aggbug/64469.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chenxin9821/" target="_blank">金鳞</a> 2010-03-03 14:27 <a href="http://www.cnitblog.com/chenxin9821/articles/64469.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在实践中使用Jstat监控gc情况</title><link>http://www.cnitblog.com/chenxin9821/articles/64468.html</link><dc:creator>金鳞</dc:creator><author>金鳞</author><pubDate>Wed, 03 Mar 2010 05:16:00 GMT</pubDate><guid>http://www.cnitblog.com/chenxin9821/articles/64468.html</guid><wfw:comment>http://www.cnitblog.com/chenxin9821/comments/64468.html</wfw:comment><comments>http://www.cnitblog.com/chenxin9821/articles/64468.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chenxin9821/comments/commentRss/64468.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chenxin9821/services/trackbacks/64468.html</trackback:ping><description><![CDATA[<p>&nbsp;性能测试过程中，我们该如何监控java虚拟机内存的使用情况，用以判断JVM是否存在内存问题呢？如何判断JVM垃圾回收是否正常？一般的top指令基本上满足不了这样的需求，因为它主要监控的是总体的系统资源，很难定位到java应用程序。<br>在项目实践过程中，我们探索和使用了一款新工具－－Jstat。<br>&nbsp;&nbsp;&nbsp; 先秀一下。Jstat是JDK自带的一个轻量级小工具。全称&#8220;Java Virtual Machine statistics monitoring tool&#8221;，它位于java的bin目录下，主要利用JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控，包括了对Heap size和垃圾回收状况的监控。可见，Jstat是轻量级的、专门针对JVM的工具，非常适用。<br>那，该怎么用呢？<br>&nbsp;&nbsp;&nbsp; 语法结构如下：jstat [Options] vmid [interval] [count]<br>&nbsp;&nbsp;&nbsp; Options — 选项，我们一般使用 -gcutil 查看gc情况<br>&nbsp;&nbsp;&nbsp; vmid&nbsp;&nbsp;&nbsp; — VM的进程号，即当前运行的java进程号<br>&nbsp;&nbsp;&nbsp; interval&#8211; 间隔时间，单位为秒或者毫秒<br>&nbsp;&nbsp;&nbsp; count&nbsp;&nbsp; — 打印次数，如果缺省则打印无数次<br>&nbsp;&nbsp;&nbsp; 下面给出一个实际的例子：</p>
<p><img height=273 alt="" src="http://www.cnitblog.com/images/cnitblog_com/chenxin9821/111.JPG" width=540 border=0><br>&nbsp;注：由于JVM内存设置较大，图中百分比变化不太明显<br><br><br><br>&nbsp;&nbsp;&nbsp; 图中参数含义如下：<br><br>&nbsp;&nbsp;&nbsp; S0&nbsp; — Heap上的 Survivor space 0 区已使用空间的百分比<br>&nbsp;&nbsp;&nbsp; S1&nbsp; — Heap上的 Survivor space 1 区已使用空间的百分比<br>&nbsp;&nbsp;&nbsp; E&nbsp;&nbsp; — Heap上的 Eden space 区已使用空间的百分比<br>&nbsp;&nbsp;&nbsp; O&nbsp;&nbsp; — Heap上的 Old space 区已使用空间的百分比<br>&nbsp;&nbsp;&nbsp; P&nbsp;&nbsp; — Perm space 区已使用空间的百分比<br>&nbsp;&nbsp;&nbsp; YGC — 从应用程序启动到采样时发生 Young GC 的次数<br>&nbsp;&nbsp;&nbsp; YGCT&#8211; 从应用程序启动到采样时 Young GC 所用的时间(单位秒)<br>&nbsp;&nbsp;&nbsp; FGC — 从应用程序启动到采样时发生 Full GC 的次数<br>&nbsp;&nbsp;&nbsp; FGCT&#8211; 从应用程序启动到采样时 Full GC 所用的时间(单位秒)<br>&nbsp;&nbsp;&nbsp; GCT — 从应用程序启动到采样时用于垃圾回收的总时间(单位秒)&nbsp;<br><br>*************************************<br></p>
<p style="FONT-SIZE: 10pt">Sun的 &nbsp; Java &nbsp; HotSpot(热区) &nbsp; 虚拟机将堆划分成三块区域同时用了三种垃圾收集技术。将堆进行拆分的目的是允许为新建立的对象和旧对象使用不同的算法。 &nbsp; 这种技术是因为大多数的Java对象是生命周期较短的对象。堆的三个块区域为：</p>
<ol>
    <li>
    <p style="FONT-SIZE: 10pt">permanent space持久空间: 用于类和方法对象的存储</p>
    <li>
    <p style="FONT-SIZE: 10pt">old space 旧对象空间:用于建立一段时间的对象</p>
    <li>
    <p style="FONT-SIZE: 10pt">eden space 新对象空间:用于新建立的对象</p>
    </li>
</ol>
<p>新对象空间被进一步划分成3个子区域： &nbsp; <br>&nbsp; &nbsp; &nbsp; 1，Eden：所有的新建立的对象存储处。 &nbsp; <br>&nbsp; &nbsp; &nbsp; 2，Survivor &nbsp; Space &nbsp; 0 &nbsp; 或 &nbsp; 1：在新对象成为旧对象之前的对象存储处。</p>
<p><br>*************************************<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 上图的示例，红框中，我们可以看到，5次young gc之后，垃圾内存被从Eden space区(E)放入了Old space区(O)，并引起了百分比的变化，导致 Survivor space使用的百分比从19.69%(S0)降到10.34%(S1)。有效释放了内存空间。绿框中，我们可以看到，一次full gc之后，Old space区(O)的内存被回收，从36.81%降到35.01%。&nbsp;<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 图中同时打印了young gc和full gc的总次数、总耗时。而，每次young gc消耗的时间，可以用相间隔的两行YGCT相减得到。每次full gc消耗的时间，可以用相隔的两行FGCT相减得到。例如红框中表示的第一行、第二行之间发生了1次young gc，消耗的时间为52.281-52.252＝0.029秒。<br><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 常驻内存区(P)的使用率，始终停留在37.6%左右，说明常驻内存没有突变，比较正常。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果young gc和full gc能够正常发生，而且都能有效回收内存，常驻内存区变化不明显，则说明java内存释放情况正常，垃圾回收及时，java内存泄露的几率就会大大降低。但也不能说明一定没有内存泄露。<br></p>
<img src ="http://www.cnitblog.com/chenxin9821/aggbug/64468.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chenxin9821/" target="_blank">金鳞</a> 2010-03-03 13:16 <a href="http://www.cnitblog.com/chenxin9821/articles/64468.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>