??xml version="1.0" encoding="utf-8" standalone="yes"?>蜜桃999成人看片在线观看,亚洲精品成人久久久,麻豆网站在线看http://www.aygfsteel.com/yangpingyu/category/48572.htmlzh-cnFri, 20 Apr 2012 00:56:50 GMTFri, 20 Apr 2012 00:56:50 GMT60perf4j使用四(log4j集成图表查看Q?/title><link>http://www.aygfsteel.com/yangpingyu/archive/2012/04/19/375267.html</link><dc:creator>yangpingyu</dc:creator><author>yangpingyu</author><pubDate>Thu, 19 Apr 2012 06:12:00 GMT</pubDate><guid>http://www.aygfsteel.com/yangpingyu/archive/2012/04/19/375267.html</guid><wfw:comment>http://www.aygfsteel.com/yangpingyu/comments/375267.html</wfw:comment><comments>http://www.aygfsteel.com/yangpingyu/archive/2012/04/19/375267.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yangpingyu/comments/commentRss/375267.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yangpingyu/services/trackbacks/375267.html</trackback:ping><description><![CDATA[  <div> <p><span style="font-family: 宋体">在用二q编文章中提刎ͼ可以以汇dŞ式查看日志,也可以通过图表来查看?/span>Perf4j<span style="font-family: 宋体">?/span>log4j<span style="font-family: 宋体">集成后,其实也可以以图表的Ş式来查看性能状况?/span></p> <p> </p> <p><span style="font-family: 宋体">我们q篇文章q是使用前一文章中提到</span>log4j.xml<span style="font-family: 宋体">的配|,其他都一P只是在配|中加入了图表的配置Q?/span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!-- </span><span style="font-family: 宋体; font-size: 10pt; courier: ">生成</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">firstBlock,secondBlock</span><span style="font-family: 宋体; font-size: 10pt; courier: ">的^均值的图表</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"> --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"graphExecutionTimes"</span></em></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; font-size: 10pt">              <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.perf4j.log4j.GraphingStatisticsAppender"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!-- GraphType:Mean</span><span style="font-family: 宋体; font-size: 10pt; courier: ">Q^均|</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">, <u>Min</u></span><span style="font-family: 宋体; font-size: 10pt; courier: ">Q最|</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">, Max</span><span style="font-family: 宋体; font-size: 10pt; courier: ">Q最大|</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">, TPS</span><span style="font-family: 宋体; font-size: 10pt; courier: ">Q每U事务数Q?/span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"> --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"GraphType"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"Mean"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"TagNamesToGraph"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"firstBlock,secondBlock"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender-ref</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">ref</span><span style="color: black">=</span><em><span style="color: #2a00ff">"graphsFileAppender"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!-- </span><span style="font-family: 宋体; font-size: 10pt; courier: ">生成</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">firstBlock,secondBlock</span><span style="font-family: 宋体; font-size: 10pt; courier: ">?/span><u><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">tps</span></u><span style="font-family: 宋体; font-size: 10pt; courier: ">的图?/span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"> --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"graphExecutionTPS"</span></em></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; font-size: 10pt">              <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.perf4j.log4j.GraphingStatisticsAppender"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"GraphType"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"TPS"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"TagNamesToGraph"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"firstBlock,secondBlock"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender-ref</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">ref</span><span style="color: black">=</span><em><span style="color: #2a00ff">"graphsFileAppender"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!-- </span><span style="font-family: 宋体; font-size: 10pt; courier: ">记录图表生成</span><u><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">url</span></u><span style="font-family: 宋体; font-size: 10pt; courier: ">?/span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">log</span><span style="font-family: 宋体; font-size: 10pt; courier: ">文g</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"> --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"graphsFileAppender"</span></em> <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.apache.log4j.FileAppender"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"File"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"/home/perfGraphs.log"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">layout</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.apache.log4j.PatternLayout"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"ConversionPattern"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"%m%n"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">layout</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 宋体">另外q需要改一个地方,是</span>CoalescingStatistics<span style="font-family: 宋体">的配|:(x)</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: silver; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"CoalescingStatistics"</span></em></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; font-size: 10pt">              <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.perf4j.log4j.AsyncCoalescingStatisticsAppender"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!--</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">             TimeSlice</span><span style="font-family: 宋体; font-size: 10pt; courier: ">配置多少旉间隔d一ơ汇d入文件中</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">             </span><span style="font-family: 宋体; font-size: 10pt; courier: ">默认值是</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"> 30000 <u>ms</u></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">        --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"TimeSlice"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"10000"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender-ref</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">ref</span><span style="color: black">=</span><em><span style="color: #2a00ff">"fileAppender"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">appender-ref</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">ref</span><span style="color: black">=</span><em><span style="color: #2a00ff">"graphExecutionTimes"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">appender-ref</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">ref</span><span style="color: black">=</span><em><span style="color: #2a00ff">"graphExecutionTPS"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New';background: silver; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p><span style="font-family: 宋体">黄色那段配置的意思就是把日志写入到图表日志去?/span></p> <p><span style="font-family: 宋体">q行代码</span>Perf4JAppenderExample<span style="font-family: 宋体">Q我们在</span>perfGraphs.log<span style="font-family: 宋体">文g中生成了图表?/span>url<span style="font-family: 宋体">Q?/span></p> <p><a >http://chart.apis.google.com/chart?cht=lxy&chtt=Mean&chs=750x400&chxt=x,x,y&chd=t:0.0,100.0|45.2,78.1|0.0,100.0|98.1,100.0&chco=ff0000,00ff00&chm=d,ff0000,0,-1,5.0|d,00ff00,1,-1,5.0&chdl=firstBlock|secondBlock&chxr=2,0,828.6&chxl=0:|13:23:50|13:24:00|1:|Time&chxp=0,0.0,100.0|1,50&chg=50.0,10</a></p> <p> </p> <p><a >http://chart.apis.google.com/chart?cht=lxy&chtt=TPS&chs=750x400&chxt=x,x,y&chd=t:0.0,100.0|100.0,100.0|0.0,100.0|100.0,100.0&chco=ff0000,00ff00&chm=d,ff0000,0,-1,5.0|d,00ff00,1,-1,5.0&chdl=firstBlock|secondBlock&chxr=2,0,0.5&chxl=0:|13:23:50|13:24:00|1:|Time&chxp=0,0.0,100.0|1,50&chg=50.0,10</a></p> <p><span style="font-family: 宋体">大家可以?/span>url<span style="font-family: 宋体">攑ֈ览器访问下?/span></p> <p> </p> <p><span style="font-family: 宋体">上面q种方式呢,需要自q录到服务器上Q找?/span>log<span style="font-family: 宋体">文gQ在攑ֈ览器中查看Qȝq程q是比较ȝ。如果大安要监控的工程是一?/span>web<span style="font-family: 宋体">工程的话Q那更方便了,直接配置一?/span>servlet<span style="font-family: 宋体">来查看?/span>Web.xml<span style="font-family: 宋体">的配|如下:(x)</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><!</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">DOCTYPE</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: teal">web-app</span> <span style="color: gray">PUBLIC</span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: teal">"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"</span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #3f7f5f">"http://java.sun.com/dtd/web-app_2_3.dtd"</span> <span style="color: teal">></span></span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">web-app</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">display-name</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">Archetype Created Web Application</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">display-name</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">       </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet-name</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">perf4j</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet-name</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">       </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet-class</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">org.perf4j.log4j.servlet.GraphingServlet</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet-class</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">       </span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!-- graphExecutionTimes</span><span style="font-family: 宋体; font-size: 10pt; courier: ">?/span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">graphExecutionTPS</span><span style="font-family: 宋体; font-size: 10pt; courier: ">是我们?/span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">log4j</span><span style="font-family: 宋体; font-size: 10pt; courier: ">中配|的名称</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"> --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">       </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">init-param</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">           </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param-name</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">graphNames</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param-name</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">           </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param-value</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">graphExecutionTimes,graphExecutionTPS</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param-value</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">       </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">init-param</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet-mapping</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">       </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet-name</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">perf4j</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet-name</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">       </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">url-pattern</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">/perf4j</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">url-pattern</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">servlet-mapping</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">web-app</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p><span style="font-family: 宋体">大家可以打包工程Qƈ攑ֈ</span>web<span style="font-family: 宋体">服务器下启动Q然后访问下</span>/perf4j<span style="font-family: 宋体">q个</span>uri<span style="font-family: 宋体">?/span></p> <p>Maven<span style="font-family: 宋体">有一?/span>jetty<span style="font-family: 宋体">插gQ可以方便启?/span>web<span style="font-family: 宋体">工程Q只要大家在</span>pom.xml<span style="font-family: 宋体">文g中加入如下配|:(x)</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">plugins</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">           </span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!-- <u>jetty</u></span><span style="font-family: 宋体; font-size: 10pt; courier: ">插g</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">, </span><span style="font-family: 宋体; font-size: 10pt; courier: ">讑֮端口?/span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">context path--></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">           </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">plugin</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">              </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">groupId</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">org.mortbay.jetty</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">groupId</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">              </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">artifactId</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><u><span style="font-family: 'Courier New'; color: black; font-size: 10pt">jetty</span></u><span style="font-family: 'Courier New'; color: black; font-size: 10pt">-<u>maven</u>-<u>plugin</u></span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">artifactId</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">           </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">plugin</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">     </span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">plugins</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p><span style="font-family: 宋体">在控制台中输入:(x)</span>mvn jetty:run<span style="font-family: 宋体">Q即可。省M打包发布Q很省心喔?/span></p> <p><span style="font-family: 宋体">W一ơ用</span><a href="http://localhost:8080/perf4j">http://localhost:8080/perf4j</a><span style="font-family: 宋体">讉K查看图表的时候没有生成Q何东西,那是因ؓ(f)内存中没有收集到最新的性能数据。所以我?/span>index.jsp<span style="font-family: 宋体">里调用下以便产生性能数据。然后重新访问,q个时候就有图表生成了?/span></p></div><br /><a href="/Files/yangpingyu/baowu.rar">下蝲工程<br /></a><img src ="http://www.aygfsteel.com/yangpingyu/aggbug/375267.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yangpingyu/" target="_blank">yangpingyu</a> 2012-04-19 14:12 <a href="http://www.aygfsteel.com/yangpingyu/archive/2012/04/19/375267.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>perf4j使用三(log4j集成Q?/title><link>http://www.aygfsteel.com/yangpingyu/archive/2012/04/16/374725.html</link><dc:creator>yangpingyu</dc:creator><author>yangpingyu</author><pubDate>Mon, 16 Apr 2012 05:59:00 GMT</pubDate><guid>http://www.aygfsteel.com/yangpingyu/archive/2012/04/16/374725.html</guid><wfw:comment>http://www.aygfsteel.com/yangpingyu/comments/374725.html</wfw:comment><comments>http://www.aygfsteel.com/yangpingyu/archive/2012/04/16/374725.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yangpingyu/comments/commentRss/374725.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yangpingyu/services/trackbacks/374725.html</trackback:ping><description><![CDATA[<div> <p><span style="font-family: 宋体">Perf4j</span><span style="font-family: 宋体">最主要的一个好处就是可以跟log4j或者logback来性能分析和监控线上运行的E序。集成的方式主要是:(x)自定义log4j的appenders通过标准的配|加入到l(f)og4j中去Q后面会(x)有配|的例子Q。有一个要注意的地方就是需要用log4j?.2.14版本或者更高版本。由于我一般都是用log4jQ所以对于logback的集成我׃描述了,我觉得应该差不多的?/span></p> <p> </p> <p><span style="font-family: 宋体">Perf4j</span><span style="font-family: 宋体">最重要的appender是</span><a ><span style="font-family: 宋体">AsyncCoalescingStatisticsAppender</span></a><span style="font-family: 宋体">Q它?x)把一D|间内StopWatch的信息汇d一个独立的GroupedTimingStatistics日志信息Q然后把q个独立的信息传l下游的appendersQ比如fileappendersQ这样就可以写到文g中去了。也可以传给per4j的其他自定义appenders?/span></p> <p> </p> <p><span style="font-family: 宋体">接下来我们看一个log4j.xml的例子,有一个限Ӟ如果要用AsyncCoalescingStatisticsAppender只能用xml文g而不能用properties文g?/span></p> <p> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><?</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">xml</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">version</span><span style="color: black">=</span><em><span style="color: #2a00ff">"1.0"</span></em> <span style="color: #7f007f">encoding</span><span style="color: black">=</span><em><span style="color: #2a00ff">"UTF-8"</span></em> <span style="color: teal">?></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><!</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">DOCTYPE</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: teal">log4j:configuration</span> <span style="color: gray">SYSTEM</span> <span style="color: #3f7f5f">"log4j.dtd"</span><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">log4j:configuration</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">debug</span><span style="color: black">=</span><em><span style="color: #2a00ff">"false"</span></em> <span style="color: #7f007f">xmlns:log4j</span><span style="color: black">=</span><em><span style="color: #2a00ff">"http://jakarta.apache.org/log4j/"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!--</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">         </span><span style="font-family: 宋体; font-size: 10pt; courier: ">配置控制台输?/span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">    --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"console"</span></em> <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.apache.log4j.ConsoleAppender"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">layout</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.apache.log4j.PatternLayout"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"ConversionPattern"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"%-5p %c{1} - %m%n"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">layout</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span> </p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"><!-- Perf4J appenders --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"><!--</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"><span>       </span>AsyncCoalescingStatisticsAppender</span><span style="font-family: 宋体; font-size: 10pt; courier: ">攉</span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">StopWatch</span><span style="font-family: 宋体; font-size: 10pt; courier: ">的日志信息ƈ传送到下游的文?/span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">appenders</span><span style="font-family: 宋体; font-size: 10pt; courier: ">?/span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">    --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"CoalescingStatistics"</span></em></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; font-size: 10pt">              <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.perf4j.log4j.AsyncCoalescingStatisticsAppender"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"><!--</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">             TimeSlice</span><span style="font-family: 宋体; font-size: 10pt; courier: ">配置多少旉间隔d一ơ汇d入文件中</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">             </span><span style="font-family: 宋体; font-size: 10pt; courier: ">默认值是</span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"> 30000 <u>ms</u></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">        --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"TimeSlice"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"10000"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">appender-ref</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">ref</span><span style="color: black">=</span><em><span style="color: #2a00ff">"fileAppender"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"><!-- </span><span style="font-family: 宋体; font-size: 10pt; courier: ">把汇ȝ</span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">perf4j</span><span style="font-family: 宋体; font-size: 10pt; courier: ">的日志信息写?/span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">perfStats.log</span><span style="font-family: 宋体; font-size: 10pt; courier: ">文g中去</span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"> --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"fileAppender"</span></em> <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.apache.log4j.FileAppender"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"File"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"/home/perfStats.log"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">layout</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.apache.log4j.PatternLayout"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">            </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"ConversionPattern"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"%m%n"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">layout</span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"><!-- Loggers --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt"><!-- </span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">       </span><span style="font-family: 宋体; font-size: 10pt; courier: ">配置</span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">perf4j logger</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">       Additivity</span><span style="font-family: 宋体; font-size: 10pt; courier: ">讄?/span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">false</span><span style="font-family: 宋体; font-size: 10pt; courier: ">主要因ؓ(f)是不惌代码q行旉的日志输出给上游</span><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">appenders</span><span style="font-family: 宋体; font-size: 10pt; courier: ">Q即不要在控制台输出?/span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: #3f5fbf; font-size: 10pt">    --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">logger</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.perf4j.TimingLogger"</span></em> <span style="color: #7f007f">additivity</span><span style="color: black">=</span><em><span style="color: #2a00ff">"false"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">level</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"INFO"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">appender-ref</span><span style="font-family: 'Courier New';background: yellow; font-size: 10pt"> <span style="color: #7f007f">ref</span><span style="color: black">=</span><em><span style="color: #2a00ff">"CoalescingStatistics"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New';background: yellow; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New';background: yellow; color: #3f7f7f; font-size: 10pt">logger</span><span style="font-family: 'Courier New';background: yellow; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt"><!-- </span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">       Root logger</span><span style="font-family: 宋体; font-size: 10pt; courier: ">打印所有日志,但不包含</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">perf4j</span><span style="font-family: 宋体; font-size: 10pt; courier: ">的信息。原因是?/span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">TimingLogger</span><span style="font-family: 宋体; font-size: 10pt; courier: ">配置中设|了</span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">additivity</span><span style="font-family: 宋体; font-size: 10pt; courier: ">?/span><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">false</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: #3f5fbf; font-size: 10pt">    --></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">root</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">level</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"INFO"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender-ref</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">ref</span><span style="color: black">=</span><em><span style="color: #2a00ff">"console"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">root</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">log4j:configuration</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p> </p> <p> </p> <p><span style="font-family: 宋体">黄色背景是perf4j的配|信息。其他都是log4j的基本配|。下面是试perf4j与log4j集成的代码?/span></p> <p style="text-align: left" align="left"><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">package</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> com.baowu.perf4j;</span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">import</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> org.apache.log4j.Logger;</span></p> <p style="text-align: left" align="left"><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">import</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> org.perf4j.StopWatch;</span></p> <p style="text-align: left" align="left"><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">import</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> org.perf4j.log4j.Log4JStopWatch;</span></p> <p style="text-align: left" align="left"> </p> <p style="text-align: left" align="left"><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">public</span></strong> <strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">class</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> Perf4JAppenderExample {</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    </span><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">public</span></strong> <strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">static</span></strong> <strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">void</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> main (String[] args) </span><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">throws</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> Exception {</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        Logger rootLogger = Logger.<em>getRootLogger</em>();</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">for</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> (</span><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">int</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> i = 0; i < 10; i++) {</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            </span><span style="font-family: 'Courier New'; color: #3f7f5f; font-size: 10pt">// Log4JStopWatch</span><span style="font-family: 宋体; font-size: 10pt; courier: ">默认使用</span><span style="font-family: 'Courier New'; color: #3f7f5f; font-size: 10pt">org.perf4j.TimingLogger</span><span style="font-family: 宋体; font-size: 10pt; courier: ">q个c?/span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            StopWatch stopWatch = </span><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">new</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt"> Log4JStopWatch();</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            </span><span style="font-family: 'Courier New'; color: #3f7f5f; font-size: 10pt">//</span><span style="font-family: 宋体; font-size: 10pt; courier: ">模拟代码q行旉</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            Thread.<em>sleep</em>((</span><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">long</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt">) (Math.<em>random</em>() * 1000L));</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            </span><span style="font-family: 'Courier New'; color: #3f7f5f; font-size: 10pt">//</span><span style="font-family: 宋体; font-size: 10pt; courier: ">打印到控制台</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            rootLogger.info(</span><span style="font-family: 'Courier New'; color: #2a00ff; font-size: 10pt">"Normal logging messages only go to the console"</span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">);</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            stopWatch.lap(</span><span style="font-family: 'Courier New'; color: #2a00ff; font-size: 10pt">"firstBlock"</span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">);</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            Thread.<em>sleep</em>((</span><strong><span style="font-family: 'Courier New'; color: #7f0055; font-size: 10pt">long</span></strong><span style="font-family: 'Courier New'; color: black; font-size: 10pt">) (Math.<em>random</em>() * 2000L));</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            stopWatch.stop(</span><span style="font-family: 'Courier New'; color: #2a00ff; font-size: 10pt">"secondBlock"</span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">);</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        }</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">    }</span></p> <p><span style="font-family: 'Courier New'; color: black; font-size: 10pt">}</span></p> <p> </p> <p><span style="font-family: 宋体; font-size: 10pt; courier: ">q行代码?/span></p> <p><span style="font-family: 宋体; font-size: 10pt; courier: ">控制台输出:(x)</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p><span style="font-family: 'Courier New'; color: black; font-size: 10pt">INFO root - Normal logging messages only go to the console</span></p> <p> </p> <p><span style="font-family: 宋体; font-size: 10pt; courier: ">文g输出Q?/span></p> <p><span style="font-family: 'Courier New'; color: black; font-size: 10pt"><img border="0" alt="" src="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/perf4j3-1.jpg" width="558" height="184" /><br /></span></p> <p> </p> <p><span style="font-family: 宋体; font-size: 10pt; courier: ">输出格式也可以改?/span><span style="font-family: 'Courier New'; color: black; font-size: 10pt">CSV</span><span style="font-family: 宋体; font-size: 10pt; courier: ">格式。配|:(x)</span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"fileAppender"</span></em> <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"org.apache.log4j.FileAppender"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"File"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"/home/perfStats.log"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">layout</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">class</span><span style="color: black">=</span><em><span style="color: #2a00ff">"</span><strong><span style="color: red">org.apache.log4j.PatternLayout</span></strong><span style="color: #2a00ff">"</span></em><span style="color: teal">></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">            </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"><</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">param</span><span style="font-family: 'Courier New'; font-size: 10pt"> <span style="color: #7f007f">name</span><span style="color: black">=</span><em><span style="color: #2a00ff">"ConversionPattern"</span></em> <span style="color: #7f007f">value</span><span style="color: black">=</span><em><span style="color: #2a00ff">"%m%n"</span></em><span style="color: teal">/></span></span></p> <p style="text-align: left" align="left"><span style="font-family: 'Courier New'; color: black; font-size: 10pt">        </span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">layout</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left; text-indent: 21pt" align="left"><span style="font-family: 'Courier New'; color: teal; font-size: 10pt"></</span><span style="font-family: 'Courier New'; color: #3f7f7f; font-size: 10pt">appender</span><span style="font-family: 'Courier New'; color: teal; font-size: 10pt">></span></p> <p style="text-align: left; text-indent: 21pt" align="left"><strong><em><span style="font-family: 'Courier New'; color: red; font-size: 10pt">org.apache.log4j.PatternLayout</span></em></strong><strong><em><span style="font-family: 宋体; font-size: 10pt; courier: ">Ҏ(gu)</span></em></strong><strong><em><span style="font-family: 'Courier New'; color: red; font-size: 10pt">org.perf4j.log4j.StatisticsCsvLayout</span></em></strong><strong><em><span style="font-family: 宋体; font-size: 10pt; courier: ">卛_?/span></em></strong></p> <p style="text-align: left; text-indent: 21pt" align="left"><strong><em><span style="font-family: 宋体; font-size: 10pt; courier: ">具体的参数请查看</span></em></strong><strong><em><span style="font-family: 'Courier New'; color: red; font-size: 10pt">api</span></em></strong><strong><em><span style="font-family: 宋体; font-size: 10pt; courier: ">?br /><strong><em><font size="2"><a href="/Files/yangpingyu/baowu.rar"><strong><em><font size="2">下蝲工程</font></em></strong></a></font></em></strong><br /><br /><br /></span></em></strong></p></div><img src ="http://www.aygfsteel.com/yangpingyu/aggbug/374725.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yangpingyu/" target="_blank">yangpingyu</a> 2012-04-16 13:59 <a href="http://www.aygfsteel.com/yangpingyu/archive/2012/04/16/374725.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>perf4j使用?/title><link>http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374676.html</link><dc:creator>yangpingyu</dc:creator><author>yangpingyu</author><pubDate>Sun, 15 Apr 2012 11:35:00 GMT</pubDate><guid>http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374676.html</guid><wfw:comment>http://www.aygfsteel.com/yangpingyu/comments/374676.html</wfw:comment><comments>http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374676.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yangpingyu/comments/commentRss/374676.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yangpingyu/services/trackbacks/374676.html</trackback:ping><description><![CDATA[<div> <p><a href="../archive/2012/04/15/374217.html">Perf4j<span style="font-family:宋体;"><span>使用一</span></span></a><span style="font-family:宋体;">主要演示了性能监控的日志直接打印在标准输出。那么用二呢则主要来演C怎么来分析打印出来的日志文g?/span></p> <p> </p> <p><span style="font-family:宋体;">׃我们q没有跟</span>log4j<span style="font-family:宋体;">集成Q日志文件打印在标准输出,我们需要把标准输出重定向?/span>times.log<span style="font-family:宋体;">文g中。重定向有两U方式:(x)直接</span>copy<span style="font-family:宋体;">到文件中Q或者在</span>eclipse<span style="font-family:宋体;">里指定下输出文g。我主要是用</span>eclipse<span style="font-family:宋体;">指定输出文g?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;"><img src="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/perf4j2-1.jpg" alt="" width="294" border="0" height="164" /></span></p> <p> </p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;"><img src="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/perf4j2-2.jpg" alt="" width="662" border="0" height="496" /></span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;"><img src="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/perf4j2-3.jpg" alt="" width="661" border="0" height="454" /></span></p> <p> </p> <p><span style="font-family:宋体;">然后q行代码Q?/span><a href="../archive/2012/04/15/374217.html">Perf4j<span style="font-family:宋体;"><span>使用一</span></span></a><span style="font-family:宋体;">?/span>Example.java<span style="font-family:宋体;">Q,控制C(x)在第一句话中打?/span>[Console output redirected to file:E:\yangpingyu\work\times.log]<span style="font-family:宋体;">Q这栯行的l果?x)同时打印在文g中和标准输出中?/span></p> <p> </p> <p><span style="font-family:宋体;">有了</span>times.log<span style="font-family:宋体;">Q我们就可以Ҏ(gu)志文件进行分析,以找出有问题的代码?/span></p> <p> </p> <p><span style="font-family:宋体;">分析日志命o(h)Q?/span></p> <p><span>E:\yangpingyu\work>java -jar perf4j-0.9.16.jar times.log</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;"><img src="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/perf4j2-5.jpg" alt="" width="874" border="0" height="457" /></span></p> <p> </p> <p><span style="font-family:宋体;">?/span>csv<span style="font-family:宋体;">的格式来查看l果Q命令如下:(x)</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">java -jar perf4j-0.9.16.jar -f csv times.log</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;"><img src="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/perf4j2-6.jpg" alt="" width="867" border="0" height="331" /></span></p> <p> </p> <p><span style="font-family:宋体;">以上都是以文本的格式q行输出Q但文本没有图表更具有表辑֊。所以把l果以图表Ş式输出是必不可少Q幸?/span>perf4j<span style="font-family:宋体;">也支持,命o(h)如下Q?/span></p> <pre>java -jar perf4j-0.9.16.jar --graph perfGraphs.html times.log</pre> <p><span style="font-family:宋体;">执行命o(h)后,在控制台输出相应的统计信息,相应的在盘上也生成了一?/span>html<span style="font-family:宋体;">Q?/span>html<span style="font-family:宋体;">里包含^均值图表和</span>tps<span style="font-family:宋体;">图表?/span></p> <p><html></p> <p><span><head><title>Perf4J Performance Graphs</title></head></span></p> <p><body></p> <p><span><br/><br/><img src="http://chart.apis.google.com/chart?cht=lxy&chtt=Mean&chs=750x400&chxt=x,x,y&chd=t:0.0,50.0,100.0|56.3,60.1,6.0|0.0,50.0|88.5,94.5|50.0,100.0|43.2,7.2|0.0,50.0,100.0|71.8,57.4,8.0|0.0,50.0,100.0|100.0,61.2,59.6|0.0,50.0,100.0|63.9,62.0,18.7|0.0,50.0,100.0|34.4,72.1,30.1&chco=ff0000,00ff00,0000ff,00ffff,ff00ff,ffff00,000000&chm=d,ff0000,0,-1,5.0|d,00ff00,1,-1,5.0|d,0000ff,2,-1,5.0|d,00ffff,3,-1,5.0|d,ff00ff,4,-1,5.0|d,ffff00,5,-1,5.0|d,000000,6,-1,5.0&chdl=codeBlock1|codeBlock2.failure|codeBlock2.success|codeBlock3|codeBlock4|codeBlock5|codeBlock6&chxr=2,0,748.5&chxl=0:|18:12:00|18:12:30|18:13:00|1:|Time&chxp=0,0.0,50.0,100.0|1,50&chg=50.0,10"/></span></p> <p><span><br/><br/><img src="http://chart.apis.google.com/chart?cht=lxy&chtt=TPS&chs=750x400&chxt=x,x,y&chd=t:0.0,50.0,100.0|36.4,90.9,9.1|0.0,50.0|27.3,63.6|50.0,100.0|36.4,9.1|0.0,50.0,100.0|36.4,90.9,9.1|0.0,50.0,100.0|36.4,90.9,9.1|0.0,50.0,100.0|36.4,90.9,9.1|0.0,50.0,100.0|27.3,100.0,9.1&chco=ff0000,00ff00,0000ff,00ffff,ff00ff,ffff00,000000&chm=d,ff0000,0,-1,5.0|d,00ff00,1,-1,5.0|d,0000ff,2,-1,5.0|d,00ffff,3,-1,5.0|d,ff00ff,4,-1,5.0|d,ffff00,5,-1,5.0|d,000000,6,-1,5.0&chdl=codeBlock1|codeBlock2.failure|codeBlock2.success|codeBlock3|codeBlock4|codeBlock5|codeBlock6&chxr=2,0,0.4&chxl=0:|18:12:00|18:12:30|18:13:00|1:|Time&chxp=0,0.0,50.0,100.0|1,50&chg=50.0,10"/></span></p> <p></body></html></p> <p><span style="font-family:宋体;">以上?/span>html<span style="font-family:宋体;">的内容,里面最重要的信息就是两?/span>img<span style="font-family:宋体;">标签Q里面具体的囄?/span>google chart api<span style="font-family:宋体;">生成。可以打开</span>html<span style="font-family:宋体;">直接查看图表?/span></p> <p><img src="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/perf4j2-7.png" alt="" width="750" border="0" height="400" /></p> <p><img src="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/perf4j2-9.png" alt="" width="750" border="0" height="400" /></p> <p><span style="font-family:宋体;">如果惌看更详细的参敎ͼ可以使用</span>—help<span style="font-family:宋体;">来查看?/span>java -jar perf4j-0.9.16.jar –help<span style="font-family: 宋体;">?/span></p> </div> <img src ="http://www.aygfsteel.com/yangpingyu/aggbug/374676.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yangpingyu/" target="_blank">yangpingyu</a> 2012-04-15 19:35 <a href="http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374676.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>perf4j使用一http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374217.htmlyangpingyuyangpingyuSun, 15 Apr 2012 02:44:00 GMThttp://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374217.htmlhttp://www.aygfsteel.com/yangpingyu/comments/374217.htmlhttp://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374217.html#Feedback0http://www.aygfsteel.com/yangpingyu/comments/commentRss/374217.htmlhttp://www.aygfsteel.com/yangpingyu/services/trackbacks/374217.html

如果大家使用的是maven工程Q那么现?/span>pom文g中加?/span>perf4j的依赖?/span>

<dependency>

<groupId>org.perf4j</groupId>

<artifactId>perf4j</artifactId>

<version>0.9.16</version>

<scope>compile</scope>

</dependency>

如果用的是普通工E,那么直接下蝲jar包放?/span>lib目录下即可?/span>

 

 

例子Q?/span>

package com.baowu.per4j;

 

import org.perf4j.LoggingStopWatch;

import org.perf4j.StopWatch;

 

public class Example1 {

 

    public static void main(String[] args) throws InterruptedException{

       method1();

       method2();

       method3();

    }

   

    /**

     * 监控一处代码示?/span>

     * @throws InterruptedException

     */

    private static void method1() throws InterruptedException{

       //创徏一个监控对象,q里使用LoggingStopWatchQ它是把l果直接输出到控制台。我们也可以

       //使用StopWatch的其他子c,比如Q?/span>Log4JStopWatchQ?/span>CommonsLogStopWatch。不q这些子c需

       //要工E用日志框?/span>

       StopWatch stopWatch = new LoggingStopWatch("codeBlock1");

 

       //q里是一些需要监控的代码Q我们命名ؓ(f)codeBlock1

       //使用U程休眠是ؓ(f)了模拟代码执行时?/span>

       Thread.sleep((long)(Math.random() * 1000L));

 

       //停止计算代码性能

       stopWatch.stop();

    }

   

    /**

     * 一个方法多Z码监?/span>

     * @throws InterruptedException

     */

    private static void method2() throws InterruptedException{

       StopWatch stopWatch = new LoggingStopWatch();

       Thread.sleep((long)(Math.random() * 1000L));

       stopWatch.lap("codeBlock3");

       Thread.sleep((long)(Math.random() * 1000L));

       stopWatch.lap("codeBlock4");

       Thread.sleep((long)(Math.random() * 1000L));

       stopWatch.lap("codeBlock5");

       Thread.sleep((long)(Math.random() * 1000L));

       stopWatch.stop("codeBlock6");

    }

   

    /**

     * stopҎ(gu)可以加入一些说明信?/span>

     */

    private static void method3(){

       StopWatch stopWatch = new LoggingStopWatch();

       try {

           // the code block being timed - this is just a dummy example

           long sleepTime = (long)(Math.random() * 1000L);

           Thread.sleep(sleepTime);

           if (sleepTime > 500L) {

               throw new Exception("Throwing exception");

           }

           stopWatch.stop("codeBlock2.success", "Sleep time was < 500 ms");

       } catch (Exception e) {

           stopWatch.stop("codeBlock2.failure", "Exception was: " + e);

       }

    }

}

 

q行l果Q?/span>

start[1334457619937] time[355] tag[codeBlock1]

start[1334457620296] time[152] tag[codeBlock3]

start[1334457620453] time[138] tag[codeBlock4]

start[1334457620593] time[598] tag[codeBlock5]

start[1334457621187] time[700] tag[codeBlock6]

start[1334457621890] time[619] tag[codeBlock2.failure] message[Exception was: java.lang.Exception: Throwing exception]



yangpingyu 2012-04-15 10:44 发表评论
]]>
Perf4j?/title><link>http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374215.html</link><dc:creator>yangpingyu</dc:creator><author>yangpingyu</author><pubDate>Sun, 15 Apr 2012 02:15:00 GMT</pubDate><guid>http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374215.html</guid><wfw:comment>http://www.aygfsteel.com/yangpingyu/comments/374215.html</wfw:comment><comments>http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374215.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yangpingyu/comments/commentRss/374215.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yangpingyu/services/trackbacks/374215.html</trackback:ping><description><![CDATA[<div> <p><span style="font-family: 宋体;"></span>Perf4j<span style="font-family: 宋体;">主要的用途是计量代码性能和分析性能数据?/span></p> <p> </p> <p><span style="font-family: 宋体;">Z么要使用q个工具呢?我们可以联想下最早期</span>java<span style="font-family: 宋体;">开发者调试代码用的方式Q以前没有日志框Ӟ?/span>java<span style="font-family: 宋体;">开发就使用</span>System.out.println()<span style="font-family: 宋体;">来输己想查看的变量。但是这样项目上U的话,pLq些打印语句以减性能影响。那万一在线上出问题了,调试哪里出问题就很麻烦,因ؓ(f)没有输出的日志可查。所以后来有人开发了日志框架Q通过日志U别控制日志的输出?/span></p> <p> </p> <p><span style="font-family: 宋体;">cM的,如果没有</span>perf4j<span style="font-family: 宋体;">Q我们在查看代码q行旉的话可以用以下代码来实现Q?/span></p> <p>long start = System.currentTimeMillis();</p> <p>// execute the block of code to be timed</p> <p><span>System.out.println("ms for block n was: " + (System.currentTimeMillis() - start));</span></p> <p><span style="font-family: 宋体;">q种方式有几个缺点:(x)</span></p> <p style="margin-left: 18pt; text-indent: -18pt;"><span>1?nbsp;</span><span style="font-family: 宋体;">q种方式输出内容比较单一Q就是代码ȝq行旉。但是我们代码需要查看的性能指标有更多,比如ȝq_|最|最大|</span>tps<span style="font-family: 宋体;">{等?/span></p> <p style="margin-left: 18pt; text-indent: -18pt;"><span>2?nbsp;</span><span style="font-family: 宋体;">也许我们的代码在U上q行Q我们想把这些值通过图表的Ş式展C出来。或者把q些内容通过</span>jmx<span style="font-family: 宋体;">输出?/span></p> <p style="margin-left: 18pt; text-indent: -18pt;"><span>3?nbsp;</span><span style="font-family: 宋体;">另外Q我们可能把</span>perf4j<span style="font-family: 宋体;">?/span>log4j<span style="font-family: 宋体;">Q?/span>slf4j<span style="font-family: 宋体;">{日志框架和日志门面pȝ整合h?/span></p> <p> </p> <p><span style="font-family: 宋体;">Z以上q些问题Q所以开源社区就出现?/span>perf4j<span style="font-family: 宋体;">Qh多力量大Q社区的力量是强大Q?/span></p> <p>Perf4j<span style="font-family: 宋体;">一些特性:(x)</span></p> <p style="margin-left: 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l </span><span style="font-family: 宋体;">单的停止查看机制来计语句时间消耗输出?/span></p> <p style="margin-left: 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l </span><span style="font-family: 宋体;">命o(h)行解?/span>log<span style="font-family: 宋体;">文g产生汇L据和图表?/span></p> <p style="margin-left: 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l </span><span style="font-family: 宋体;">单的集成日志框架和门面框架?/span></p> <p style="margin-left: 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l </span><span style="font-family: 宋体;">自定?/span>log4j<span style="font-family: 宋体;">?/span>logback<span style="font-family: 宋体;">?/span>appenders<span style="font-family: 宋体;">来生数据和图表?/span></p> <p style="margin-left: 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l </span><span style="font-family: 宋体;">通过</span>jmx<span style="font-family: 宋体;">查看性能指标QƈҎ(gu)阈值发送消息?/span></p> <p style="margin-left: 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l </span>Web<span style="font-family: 宋体;">工程可以通过</span>servlet<span style="font-family: 宋体;">来输出性能指标?/span></p> <p style="margin-left: 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l </span>Perf4j<span style="font-family: 宋体;">可以?/span>aop<span style="font-family: 宋体;">{切面框架整合v来输出性能指标?/span></p> <p style="margin-left: 21pt; text-indent: -21pt;"><span style="font-family: Wingdings;">l </span>Perf4j<span style="font-family: 宋体;">是一个可扩展的架构?/span></p> </div><img src ="http://www.aygfsteel.com/yangpingyu/aggbug/374215.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yangpingyu/" target="_blank">yangpingyu</a> 2012-04-15 10:15 <a href="http://www.aygfsteel.com/yangpingyu/archive/2012/04/15/374215.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Maven与findbugshttp://www.aygfsteel.com/yangpingyu/archive/2012/04/14/374180.htmlyangpingyuyangpingyuSat, 14 Apr 2012 10:55:00 GMThttp://www.aygfsteel.com/yangpingyu/archive/2012/04/14/374180.htmlhttp://www.aygfsteel.com/yangpingyu/comments/374180.htmlhttp://www.aygfsteel.com/yangpingyu/archive/2012/04/14/374180.html#Feedback0http://www.aygfsteel.com/yangpingyu/comments/commentRss/374180.htmlhttp://www.aygfsteel.com/yangpingyu/services/trackbacks/374180.html

公司最q严抓Y件质量问题,我抽IZ解了下提高代码质量的一些开源工兗其中一个就?/span>findbugs。?/span>findbugs有很多方式,比如Q安?/span>eclipse findbugs插gQ通过maven调用生成报告。今天主要演CZmaven?/span>findbugs集成?/span>

 

W一步:(x)下蝲mavenQ我使用的是maven3。把maven的命令加?/span>PATH环境变量?/span>

W二步:(x)创徏一个普通的maven java工程。命令如下:(x)mvn archetype:maven-archetyp-quickstart –DgroupId=com.tianya –DartifactId=baowu。如果正常执行的话会(x)生成如下l构的一个工E?/span>

W三步:(x)我们看下pom文g

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.tianya</groupId>

    <artifactId>baowu</artifactId>

    <version>0.0.1-SNAPSHOT</version>

    <packaging>war</packaging>

 

    <!--配置插g来源 -->

    <pluginRepositories>

       <pluginRepository>

           <id>Codehaus repository</id>

           <url>http://repository.codehaus.org/</url>

       </pluginRepository>

    </pluginRepositories>

   

    <build>

       <plugins>

           <plugin>

              <groupId>org.codehaus.mojo</groupId>

              <artifactId>findbugs-maven-plugin</artifactId>

              <version>2.3.2</version>

              <configuration>

                  <!-- <configLocation>${basedir}/springside-findbugs.xml</configLocation> -->

                  <threshold>High</threshold>

                  <effort>Default</effort>

                  <findbugsXmlOutput>true</findbugsXmlOutput>

                   <!-- findbugs xml输出路径-->         <findbugsXmlOutputDirectory>target/site</findbugsXmlOutputDirectory>

              </configuration>

           </plugin>

       </plugins>

    </build>

</project>

 

我来解释?/span>xml配置Q?/span>

配置插g下蝲地址

<!--配置插g来源 -->

    <pluginRepositories>

       <pluginRepository>

           <id>Codehaus repository</id>

           <url>http://repository.codehaus.org/</url>

       </pluginRepository>

    </pluginRepositories>

 

׃maven核心做的事情都是抽象的构E,很多实际的工作都是具体的插g来实现。所以很昄Q?/span>maven以插件的方式集成findbugs?/span>

<plugin>

              <groupId>org.codehaus.mojo</groupId>

              <artifactId>findbugs-maven-plugin</artifactId>

              <version>2.3.2</version>

              <configuration>

                  <!-- <configLocation>${basedir}/springside-findbugs.xml</configLocation> -->

                  <!-- findbugs xml输出-->                   <findbugsXmlOutput>true</findbugsXmlOutput>

                   <!-- findbugs xml输出路径-->         <findbugsXmlOutputDirectory>target/site</findbugsXmlOutputDirectory>

              </configuration>

           </plugin>

 

大家注意Cfindbugs插g里,我注释掉了一句话Q其实这句话是可以使用自己?/span>fingbugs配置来做(g)查。我用的?/span>springside的一?/span>xml文g?/span>

 

W四步:(x)配置好相x件之后,接下来就是执行相兛_令了?/span>

mvn compile findbugs:findbugs生成报告。报告生成的地址是${目根目?/span>}/target/site。也可以通过mvn findbugs:gui gui界面查看findbugs?/span>report?/span>



yangpingyu 2012-04-14 18:55 发表评论
]]>
学习(fn)书单和资?/title><link>http://www.aygfsteel.com/yangpingyu/archive/2012/02/07/369530.html</link><dc:creator>yangpingyu</dc:creator><author>yangpingyu</author><pubDate>Tue, 07 Feb 2012 05:45:00 GMT</pubDate><guid>http://www.aygfsteel.com/yangpingyu/archive/2012/02/07/369530.html</guid><wfw:comment>http://www.aygfsteel.com/yangpingyu/comments/369530.html</wfw:comment><comments>http://www.aygfsteel.com/yangpingyu/archive/2012/02/07/369530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yangpingyu/comments/commentRss/369530.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yangpingyu/services/trackbacks/369530.html</trackback:ping><description><![CDATA[<div> <p style="text-indent:21.0pt"><span style="font-family:宋体;">从学校毕业到工作已经</span>2<span style="font-family:宋体;">q半旉了,在豆瓣、当当、京东和亚玛逊上x了很多书c,也比较喜Ƣ逛书店。当然买了很多和看了部分Q自己家里很多书q没看(人类的惰性,借口Q。在q两q半旉内,C一些弯路,所以想ȝ下自q学习(fn)生?/span></p> <p style="text-indent:21.0pt"> </p> <p style="text-indent:21.0pt"><span style="font-family:宋体;">毕业的时候去了一家创业型的互联网公司Q在q家公司没有M培训机制QQ何东襉K需要靠自己来捉摸。根据工作需要看?/span>struts2<span style="font-family:宋体;">Q?/span>spring<span style="font-family:宋体;">Q?/span>hibernate<span style="font-family:宋体;">Q?/span>jstl<span style="font-family:宋体;">Q?/span>jsp<span style="font-family:宋体;">Q?/span>servlet<span style="font-family:宋体;">{一?/span>J2EE<span style="font-family:宋体;">相关lg的书和资料。仅靠这些技术也能搭建出一个符合品的|站。接触到</span>infoq<span style="font-family:宋体;">|站之后Q了解了一些大型网站的架构变迁{技术,在一q的旉内不断追寻这些不W合自己目前需要的技术,充其量就是开阔了自己技术的眼界。由于互联网公司的一些劣势,D我有了蟩槽的xQ但是出去面试之后,才知道自己是井底之蛙。自׃热爱技术,也算努力学习(fn)和研I的Q自己反思和ȝ了一下:(x)<strong><span style="color:red">不注重基?/span></strong></span></p> <p style="text-indent:21.0pt"> </p> <p style="text-indent:21.0pt"><span style="font-family:宋体;">那么学习(fn)什么才基呢?我主要列举下我的学习(fn)书单Q?/span></p> <p><span>         </span></p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span><span style="font-family:宋体;">计算机基QQ何Y件运行的基础?/span></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>深入理解计算机系l(修订版)</span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>计算机组成原<span>?/span></span></span></a></p> <p> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span><span style="font-family:宋体;">操作pȝQ硬件管理的软gQ我们的应用软g主要依赖于操作系l?/span></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>鸟哥?/span>Linux<span style="font-family:宋体;">U房?/span> <span style="font-family:宋体;">基础学习(fn)?/span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>操作pȝ原理</span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >Linux<span style="font-family:宋体;"><span>内核设计与实?/span></span></a></p> <p> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span><span style="font-family:宋体;">数据l构QY?/span>=<span style="font-family:宋体;">数据l构</span>+<span style="font-family:宋体;">法。其实操作系lY件和应用软g都在大量应用数据l构?/span></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>大话数据l构</span></span></a></p> <p style="margin-left:21.0pt"> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span><span style="font-family:宋体;">|络Q系l一定需要与外部交互Q那需要网l?/span></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>计算机网l?/span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >TCP/IP<span style="font-family:宋体;"><span>详解</span> <span style="font-family:宋体;">?/span>1</span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >TCP/IP<span style="font-family:宋体;"><span>详解</span> <span style="font-family:宋体;">?/span>2</span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >TCP/IP<span style="font-family:宋体;"><span>详解</span> <span style="font-family:宋体;">?/span>3</span></a></p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span><span style="font-family:宋体;">数据库:(x)存储数据?/span></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>数据库系l概?/span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >MySQL 5 <span style="font-family:宋体;"><span>权威指南</span>-(<span style="font-family:宋体;">W?/span>3<span style="font-family:宋体;">?/span>)</span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >MySQL<span style="font-family:宋体;"><span>性能调优与架构设?/span></span></a></p> <p style="margin-left:21.0pt"> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span><span style="font-family:宋体;">软g工程Q开发Y件是一个大工程Q需要有一套理论来理软g开发?/span></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>软g工程</span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>敏捷软g开?/span></span></a></p> <p> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span><span style="font-family:宋体;">法Q尚未接触?/span></p> <p style="margin-left:21.0pt"> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span>Java<span style="font-family:宋体;">基础Q具体的高语言Q最好的学习(fn)地方是</span>java<span style="font-family:宋体;">的官方网站和开源代码?/span> </p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >Java JDK6<span style="font-family:宋体;"><span>学习(fn)W记</span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >Effective Java<span style="font-family:宋体;"><span>中文?/span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >Java<span style="font-family:宋体;"><span>~程思想</span> <span style="font-family:宋体;">Q第</span>4<span style="font-family:宋体;">版)</span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >Java<span style="font-family:宋体;"><span>|络~程</span>(<span style="font-family:宋体;">中文?/span> <span style="font-family: 宋体;">W三?/span>)</span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >JAVA<span style="font-family:宋体;"><span>q发~程实践</span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>深入理解</span>Java<span style="font-family:宋体;">虚拟?/span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >Spring in Action<span style="font-family:宋体;"><span>中文?/span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>深入出</span>Hibernate</span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >Struts2<span style="font-family:宋体;"><span>权威指南</span></span></a></p> <p> </p> <p style="margin-left:42.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">ü </span>Java<span style="font-family:宋体;">q阶Q面向对象思想、设计模式和</span>J2EE<span style="font-family:宋体;">深入?/span> </p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >Java<span style="font-family:宋体;"><span>与模?/span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a ><span style="font-family:宋体;"><span>企业应用架构模式</span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >POJOs IN ACTION<span style="font-family:宋体;"><span>中文?/span></span></a></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><a >J2EE<span style="font-family:宋体;"><span>设计开发编E指?/span></span></a><span style="font-family:宋体;">Q?/span><span>Expert One-on-One J2EE Design and Development</span><span style="font-family:宋体;">Q?/span></p> <p style="margin-left:63.0pt;text-indent:-21.0pt;"><span style="font-family:Wingdings;">n </span><span><a >Expert One-on-One J2EE Development without EJB</a></span></p> <p style="margin-left:42.0pt;text-indent:0cm;"> </p> <p style="margin-left:21.0pt"><span style="font-family:宋体;">学习(fn)了这些基之后Q我们在来说分布式,</span>nosql<span style="font-family:宋体;">Q云计算Q企业集成等{。只有掌握了基础我们才能更好的创新?/span></p> </div><img src ="http://www.aygfsteel.com/yangpingyu/aggbug/369530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yangpingyu/" target="_blank">yangpingyu</a> 2012-02-07 13:45 <a href="http://www.aygfsteel.com/yangpingyu/archive/2012/02/07/369530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>jvmq行时数据区?/title><link>http://www.aygfsteel.com/yangpingyu/archive/2012/02/07/369508.html</link><dc:creator>yangpingyu</dc:creator><author>yangpingyu</author><pubDate>Tue, 07 Feb 2012 02:27:00 GMT</pubDate><guid>http://www.aygfsteel.com/yangpingyu/archive/2012/02/07/369508.html</guid><wfw:comment>http://www.aygfsteel.com/yangpingyu/comments/369508.html</wfw:comment><comments>http://www.aygfsteel.com/yangpingyu/archive/2012/02/07/369508.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yangpingyu/comments/commentRss/369508.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yangpingyu/services/trackbacks/369508.html</trackback:ping><description><![CDATA[<div> <p><span style="font-size:12.0pt">Java</span><span style="font-size:12.0pt;font-family:宋体;">语言?/span><span style="font-size:12.0pt">c</span><span style="font-size:12.0pt; font-family:宋体;">语言有一个非帔R要的区别是Q内存管理方式的不同Q?/span><span style="font-size:12.0pt">java</span><span style="font-size:12.0pt; font-family:宋体;">语言内存理不需要程序开发h员关注,?/span><span style="font-size:12.0pt">c</span><span style="font-size:12.0pt; font-family:宋体;">语言的内存的h和释N是开发h员来处理。辩证的思维来看Q不同内存管理实现方式有优点和缺点,所以语a应用的场景,效率?x)有很大不同?/span></p> <p> </p> <p><span style="font-size:12.0pt">Jvm</span><span style="font-size:12.0pt;font-family:宋体;">q行时的数据区域主要有:(x)E序计数器、虚拟机栈、本地方法栈、方法区和堆。其中程序计数器、虚拟机栈和本地Ҏ(gu)栈是U程独nQ而方法区和堆是所有线E共享?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size:12.0pt;font-family:Wingdings;">ü </span><span style="font-size:12.0pt;font-family:宋体;">E序计数器:(x)</span><span style="font-size:12.0pt">jvm</span><span style="font-size:12.0pt; font-family:宋体;">每个U程都有一个程序计数器。在M时刻都有一个线E的Ҏ(gu)在运行,如果q个Ҏ(gu)不是本地Ҏ(gu)Q那么程序计数器存放的就是正在执行的指o(h)地址Q如果是本地Ҏ(gu)Q那么程序计数器中存攄指定地址?/span><span style="font-size:12.0pt">undefined</span><span style="font-size: 12.0pt;font-family:宋体;">?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size:12.0pt;font-family:Wingdings;">ü </span><span style="font-size:12.0pt;font-family:宋体;">虚拟机栈Q当</span><span style="font-size:12.0pt">jvm</span><span style="font-size:12.0pt; font-family:宋体;">创徏一个线E的时候就?x)?f)U程分配一个虚拟机栈。主要用于存放方法的一些本地变量和部分l果Q一般这里的大小都是固定Q但不是l对。一个方法的执行到完成就是栈的入栈和出栈。假讑֜某方法中定义了一个对?/span><span style="font-size:12.0pt">Object obj=new Object();</span><span style="font-size:12.0pt;font-family:宋体;">其中</span><span style="font-size:12.0pt">obj</span><span style="font-size:12.0pt; font-family:宋体;">是存攑֜栈上Q?/span><span style="font-size:12.0pt">new Object()</span><span style="font-size:12.0pt; font-family:宋体;">是在堆上分配?/span><span style="font-size:12.0pt">-Xss</span><span style="font-size:12.0pt;font-family: 宋体;">可以控制</span><span style="font-size: 12.0pt">jvm</span><span style="font-size:12.0pt;font-family:宋体;">虚拟机栈的大?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size:12.0pt;font-family:Wingdings;">ü </span><span style="font-size:12.0pt;font-family:宋体;">本地Ҏ(gu)栈:(x)大体跟虚拟机栈类|不过是给本地Ҏ(gu)使用的。虚拟机栈和本地Ҏ(gu)栈在</span><span style="font-size:12.0pt">hotspot</span><span style="font-size:12.0pt; font-family:宋体;">是没有分开实现的,而是l称为栈?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size:12.0pt;font-family:Wingdings;">ü </span><span style="font-size:12.0pt;font-family:宋体;">Ҏ(gu)区:(x)主要存放静态变量,帔RQ类加蝲器加载的cȝ一些信息?/span></p> <p style="margin-left:21.0pt;text-indent:-21.0pt;"><span style="font-size:12.0pt;font-family:Wingdings;">ü </span><span style="font-size:12.0pt;font-family:宋体;">堆:(x)</span><span style="font-size:12.0pt">jvm</span><span style="font-size:12.0pt; font-family:宋体;">l大部分的对象分配都在堆上分配?/span><span style="font-size:12.0pt">-Xmn –Xmx</span><span style="font-size: 12.0pt;font-family:宋体;">是控制堆最值和最大|一般堆的大在使用了超q?/span><span style="font-size:12.0pt">mx</span><span style="font-size:12.0pt; font-family:宋体;">讑֮?/span><span style="font-size:12.0pt">70%</span><span style="font-size:12.0pt;font-family: 宋体;">的时候,׃(x)自动扩大到最大|所以防止这U扩大和~小我们讄成一L(fng)倹{?/span></p> </div><img src ="http://www.aygfsteel.com/yangpingyu/aggbug/369508.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yangpingyu/" target="_blank">yangpingyu</a> 2012-02-07 10:27 <a href="http://www.aygfsteel.com/yangpingyu/archive/2012/02/07/369508.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ClassCastExceptionhttp://www.aygfsteel.com/yangpingyu/archive/2012/01/10/368240.htmlyangpingyuyangpingyuTue, 10 Jan 2012 08:07:00 GMThttp://www.aygfsteel.com/yangpingyu/archive/2012/01/10/368240.htmlhttp://www.aygfsteel.com/yangpingyu/comments/368240.htmlhttp://www.aygfsteel.com/yangpingyu/archive/2012/01/10/368240.html#Feedback0http://www.aygfsteel.com/yangpingyu/comments/commentRss/368240.htmlhttp://www.aygfsteel.com/yangpingyu/services/trackbacks/368240.html

ClassCastExceptioncd转换异常Q是一个运行时异常?/span>

 

非常常见是不同cd之间的强制类型{换就?x)抛?/span>ClassCastException异常。还有一U就是不?/span>ClassLoader加蝲的相同的cd转换也会(x)抛出ClassCastException。接下来我用代码来详l解释下?/span>

 

1?nbsp;强制cd转换

public class ClassCastExceptionTest {

 

    /**

     * @param args

     */

    public static void main(String[] args) {

       Animal a1 = new Dog(); //1

       Animal a2 = new Cat(); //2

       Dog d1 = (Dog)a1;       //3

       Dog d2 = (Dog)a2;       //4

    }

}

把猫转换成狗Q是不对的。后面注释ؓ(f)4的代码是无法正常赋值的?/span>

Exception in thread "main" java.lang.ClassCastException: Cat cannot be cast to Dog

    at ClassCastExceptionTest.main(ClassCastExceptionTest.java:13)

 

 

2?nbsp;不同classloader加蝲相同cdcM间的转换

import java.io.File;

import java.net.URL;

import java.net.URLClassLoader;

 

 

public class ClassCastExceptionTest {

    /**

     * @param args

     */

    public static void main(String[] args) throws Exception {

       File file = new File(Thread.currentThread().getContextClassLoader().getResource("").getPath());

       URL[] urls = {file.toURL()};

       URLClassLoader classloader1 = new URLClassLoader(urls, ClassLoader.getSystemClassLoader().getParent());

       Class classloader1Animal1 = classloader1.loadClass("Dog");

       Dog dog1 = (Dog)classloader1Animal1.newInstance();

      

       URLClassLoader classloader2 = new URLClassLoader(urls, ClassLoader.getSystemClassLoader().getParent());

       Class classloader1Animal2 = classloader1.loadClass("Dog");

       Dog dog2 = (Dog)classloader1Animal1.newInstance();

      

       dog1 = dog2;

    }

 

}

 

代码中我们看?/span>dog1=dog2Q这栯值是?x)抛异常的?/span>

Exception in thread "main" java.lang.ClassCastException: Dog cannot be cast to Dog

    at ClassCastExceptionTest.main(ClassCastExceptionTest.java:17)

 

以后大家遇到classCastException的时候要注意了,不一定是强制cd转换D的,也有可能不同?/span>classloader加蝲了相同的c,然后q个cM同的实例q行赋倹{?/span>



yangpingyu 2012-01-10 16:07 发表评论
]]>
byte[]?6q制bugȝhttp://www.aygfsteel.com/yangpingyu/archive/2012/01/10/368211.htmlyangpingyuyangpingyuTue, 10 Jan 2012 06:39:00 GMThttp://www.aygfsteel.com/yangpingyu/archive/2012/01/10/368211.htmlhttp://www.aygfsteel.com/yangpingyu/comments/368211.htmlhttp://www.aygfsteel.com/yangpingyu/archive/2012/01/10/368211.html#Feedback0http://www.aygfsteel.com/yangpingyu/comments/commentRss/368211.htmlhttp://www.aygfsteel.com/yangpingyu/services/trackbacks/368211.html

Q一Q问?/span>

         目中需要对文g?/span>md5sumQ分两步赎ͼ(x)1、对文g的每个字节?/span>md5实例q行updateQ然后进?/span>digest?/span>2?/span>digestq回长度?/span>16?/span>byte数组Q一般我们需要把byte数组转成16q制字符Ԍ很多开源的md5加密法如此实现Q真正的原因q不是很理解Q可能是便于查看和传输)。具体的实现代码如下Q?/span>

         /**

    * Ҏ(gu)件进?/span>md5 sum操作

    * @param checkFile 要进行做md5 sum的文?/span>

    * @return

    */

    public static String md5sum(File checkFile){

       String md5sumResult = "";

       if(checkFile == null || (!checkFile.exists())){

           return md5sumResult;

       }

       MessageDigest digest = MessageDigest.getInstance("MD5");

       InputStream is = new FileInputStream(checkFile);

       byte[] buffer = new byte[8192];

       int read = 0;

       try {

           while( (read = is.read(buffer)) > 0) {

              digest.update(buffer, 0, read);

           }

           byte[] md5sum = digest.digest();

           BigInteger bigInt = new BigInteger(1, md5sum);

           md5sumResult = bigInt.toString(16);

       }

       catch(IOException e) {

           throw new RuntimeException("Unable to process file for MD5", e);

       }

       finally {

           try {

              is.close();

           }

           catch(IOException e) {

              throw new RuntimeException("Unable to close input stream for MD5 calculation", e);

           }

       }

      

       return md5sumResult;

    }

 

    其中黄色背景色的转换方式是有问题的。ؓ(f)什么用bigint?/span>16q制?x)有问题呢?/span>原因?/span>bigintq行16q制转换的时候第一?/span>0被自动去掉了.

   

 

Q二Q正解x?/span>

那正的方式是怎么L(fng)呢?下面有两U不同的转换方式Q但是原理其实是一致的?/span>

    W一U正的方式Q由王徏提供Q:(x)

    /**

    * 字节数l{换ؓ(f)16q制字符?/span>

    *

    * @param buffer

    * @return

    */

   public static String toHex(byte[] buffer) {

      StringBuffer sb = new StringBuffer(buffer.length * 2);

      for (int i = 0; i < buffer.length; i++) {

       sb.append(Character.forDigit((buffer[i] & 240) >> 4, 16));

       sb.append(Character.forDigit(buffer[i] & 15, 16));

      }

 

      return sb.toString();

   }

 

    W二U正的方式Q?/span>

    public static String bytes2HexString(byte[] b) {

       String ret = "";

       for (int i = 0; i < b.length; i++) {

           String hex = Integer.toHexString(b[i] & 0xFF);

           if (hex.length() == 1) {

              hex = '0' + hex;

           }

           ret += hex;

       }

       return ret;

    }

 

Q三Q问题分?/span>

    Md5法对Q何长度的字符串进行编码最后输出是128位长整数Q也是长度?/span>16?/span>byte数组。我们项目调用的?/span>jdk实现?/span>md5法Q所以一般是没问题的?/span>

    接下来我们要处理的事情,分别循环数组Q?span style="background:yellow;">把每个字节{换成2?/span>16q制字符Q也是说每4位{成一?/span>16q制字符?/span>

   

    上面正确的两U方式也是做了q样的事情?/span>

    W一U方式:(x)

       Character.forDigit((buffer[i] & 240) >> 4, 16)把字节的?/span>4位取出右U?/span>4位换成intQ然后通过forDigit转换?/span>16q制字符

       Character.forDigit(buffer[i] & 15, 16)把字节的?/span>4位取出换成intQ然后通过forDigit转换?/span>16q制字符

   

    W二U方式:(x)

       Integer.toHexString(b[i] & 0xFF)把整个字节{?/span>intQ然?/span>toHexString也就是做?/span>4位和?/span>4位的q算。但是这个方法如果高四位?/span>0的话׃输出M东西Q?/span>

所以在输出的字W前?/span>0卛_?/span>

       b[i] & 0xFF是?/span>byte转成intQؓ(f)什么用?/span>oxff做与q算Q是因ؓ(f)如果b[i]是负数的话,?/span>8位变?/span>32位会(x)?/span>1Q所以需要与0xff做与q算Q可以把前面?/span>24位全部清Ӟ又可以表C成原来的字节了?/span>

   

 

附:(x)

量使用开源提供的工具包,比如Q?/span>

org.apache.commons.codec.digest.DigestUtils.md5Hex(InputStream data)来对文g进?/span>md5卛_Q更加方便,可靠?/span>



yangpingyu 2012-01-10 14:39 发表评论
]]>
Javacd载体p?/title><link>http://www.aygfsteel.com/yangpingyu/archive/2011/05/14/350248.html</link><dc:creator>yangpingyu</dc:creator><author>yangpingyu</author><pubDate>Sat, 14 May 2011 13:41:00 GMT</pubDate><guid>http://www.aygfsteel.com/yangpingyu/archive/2011/05/14/350248.html</guid><wfw:comment>http://www.aygfsteel.com/yangpingyu/comments/350248.html</wfw:comment><comments>http://www.aygfsteel.com/yangpingyu/archive/2011/05/14/350248.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.aygfsteel.com/yangpingyu/comments/commentRss/350248.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/yangpingyu/services/trackbacks/350248.html</trackback:ping><description><![CDATA[<!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:DrawingGridVerticalSpacing>7.8 ?/w:DrawingGridVerticalSpacing> <w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery> <w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>ZH-CN</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:SpaceForUL/> <w:BalanceSingleByteDoubleByteWidth/> <w:DoNotLeaveBackslashAlone/> <w:ULTrailSpace/> <w:DoNotExpandShiftReturn/> <w:AdjustLineHeightInTable/> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:DontVertAlignCellWithSp/> <w:DontBreakConstrainedForcedTables/> <w:DontVertAlignInTxbx/> <w:Word11KerningPairs/> <w:CachedColBalance/> <w:UseFELayout/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math" /> <m:brkBin m:val="before" /> <m:brkBinSub m:val="--" /> <m:smallFrac m:val="off" /> <m:dispDef/> <m:lMargin m:val="0" /> <m:rMargin m:val="0" /> <m:defJc m:val="centerGroup" /> <m:wrapIndent m:val="1440" /> <m:intLim m:val="subSup" /> <m:naryLim m:val="undOvr" /> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267"> <w:LsdException locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal" /> <w:LsdException locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1" /> <w:LsdException locked="false" priority="9" qformat="true" name="heading 2" /> <w:LsdException locked="false" priority="9" qformat="true" name="heading 3" /> <w:LsdException locked="false" priority="9" qformat="true" name="heading 4" /> <w:LsdException locked="false" priority="9" qformat="true" name="heading 5" /> <w:LsdException locked="false" priority="9" qformat="true" name="heading 6" /> <w:LsdException locked="false" priority="9" qformat="true" name="heading 7" /> <w:LsdException locked="false" priority="9" qformat="true" name="heading 8" /> <w:LsdException locked="false" priority="9" qformat="true" name="heading 9" /> <w:LsdException locked="false" priority="39" name="toc 1" /> <w:LsdException locked="false" priority="39" name="toc 2" /> <w:LsdException locked="false" priority="39" name="toc 3" /> <w:LsdException locked="false" priority="39" name="toc 4" /> <w:LsdException locked="false" priority="39" name="toc 5" /> <w:LsdException locked="false" priority="39" name="toc 6" /> <w:LsdException locked="false" priority="39" name="toc 7" /> <w:LsdException locked="false" priority="39" name="toc 8" /> <w:LsdException locked="false" priority="39" name="toc 9" /> <w:LsdException locked="false" priority="35" qformat="true" name="caption" /> <w:LsdException locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title" /> <w:LsdException locked="false" priority="1" name="Default Paragraph Font" /> <w:LsdException locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle" /> <w:LsdException locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong" /> <w:LsdException locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis" /> <w:LsdException locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid" /> <w:LsdException locked="false" unhidewhenused="false" name="Placeholder Text" /> <w:LsdException locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing" /> <w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading" /> <w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List" /> <w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid" /> <w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1" /> <w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2" /> <w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1" /> <w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2" /> <w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1" /> <w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2" /> <w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3" /> <w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List" /> <w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading" /> <w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List" /> <w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid" /> <w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1" /> <w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1" /> <w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1" /> <w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1" /> <w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1" /> <w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1" /> <w:LsdException locked="false" unhidewhenused="false" name="Revision" /> <w:LsdException locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph" /> <w:LsdException locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote" /> <w:LsdException locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote" /> <w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1" /> <w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1" /> <w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1" /> <w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1" /> <w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1" /> <w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1" /> <w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1" /> <w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1" /> <w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2" /> <w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2" /> <w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2" /> <w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2" /> <w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2" /> <w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2" /> <w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2" /> <w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2" /> <w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2" /> <w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2" /> <w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2" /> <w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2" /> <w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2" /> <w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2" /> <w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3" /> <w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3" /> <w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3" /> <w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3" /> <w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3" /> <w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3" /> <w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3" /> <w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3" /> <w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3" /> <w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3" /> <w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3" /> <w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3" /> <w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3" /> <w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3" /> <w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4" /> <w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4" /> <w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4" /> <w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4" /> <w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4" /> <w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4" /> <w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4" /> <w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4" /> <w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4" /> <w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4" /> <w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4" /> <w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4" /> <w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4" /> <w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4" /> <w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5" /> <w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5" /> <w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5" /> <w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5" /> <w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5" /> <w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5" /> <w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5" /> <w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5" /> <w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5" /> <w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5" /> <w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5" /> <w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5" /> <w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5" /> <w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5" /> <w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6" /> <w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6" /> <w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6" /> <w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6" /> <w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6" /> <w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6" /> <w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6" /> <w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6" /> <w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6" /> <w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6" /> <w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6" /> <w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6" /> <w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6" /> <w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6" /> <w:LsdException locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis" /> <w:LsdException locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis" /> <w:LsdException locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference" /> <w:LsdException locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference" /> <w:LsdException locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title" /> <w:LsdException locked="false" priority="37" name="Bibliography" /> <w:LsdException locked="false" priority="39" qformat="true" name="TOC Heading" /> </w:LatentStyles> </xml><![endif]--><!--[if gte mso 10]> /* Style Definitions */ table.MsoNormalTable {mso-style-name:普通表? mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-priority:99; mso-style-qformat:yes; mso-style-parent:""; mso-padding-alt:0cm 5.4pt 0cm 5.4pt; mso-para-margin:0cm; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.5pt; mso-bidi-font-size:11.0pt; font-family:"Calibri","sans-serif"; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-font-kerning:1.0pt;} <![endif]--> <div> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">早期的javaE序员可能只要懂基本语法Q还有少数的目l验可以找C份比较好的工作。Java和javaC֌的发展,更多的h了解它,深入它。现在javaE序员了解一些语法我看还q远不够了,对于jvm的了解和深入是非帔R要的。网民的增多Q网站的刚性需求,很多|站面(f)高性能Q高q发{等一pd的问题。没有深入jvm的javaE序员是很难写出高质量高q发的代码(也许一子打死所有h了,但我想绝大部分是肯定的)?/span></p> <p style="text-align:left;" align="left"> </p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">Osgi</span><span style="font-size:12.0pt;font-family:宋体;">也许你ƈ不陌生,但是他底层的实现机制你可能没M解过。如果你是个打破砂锅问到底的人,你肯定会(x)想知道osgi是如何做到的。但是你没有了解jvm的类加蝲体系Q你肯定很难理解osgi是如果做到类隔离{一pd的问题。不q想完整理解osgiq需要其他很多方面的知识Q但是它基本的机制还是的了解jvm的类加蝲机制?/span></p> <p style="text-align:left;" align="left"> </p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">Java</span><span style="font-size:12.0pt;font-family:宋体;">cd有些包只是定义了一个标准,具体的实现都是由具体的供应商来提供。Java与数据库q接是一个很好的例子。Java.sqlcd只是定义了java与数据库q接的标准,那么与mysql需要msyql的驱动,oracle需要oracle的驱动,而java.sqlcd是由bootstrap classloader加蝲Q驱动包中的cL?span>system classloader</span>来加载,不同cd载器加蝲的类是无法相互认识,所以自然也无法正常提供功能了。jvm又是提供了什么机制让他们交互呢?如果你确实对q些问题毫无头A的话Q那么我觉得你真的要好好理解下jvmcd载体pR?/span></p> <p style="text-align:left;" align="left"> </p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">q篇文章主要是介l下jvmcd载的机制基础知识。关于其他相x?qing),有时间的话,我?x)单独写文章来介绍?/span></p> <p style="text-align:left;" align="left"> </p> <p style="margin-left:18.0pt;text-align:left;text-indent:-18.0pt;" align="left"><span style="font-size:12.0pt;font-family:宋体;">1</span><span style="font-size: 12.0pt;font-family:宋体;">?/span> <span style="font-size:12.0pt;font-family:宋体;">java</span><span style="font-size:12.0pt;font-family: 宋体;">cd载器</span></p> <p style="margin-left:18.0pt;text-align:left;text-indent:-18.0pt;" align="left"><span style="font-size:12.0pt;font-family:宋体;"><img src="file:///C:/DOCUME%7E1/WB-YAN%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image001.jpg" alt="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/classloader-1.jpg" width="341" height="341" /></span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">1.1 Bootstrap classloader</span><span style="font-size:12.0pt;font-family: 宋体;">Qsun jdk是用c++实现Q所以在代码中你是无法获取此加蝲器的实例。此加蝲器主要负责加?JAVA_HOME/jre/lib/rt.jar。javacM获取l果为nullQ这里可以用一个例子跑下证明:(x)</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">public class Test {</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">         public static void main(String[] arg) throws Exception{</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">                   ClassLoader classloader = Test.class.getClassLoader();</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">                   System.out.println(classloader);</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">                   System.out.println(classloader.getParent());</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">                   System.out.println(classloader.getParent().getParent());</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">         }</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">}</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">输出l果Q?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">sun.misc.Launcher$AppClassLoader@19821f</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">sun.misc.Launcher$ExtClassLoader@addbf1</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">null</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">最后输出的null是代表bootstrap classloader?/span></p> <p style="text-align:left;" align="left"> </p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">1.2 Extension classloader</span><span style="font-size:12.0pt;font-family: 宋体;">Q主要加载扩展功能的jarQ?JAVA_HOME/jre/lib/ext/*.jar?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">1.3 System classloader</span><span style="font-size:12.0pt;font-family: 宋体;">Q加载claspath中的jar包?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">1.4</span><span style="font-size:12.0pt;font-family:宋体;">自定?classloaderQ主要加载你指定的目录中的包和类?/span></p> <p style="text-align:left;" align="left"> </p> <p style="margin-left:18.0pt;text-align:left;text-indent:-18.0pt;" align="left"><span style="font-size:12.0pt;font-family:宋体;">2</span><span style="font-size: 12.0pt;font-family:宋体;">?/span> <span style="font-size:12.0pt;font-family:宋体;">双亲委派模型</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">pȝq行Ӟ我们h加蝲Stringc,此时System Classloader自己不找classpath中的包,把请求{发给Extension ClassloaderQ但它也不做查找Q又转发lBootstrap ClassloaderQ但是它发现自己没有parent了。于是他在rt.jar包中扑ֈStringcdƈ加蝲到jvm中提供用。JvmZ么要q么实现呢?其实和java安全体系有关。假设jvm不是q么实现Q我们自定义一个Stringc,做一些破坏,那么q行jvm的机器肯定要受到损坏。具体例子:(x)</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">public class String {</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">         public static void main(String[] args) {</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">                   System.out.println("hello world");</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">         }</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">}</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">我们q行自定义Stringcȝ时候报错了Q说没有mainҎ(gu)Q可我们定义的明明有的,嘿嘿Q委z机制的~故最后加载到的是由bootstrap classloader在rt.jar包中的StringQ那个类是没有mainҎ(gu)Q因此报错了?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;"><img src="file:///C:/DOCUME%7E1/WB-YAN%7E1/LOCALS%7E1/Temp/msohtmlclip1/01/clip_image002.jpg" alt="http://www.aygfsteel.com/images/blogjava_net/yangpingyu/classloader-2.jpg" width="558" height="116" /></span></p> <p style="margin-left:18.0pt;text-align:left;text-indent:-18.0pt;" align="left"><span style="font-size:12.0pt;font-family:宋体;">3</span><span style="font-size: 12.0pt;font-family:宋体;">?/span> <span style="font-size:12.0pt;font-family:宋体;">c隔?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">jvm</span><span style="font-size:12.0pt;font-family:宋体;">中的cLQ类加蝲?包名+cd。比如:(x)URLClassLoader1QURLClassLoader2分别加蝲com.test.Test的时候会(x)加蝲两次Q因为每个classloader中的cd于其他classloader来说是隔ȝQ不认识的。例子:(x)</span></p> <p style="text-align:left; background:#EEEEEE" align="left"><span style="font-size:10.0pt;font-family:宋体;color:blue;">import</span><span style="font-size:10.0pt;font-family:宋体; color:black;"> java.net.URL;<br /> </span><span style="font-size:10.0pt;font-family:宋体;color:blue;">import</span><span style="font-size:10.0pt;font-family:宋体;color:black;"> java.net.URLClassLoader;<br /> <br /> </span><span style="font-size:10.0pt;font-family:宋体;color:blue;">public</span> <span style="font-size:10.0pt; font-family:宋体;color:blue;">class</span><span style="font-size:10.0pt;font-family:宋体; color:black;"> CustomClassloaderTest {<br />     </span><span style="font-size:10.0pt; font-family:宋体;color:blue;">public</span> <span style="font-size:10.0pt;font-family:宋体;color:blue;">static</span> <span style="font-size:10.0pt;font-family:宋体; color:blue;">void</span><span style="font-size: 10.0pt;font-family:宋体;color:black;"> main(String[] args) </span><span style="font-size:10.0pt;font-family:宋体;color:blue;">throws</span><span style="font-size:10.0pt; font-family:宋体;color:black;"> Exception {<br />         URL url = </span><span style="font-size:10.0pt;font-family:宋体; color:blue;">new</span><span style="font-size: 10.0pt;font-family:宋体;color:black;"> URL("file:/g:/");<br />         URLClassLoader ucl = </span><span style="font-size:10.0pt;font-family:宋体; color:blue;">new</span><span style="font-size: 10.0pt;font-family:宋体;color:black;"> URLClassLoader(</span><span style="font-size:10.0pt; font-family:宋体;color:blue;">new</span><span style="font-size:10.0pt;font-family:宋体; color:black;"> URL[]{url});<br />         Class c = ucl.loadClass("Yang");<br />         c.newInstance();<br />         System.out.println(c.getClassLoader());<br /> <br />         URLClassLoader ucl2 = </span><span style="font-size:10.0pt;font-family:宋体; color:blue;">new</span><span style="font-size: 10.0pt;font-family:宋体;color:black;"> URLClassLoader(</span><span style="font-size:10.0pt; font-family:宋体;color:blue;">new</span><span style="font-size:10.0pt;font-family:宋体; color:black;"> URL[]{url});<br />         Class c2 = ucl2.loadClass("Yang");<br />         c2.newInstance();<br />         System.out.println(c2.getClassLoader());<br />     }<br /> }</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">大家把Yangcd在g盘下?/span></p> <p style="text-align:left; background:#EEEEEE" align="left"><span style="font-size:10.0pt;font-family:宋体;color:blue;">public</span> <span style="font-size:10.0pt;font-family:宋体;color:blue;">class</span><span style="font-size:10.0pt; font-family:宋体;color:black;"> Yang {<br />     </span><span style="font-size:10.0pt; font-family:宋体;color:blue;">static</span><span style="font-size:10.0pt;font-family:宋体; color:black;"> {<br />         System.out.println("Yang");<br />     }<br /> }</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">q行l果Q?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">Yang</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">java.net.URLClassLoader@c17164</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">Yang</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">java.net.URLClassLoader@61de33</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">看到每次加蝲Yangcȝ时候都输出YangQ说明Yangc被加蝲了两ơ?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">如果你不信Q可以修改下代码Q让同一classloader加蝲YangcM?/span></p> <p style="text-align:left;" align="left"> </p> <p style="text-align:left; background:#EEEEEE" align="left"><span style="font-size:10.0pt;font-family:宋体;color:blue;">import</span><span style="font-size:10.0pt;font-family:宋体; color:black;"> java.net.URL;<br /> </span><span style="font-size:10.0pt;font-family:宋体;color:blue;">import</span><span style="font-size:10.0pt;font-family:宋体;color:black;"> java.net.URLClassLoader;<br /> <br /> </span><span style="font-size:10.0pt;font-family:宋体;color:blue;">public</span> <span style="font-size:10.0pt; font-family:宋体;color:blue;">class</span><span style="font-size:10.0pt;font-family:宋体; color:black;"> CustomClassloaderTest {<br />     </span><span style="font-size:10.0pt; font-family:宋体;color:blue;">public</span> <span style="font-size:10.0pt;font-family:宋体;color:blue;">static</span> <span style="font-size:10.0pt;font-family:宋体; color:blue;">void</span><span style="font-size: 10.0pt;font-family:宋体;color:black;"> main(String[] args) </span><span style="font-size:10.0pt;font-family:宋体;color:blue;">throws</span><span style="font-size:10.0pt; font-family:宋体;color:black;"> Exception {<br />         URL url = </span><span style="font-size:10.0pt;font-family:宋体; color:blue;">new</span><span style="font-size: 10.0pt;font-family:宋体;color:black;"> URL("file:/g:/");<br />         URLClassLoader ucl = </span><span style="font-size:10.0pt;font-family:宋体; color:blue;">new</span><span style="font-size: 10.0pt;font-family:宋体;color:black;"> URLClassLoader(</span><span style="font-size:10.0pt; font-family:宋体;color:blue;">new</span><span style="font-size:10.0pt;font-family:宋体; color:black;"> URL[]{url});<br />         Class c = ucl.loadClass("Yang");<br />         c.newInstance();<br />         System.out.println(c.getClassLoader());<br /> <br />         Class c2 = ucl.loadClass("Yang");<br />         c2.newInstance();<br />         System.out.println(c2.getClassLoader());<br />     }<br /> }</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">看看输出l果Q?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">Yang</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">java.net.URLClassLoader@c17164</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt;font-family:宋体;">java.net.URLClassLoader@c17164</span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">l果中只输出了一ơYang。因此可以证明我们最开始说的类隔离?/span></p> <p style="text-align:left;" align="left"> </p> <p style="margin-left:18.0pt;text-align:left;text-indent:-18.0pt;" align="left"><span style="font-size:12.0pt;font-family:宋体;">4</span><span style="font-size: 12.0pt;font-family:宋体;">?/span> <span style="font-size:12.0pt;font-family:宋体;">U程上下文类加蝲?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">我们理解了双亲委z模型,那么目前只有׃向上单向Lc(system->extension->bootstrapQ?/span></p> <p style="text-align:left;" align="left"><span style="font-size:12.0pt; font-family:宋体;">。我们在最开始的时候说q,java.sql包中的类由bootstrap或extension classloader加蝲Q而mysql驱动包是在classpath中由system来加载,但bootstrap中的cL无法扑ֈsystem classloader中的c,此时靠线E上下文cd载器来解冟뀂线E上下文cd载器主要是能让jvmcd载模型具有了向下L的可能,bootstrap->extension->systemQ如果不做Q何设|,U程上下文类加蝲器默认是system classloader。本来这里想写一个例子的Q可是有炚w烦,所以下ơ单独写一关于这斚w的知识?/span></p> <p> </p> </div><img src ="http://www.aygfsteel.com/yangpingyu/aggbug/350248.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/yangpingyu/" target="_blank">yangpingyu</a> 2011-05-14 21:41 <a href="http://www.aygfsteel.com/yangpingyu/archive/2011/05/14/350248.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <a href="http://www.aygfsteel.com/" title="狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频">狠狠久久亚洲欧美专区_中文字幕亚洲综合久久202_国产精品亚洲第五区在线_日本免费网站视频</a> </div> </footer> վ֩ģ壺 <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ֿ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ԫ</a>| <a href="http://" target="_blank">ԫ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¹Ȫ</a>| <a href="http://" target="_blank">ͤ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">Ժ</a>| <a href="http://" target="_blank">̳</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">²</a>| <a href="http://" target="_blank">ѷ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">з</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ϳ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ͼľ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ˮ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">ƺ</a>| <a href="http://" target="_blank">ƽ</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">˴</a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank"></a>| <a href="http://" target="_blank">¯</a>| <a href="http://" target="_blank"></a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>