﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-Change Dir</title><link>http://www.blogjava.net/changedi/</link><description>先知cd——热爱生活是一切艺术的开始</description><language>zh-cn</language><lastBuildDate>Sat, 15 Aug 2026 15:21:16 GMT</lastBuildDate><pubDate>Sat, 15 Aug 2026 15:21:16 GMT</pubDate><ttl>60</ttl><item><title>未来的技术blog更新地址</title><link>http://www.blogjava.net/changedi/archive/2015/11/25/428360.html</link><dc:creator>changedi</dc:creator><author>changedi</author><pubDate>Wed, 25 Nov 2015 08:46:00 GMT</pubDate><guid>http://www.blogjava.net/changedi/archive/2015/11/25/428360.html</guid><wfw:comment>http://www.blogjava.net/changedi/comments/428360.html</wfw:comment><comments>http://www.blogjava.net/changedi/archive/2015/11/25/428360.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/changedi/comments/commentRss/428360.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/changedi/services/trackbacks/428360.html</trackback:ping><description><![CDATA[<a href="https://www.zybuluo.com/changedi/note/226966" target="_blank" style="color: #0088cc; text-decoration: none; font-family: 'Microsoft Yahei', 'Hiragino Sans GB', 'WenQuanYi Micro Hei', sans-serif; line-height: 20px; background-color: #f9f9f5;">https://www.zybuluo.com/changedi/note/226966<br /><br />未来就在上面的地址更新blog了，欢迎大家阅读指正共同进步。<br /></a><img src ="http://www.blogjava.net/changedi/aggbug/428360.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/changedi/" target="_blank">changedi</a> 2015-11-25 16:46 <a href="http://www.blogjava.net/changedi/archive/2015/11/25/428360.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>docker初体验之docker-tomcat</title><link>http://www.blogjava.net/changedi/archive/2015/09/14/427310.html</link><dc:creator>changedi</dc:creator><author>changedi</author><pubDate>Mon, 14 Sep 2015 12:05:00 GMT</pubDate><guid>http://www.blogjava.net/changedi/archive/2015/09/14/427310.html</guid><wfw:comment>http://www.blogjava.net/changedi/comments/427310.html</wfw:comment><comments>http://www.blogjava.net/changedi/archive/2015/09/14/427310.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/changedi/comments/commentRss/427310.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/changedi/services/trackbacks/427310.html</trackback:ping><description><![CDATA[<p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">docker</span><span style="font-family:宋体">已经是现在最热的容器技术，最近也去体验了一下，在</span><span style="font-family:Calibri">daocloud</span><span style="font-family: 宋体">注册了一个账号，并开始本机实战</span><span style="font-family:Calibri">docker</span><span style="font-family:宋体">。daocloud免费有两个容器可用，体验送T恤，邀请送书，这里我分享一个daocloud的邀请码</span><a href="https://account.daocloud.io/signup?invite_code=mxeq2jkmcur37vz6ven8">https://account.daocloud.io/signup?invite_code=mxeq2jkmcur37vz6ven8</a><span style="font-family: 宋体; font-size: 10.5pt;">，daocloud是非常棒的容器云平台，使用体验好，问题响应也及时，绑定微信还送一个额外容器。</span></p><p style="margin:0in;font-size:10.5pt"><span style="font-family:宋体">好吧，停止广告，daocloud再好，也不给我发钱，真是的。<br /><br /></span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:宋体">这里就介绍一下我最简单的一个</span><span style="font-family:Calibri">docker-tomcat</span><span style="font-family:宋体">容器。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:宋体">首先在我的</span><span style="font-family:Calibri">linux</span><span style="font-family: 宋体">机器上安装</span><span style="font-family:Calibri">docker</span><span style="font-family:宋体">：</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:宋体">安装教程特别多，随便可以找到，我的本地环境是</span><span style="font-family:Calibri">64</span><span style="font-family:宋体">位的</span><span style="font-family:Calibri">centos7.0</span><span style="font-family:宋体">，所以安装就被简化为：</span></p>  <p style="margin:0in;font-family:Calibri;font-size:10.5pt">Sudo yum install docker</p>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">这么一句话了。</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">docker</span><span style="font-family:宋体">的核心思想是</span><span style="font-family:Calibri">everything is container</span><span style="font-family:宋体">，</span><span style="font-family:Calibri">docker</span><span style="font-family:宋体">运行的就是一个个的容器，而容器是用户完全自定义的镜像，我个人认为最灵活的就是写一个</span><span style="font-family:Calibri">dockerfile</span><span style="font-family: 宋体">（我理解就算一个镜像了），然后把它</span><span style="font-family:Calibri">build</span><span style="font-family:宋体">为镜像并</span><span style="font-family:Calibri">run</span><span style="font-family:宋体">，一个可用的容器环境就完全起来了。</span></p>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">步骤：</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:宋体">，创建一个项目，最好在</span><span style="font-family:Calibri">git</span><span style="font-family:宋体">上</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:宋体">，写</span><span style="font-family:Calibri">Dockerfile</span><span style="font-family: 宋体">文件，描述你的镜像</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">3</span><span style="font-family:宋体">，</span><span style="font-family:Calibri">docker build</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">4</span><span style="font-family:宋体">，</span><span style="font-family:Calibri">docker run</span></p>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">这样就好了。</p>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">于是，以我个人的项目为例：</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:宋体">，创建项目：</span><span style="font-family:Calibri">https://github.com/changedi/mydocker</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:宋体">，编辑</span><span style="font-family:Calibri">Dockerfile</span><span style="font-family: 宋体">：</span><span style="font-family:Calibri">https://github.com/changedi/mydocker/blob/master/Dockerfile</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">3</span><span style="font-family:宋体">，在本地项目中运行</span><span style="font-family:Calibri">docker build &lt;image_name&gt; .</span><span style="font-family:宋体">，</span><span style="font-family:Calibri">build</span><span style="font-family:宋体">一个自定义名字的镜像</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">4</span><span style="font-family:宋体">，启动这个镜像容器：</span><span style="font-family:Calibri">docker run -d -p 80:80 &lt;image_name&gt;</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:宋体">这样，这个镜像就好了，服务也起来了，后续可以通过</span><span style="font-family:Calibri">docker ps</span><span style="font-family: 宋体">来查看启动的镜像，通过</span><span style="font-family:Calibri">docker stop</span><span style="font-family:宋体">来停止容器。</span></p>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:宋体">我这里解释一下我的</span><span style="font-family:Calibri">Dockerfile</span><span style="font-family: 宋体">：</span></p>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">&nbsp;<span style="font-size: 13px; font-family: verdana, 'courier new'; color: #008080;">&nbsp;1</span><span style="font-size: 13px; font-family: verdana, 'courier new'; background-color: #eeeeee;">&nbsp;</span><span style="font-size: 13px; font-family: verdana, 'courier new'; background-color: #eeeeee;">#&nbsp;Using&nbsp;a&nbsp;compact&nbsp;OS</span></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #008080; ">&nbsp;2</span>&nbsp;FROM&nbsp;ubuntu:13.10&nbsp;<br /><span style="color: #008080; ">&nbsp;3</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;4</span>&nbsp;MAINTAINER&nbsp;changedi&nbsp;&lt;jysoftware@gmail.com&gt;&nbsp;<br /><span style="color: #008080; ">&nbsp;5</span>&nbsp;<br /><span style="color: #008080; ">&nbsp;6</span>&nbsp;#&nbsp;update&nbsp;source&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;7</span>&nbsp;RUN&nbsp;echo&nbsp;"deb&nbsp;http://archive.ubuntu.com/ubuntu&nbsp;precise&nbsp;main&nbsp;universe"&gt;&nbsp;/etc/apt/sources.list&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;8</span>&nbsp;RUN&nbsp;apt-<span style="color: #0000FF; ">get</span>&nbsp;update&nbsp;&nbsp;<br /><span style="color: #008080; ">&nbsp;9</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">10</span>&nbsp;#&nbsp;Install&nbsp;curl&nbsp;&nbsp;<br /><span style="color: #008080; ">11</span>&nbsp;RUN&nbsp;apt-<span style="color: #0000FF; ">get</span>&nbsp;-y&nbsp;install&nbsp;curl&nbsp;&nbsp;<br /><span style="color: #008080; ">12</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">13</span>&nbsp;#&nbsp;Install&nbsp;JDK&nbsp;7&nbsp;&nbsp;<br /><span style="color: #008080; ">14</span>&nbsp;RUN&nbsp;cd&nbsp;/tmp&nbsp;&amp;&amp;&nbsp;&nbsp;curl&nbsp;-L&nbsp;<span style="color: #008000; ">'</span><span style="color: #008000; ">http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz'&nbsp;-H&nbsp;'Cookie:&nbsp;oraclelicense=accept-securebackup-cookie;&nbsp;gpw_e24=Dockerfile'&nbsp;|&nbsp;tar&nbsp;-xz&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">15</span>&nbsp;<span style="color: #008000; "></span>RUN&nbsp;mkdir&nbsp;-p&nbsp;/usr/lib/jvm&nbsp;&nbsp;<br /><span style="color: #008080; ">16</span>&nbsp;RUN&nbsp;mv&nbsp;/tmp/jdk1.7.0_65/&nbsp;/usr/lib/jvm/java-7-oracle/&nbsp;&nbsp;<br /><span style="color: #008080; ">17</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">18</span>&nbsp;#&nbsp;<span style="color: #0000FF; ">Set</span>&nbsp;Oracle&nbsp;JDK&nbsp;7&nbsp;<span style="color: #0000FF; ">as</span>&nbsp;default&nbsp;Java&nbsp;&nbsp;<br /><span style="color: #008080; ">19</span>&nbsp;RUN&nbsp;update-alternatives&nbsp;--install&nbsp;/usr/bin/java&nbsp;java&nbsp;/usr/lib/jvm/java-7-oracle/bin/java&nbsp;300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">20</span>&nbsp;RUN&nbsp;update-alternatives&nbsp;--install&nbsp;/usr/bin/javac&nbsp;javac&nbsp;/usr/lib/jvm/java-7-oracle/bin/javac&nbsp;300&nbsp;&nbsp;<br /><span style="color: #008080; ">21</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">22</span>&nbsp;ENV&nbsp;JAVA_HOME&nbsp;/usr/lib/jvm/java-7-oracle/&nbsp;&nbsp;<br /><span style="color: #008080; ">23</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">24</span>&nbsp;#&nbsp;Install&nbsp;tomcat7&nbsp;&nbsp;<br /><span style="color: #008080; ">25</span>&nbsp;RUN&nbsp;cd&nbsp;/tmp&nbsp;&amp;&amp;&nbsp;curl&nbsp;-L&nbsp;<span style="color: #008000; ">'</span><span style="color: #008000; ">http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz'&nbsp;|&nbsp;tar&nbsp;-xz&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span><span style="color: #008080; ">26</span>&nbsp;<span style="color: #008000; "></span>RUN&nbsp;mv&nbsp;/tmp/apache-tomcat-7.0.8/&nbsp;/opt/tomcat7/&nbsp;&nbsp;<br /><span style="color: #008080; ">27</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">28</span>&nbsp;ENV&nbsp;CATALINA_HOME&nbsp;/opt/tomcat7&nbsp;&nbsp;<br /><span style="color: #008080; ">29</span>&nbsp;ENV&nbsp;PATH&nbsp;$PATH:$CATALINA_HOME/bin:$JAVA_HOME/bin&nbsp;&nbsp;<br /><span style="color: #008080; ">30</span>&nbsp;<br /><span style="color: #008080; ">31</span>&nbsp;#&nbsp;ADD&nbsp;ace-java-demo-1.0.0.war&nbsp;/tmp/myapp/<br /><span style="color: #008080; ">32</span>&nbsp;#&nbsp;RUN&nbsp;cd&nbsp;/tmp/myapp&nbsp;&amp;&amp;&nbsp;jar&nbsp;-xvf&nbsp;ace-java-demo-1.0.0.war<br /><span style="color: #008080; ">33</span>&nbsp;#&nbsp;RUN&nbsp;rm&nbsp;-rf&nbsp;ace-java-demo-1.0.0.war<br /><span style="color: #008080; ">34</span>&nbsp;#&nbsp;RUN&nbsp;cp&nbsp;-R&nbsp;/tmp/myapp&nbsp;/opt/tomcat7/webapps/myapp<br /><span style="color: #008080; ">35</span>&nbsp;#&nbsp;RUN&nbsp;mkdir&nbsp;/opt/tomcat7/webapps/myapp<br /><span style="color: #008080; ">36</span>&nbsp;RUN&nbsp;rm&nbsp;-rf&nbsp;/opt/tomcat7/webapps/ROOT/*<br /><span style="color: #008080; ">37</span>&nbsp;ADD&nbsp;ace-java-demo-1.0.0.war&nbsp;/opt/tomcat7/webapps/ROOT/ace-java-demo-1.0.0.war<br /><span style="color: #008080; ">38</span>&nbsp;RUN&nbsp;cd&nbsp;/opt/tomcat7/webapps/ROOT/&nbsp;&amp;&amp;&nbsp;jar&nbsp;-xvf&nbsp;ace-java-demo-1.0.0.war<br /><span style="color: #008080; ">39</span>&nbsp;&nbsp;<br /><span style="color: #008080; ">40</span>&nbsp;ADD&nbsp;tomcat-users.xml&nbsp;/opt/tomcat7/conf/tomcat-users.xml<br /><span style="color: #008080; ">41</span>&nbsp;#&nbsp;ADD&nbsp;server.xml&nbsp;/opt/tomcat7/conf/server.xml<br /><span style="color: #008080; ">42</span>&nbsp;RUN&nbsp;cat&nbsp;/opt/tomcat7/conf/serv*.xml<br /><span style="color: #008080; ">43</span>&nbsp;RUN&nbsp;ls&nbsp;/opt/tomcat7/conf<br /><span style="color: #008080; ">44</span>&nbsp;RUN&nbsp;ls&nbsp;/opt/tomcat7/webapps<br /><span style="color: #008080; ">45</span>&nbsp;<br /><span style="color: #008080; ">46</span>&nbsp;ADD&nbsp;tomcat7.sh&nbsp;/etc/init.d/tomcat7&nbsp;&nbsp;<br /><span style="color: #008080; ">47</span>&nbsp;RUN&nbsp;chmod&nbsp;755&nbsp;/etc/init.d/tomcat7&nbsp;&nbsp;<br /><span style="color: #008080; ">48</span>&nbsp;&nbsp;&nbsp;<br /><span style="color: #008080; ">49</span>&nbsp;#&nbsp;install&nbsp;nginx<br /><span style="color: #008080; ">50</span>&nbsp;RUN&nbsp;apt-<span style="color: #0000FF; ">get</span>&nbsp;install&nbsp;nginx&nbsp;-y<br /><span style="color: #008080; ">51</span>&nbsp;ADD&nbsp;./nginx/nginx-conf&nbsp;/etc/nginx/conf.d<br /><span style="color: #008080; ">52</span>&nbsp;<br /><span style="color: #008080; ">53</span>&nbsp;#&nbsp;Expose&nbsp;ports<br /><span style="color: #008080; ">54</span>&nbsp;EXPOSE&nbsp;80<br /><span style="color: #008080; ">55</span>&nbsp;<br /><span style="color: #008080; ">56</span>&nbsp;<br /><span style="color: #008080; ">57</span>&nbsp;#&nbsp;Define&nbsp;default&nbsp;command.&nbsp;&nbsp;<br /><span style="color: #008080; ">58</span>&nbsp;ENTRYPOINT&nbsp;service&nbsp;tomcat7&nbsp;start&nbsp;&amp;&amp;&nbsp;tail&nbsp;-f&nbsp;/opt/tomcat7/logs/catalina.out</div>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">主要做几件事：</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:宋体">，拉个操作系统：这里是</span><span style="font-family:Calibri">Ubuntu</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:宋体">，装工具：</span><span style="font-family:Calibri">curl</span><span style="font-family: 宋体">、</span><span style="font-family:Calibri">jdk</span><span style="font-family:宋体">、</span><span style="font-family:Calibri">tomcat</span><span style="font-family:宋体">、</span><span style="font-family:Calibri">nginx</span><span style="font-family: 宋体">，配置环境变量，配置</span><span style="font-family:Calibri">tomcat</span><span style="font-family:宋体">，配置</span><span style="font-family:Calibri">nginx</span><span style="font-family:宋体">（</span><span style="font-family:Calibri">tomcat</span><span style="font-family: 宋体">和</span><span style="font-family:Calibri">nginx</span><span style="font-family:宋体">的配置都是本地搞好，直接</span><span style="font-family: Calibri">add</span><span style="font-family:宋体">）</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">3</span><span style="font-family:宋体">，部署应用（自己的</span><span style="font-family:Calibri">war</span><span style="font-family:宋体">包），这里我直接利用</span><span style="font-family:Calibri">docker</span><span style="font-family:宋体">的</span><span style="font-family:Calibri">ADD</span><span style="font-family:宋体">操作，把</span><span style="font-family:Calibri">git</span><span style="font-family:宋体">项目中的文件直接</span><span style="font-family:Calibri">add</span><span style="font-family:宋体">到容器中</span></p>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-family:宋体;font-size:10.5pt">参考资料：</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:宋体">，</span><span style="font-family:Calibri">docker</span><span style="font-family: 宋体">安装</span> <a href="http://www.linuxidc.com/Linux/2014-12/110034.htm"><span style="font-family: Calibri">http://www.linuxidc.com/Linux/2014-12/110034.htm</span></a></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:宋体">，</span><span style="font-family:Calibri">dockerfile</span><span style="font-family: 宋体">编写</span> <a href="http://blog.csdn.net/we_shell/article/details/38445979"><span style="font-family:Calibri">http://blog.csdn.net/we_shell/article/details/38445979</span></a></p> <div id="haloword-lookup" class="ui-widget-content ui-draggable"><div id="haloword-title"><span id="haloword-word"></span><a herf="#" id="haloword-pron" class="haloword-button" title="发音"></a><audio id="haloword-audio"></audio><div id="haloword-control-container"><a herf="#" id="haloword-add" class="haloword-button" title="加入单词表"></a><a herf="#" id="haloword-remove" class="haloword-button" title="移出单词表"></a><a href="#" id="haloword-open" class="haloword-button" title="查看单词详细释义" target="_blank"></a><a herf="#" id="haloword-close" class="haloword-button" title="关闭查询窗"></a></div></div><div id="haloword-content"></div></div> <div id="haloword-lookup" class="ui-widget-content"><div id="haloword-title"><span id="haloword-word"></span><a herf="#" id="haloword-pron" class="haloword-button" title="发音"></a><audio id="haloword-audio"></audio><div id="haloword-control-container"><a herf="#" id="haloword-add" class="haloword-button" title="加入单词表"></a><a herf="#" id="haloword-remove" class="haloword-button" title="移出单词表"></a><a href="#" id="haloword-open" class="haloword-button" title="查看单词详细释义" target="_blank"></a><a herf="#" id="haloword-close" class="haloword-button" title="关闭查询窗"></a></div></div><div id="haloword-content"></div></div><img src ="http://www.blogjava.net/changedi/aggbug/427310.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/changedi/" target="_blank">changedi</a> 2015-09-14 20:05 <a href="http://www.blogjava.net/changedi/archive/2015/09/14/427310.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用MAT对java内存分析</title><link>http://www.blogjava.net/changedi/archive/2015/08/17/426849.html</link><dc:creator>changedi</dc:creator><author>changedi</author><pubDate>Mon, 17 Aug 2015 11:08:00 GMT</pubDate><guid>http://www.blogjava.net/changedi/archive/2015/08/17/426849.html</guid><wfw:comment>http://www.blogjava.net/changedi/comments/426849.html</wfw:comment><comments>http://www.blogjava.net/changedi/archive/2015/08/17/426849.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/changedi/comments/commentRss/426849.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/changedi/services/trackbacks/426849.html</trackback:ping><description><![CDATA[<p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">这是一篇阅读MAT helper的笔记。<br /><br />Heap dump</span><span style="font-family:SimSun">是</span><span style="font-family:Calibri">java</span><span style="font-family: SimSun">进程在特定时间的一个内存快照。通常在触发</span><span style="font-family:Calibri">heap dump</span><span style="font-family:SimSun">之前会进行一次</span><span style="font-family:Calibri">full gc</span><span style="font-family: SimSun">，这样</span><span style="font-family:Calibri">dump</span><span style="font-family:SimSun">出来的内容就包含的是被</span><span style="font-family: Calibri">gc</span><span style="font-family:SimSun">后的对象。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">dump</span><span style="font-family:SimSun">文件包含的内容：</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:SimSun">，全部的对象：类，域，原生值和引用；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:SimSun">，全部的类：</span><span style="font-family:Calibri">classloader</span><span style="font-family:SimSun">，类名，超类，静态域；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">3</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">GC root</span><span style="font-family: SimSun">：被</span><span style="font-family:Calibri">JVM</span><span style="font-family:SimSun">定义的可触达的对象；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">4</span><span style="font-family:SimSun">，线程栈和本地变量：线程的</span><span style="font-family:Calibri">call stack</span><span style="font-family: SimSun">，本地对象每帧的信息。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">dump</span><span style="font-family:SimSun">文件不包含内存的分配信息，因此无法查询谁创建了哪个对象这样的信息。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">Shallow heap</span><span style="font-family:SimSun">是一个对象占用的内存空间，一个对象需要</span><span style="font-family:Calibri">32</span><span style="font-family:SimSun">或者</span><span style="font-family:Calibri">64bits</span><span style="font-family:SimSun">。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">Retained set of X</span><span style="font-family:SimSun">是</span><span style="font-family:Calibri">X</span><span style="font-family:SimSun">在被</span><span style="font-family:Calibri">jvm gc</span><span style="font-family:SimSun">回收后被</span><span style="font-family:Calibri">remove</span><span style="font-family:SimSun">的一组</span><span style="font-family:Calibri">object</span><span style="font-family: SimSun">。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">Retained heap of X</span><span style="font-family:SimSun">是在</span><span style="font-family:Calibri">retained set of X</span><span style="font-family:SimSun">中的所有对象的</span><span style="font-family:Calibri">shallow heap size</span><span style="font-family:SimSun">的和。换句话说就是保持</span><span style="font-family: Calibri">X</span><span style="font-family:SimSun">活着需要的内存空间。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:SimSun">通俗的讲，</span><span style="font-family:Calibri">shallow heap</span><span style="font-family:SimSun">是一个对象在内存中的实际空间，而</span><span style="font-family:Calibri">retained heap</span><span style="font-family:SimSun">是一个对象被</span><span style="font-family: Calibri">gc</span><span style="font-family:SimSun">回收后内存释放出来的空间。</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in"><img src="http://www.blogjava.net/images/blogjava_net/changedi/未命名图片.png" width="487" height="271" alt="" /><br /></p>  <p style="margin:0in;font-family:Calibri;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:SimSun">这张图可以看懂什么是</span><span style="font-family:Calibri">leading set</span><span style="font-family:SimSun">什么是</span><span style="font-family:Calibri">retained set</span><span style="font-family:SimSun">。</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">Dominator tree</span><span style="font-family:SimSun">：定义一个对象</span><span style="font-family:Calibri">x dominate </span><span style="font-family:SimSun">对象</span><span style="font-family:Calibri">y</span><span style="font-family:SimSun">，当每一条从</span><span style="font-family:Calibri">root</span><span style="font-family: SimSun">开始到</span><span style="font-family:Calibri">y</span><span style="font-family:SimSun">的路径都经过</span><span style="font-family: Calibri">x</span><span style="font-family:SimSun">。说白了就是只要有</span><span style="font-family:Calibri">y</span><span style="font-family:SimSun">对象的存活，那么一定会有一个</span><span style="font-family:Calibri">x</span><span style="font-family:SimSun">对象。</span><span style="font-family:Calibri">Dominator tree</span><span style="font-family:SimSun">就是将对象引用图转换成的树形结构。帮助发现在对象间保持</span><span style="font-family:Calibri">alive</span><span style="font-family: SimSun">的依赖，同时也能识别出</span><span style="font-family:Calibri">retained</span><span style="font-family:SimSun">内存的最大的</span><span style="font-family:Calibri">chunk</span><span style="font-family: SimSun">。</span><span style="font-family:Calibri">Immediate dominator x of y</span><span style="font-family:SimSun">是离</span><span style="font-family:Calibri">y</span><span style="font-family:SimSun">最近的</span><span style="font-family:Calibri">dominator</span><span style="font-family:SimSun">。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">Dominator tree</span><span style="font-family:SimSun">有几个属性：</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:SimSun">，对象</span><span style="font-family:Calibri">x</span><span style="font-family:SimSun">的子树包含的对象（</span><span style="font-family:Calibri">x dominate</span><span style="font-family:SimSun">的对象集），代表了</span><span style="font-family:Calibri">x</span><span style="font-family:SimSun">的</span><span style="font-family:Calibri">retained set</span><span style="font-family:SimSun">；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:SimSun">，如果</span><span style="font-family:Calibri">x</span><span style="font-family:SimSun">是</span><span style="font-family:Calibri">y</span><span style="font-family:SimSun">的</span><span style="font-family:Calibri">immediate dominator</span><span style="font-family:SimSun">，那么</span><span style="font-family:Calibri">x</span><span style="font-family:SimSun">的</span><span style="font-family:Calibri">immediate dominator</span><span style="font-family:SimSun">同样</span><span style="font-family:Calibri">dominate y</span><span style="font-family:SimSun">，以此类推；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">3</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">dominate tree</span><span style="font-family:SimSun">中的边不代表对象引用图里对应的边，并非严格的直接的对象引用。</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in"><img src="http://www.blogjava.net/images/blogjava_net/changedi/未命名图片2.png" width="639" height="307" alt="" /><br /></p>  <p style="margin:0in;font-family:Calibri;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:SimSun">这张图反应了一个对象引用图转换成</span><span style="font-family:Calibri">dominator tree</span><span style="font-family:SimSun">的示例。</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">Gc root</span><span style="font-family:SimSun">：一个</span><span style="font-family:Calibri">gc</span><span style="font-family:SimSun">根就是一个对象，这个对象从堆外可以访问读取。以下一些方法可以使一个对象成为</span><span style="font-family: Calibri">gc</span><span style="font-family:SimSun">根。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">System class</span><span style="font-family:SimSun">：被</span><span style="font-family:Calibri">bootstrap</span><span style="font-family:SimSun">或者</span><span style="font-family:Calibri">system</span><span style="font-family: SimSun">类加载器加载的类，比如</span><span style="font-family:Calibri">rt.jar</span><span style="font-family:SimSun">里的</span><span style="font-family:Calibri">java.util.*</span><span style="font-family:SimSun">；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">JNI local</span><span style="font-family: SimSun">：</span><span style="font-family:Calibri">native</span><span style="font-family:SimSun">代码里的</span><span style="font-family:Calibri">local</span><span style="font-family:SimSun">变量，比如用户定义的</span><span style="font-family:Calibri">JNI</span><span style="font-family:SimSun">代码和</span><span style="font-family:Calibri">JVM</span><span style="font-family:SimSun">的内部代码；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">3</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">JNI global</span><span style="font-family: SimSun">：</span><span style="font-family:Calibri">native</span><span style="font-family:SimSun">代码里的</span><span style="font-family:Calibri">global</span><span style="font-family:SimSun">变量；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">4</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">Thread block</span><span style="font-family:SimSun">：当前活跃的线程</span><span style="font-family: Calibri">block</span><span style="font-family:SimSun">中引用的对象；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">5</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">Thread</span><span style="font-family: SimSun">：已经启动并且没有</span><span style="font-family:Calibri">stop</span><span style="font-family:SimSun">的线程；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">6</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">busy monitor</span><span style="font-family:SimSun">：被调用了</span><span style="font-family: Calibri">wait()</span><span style="font-family:SimSun">或者</span><span style="font-family:Calibri">notify()</span><span style="font-family: SimSun">或者被</span><span style="font-family:Calibri">synchronized</span><span style="font-family:SimSun">同步的对象，如果是</span><span style="font-family: Calibri">synchronized</span><span style="font-family:SimSun">方法，那么静态方法指的类，非静态方法指的是对象；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">7</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">java local</span><span style="font-family: SimSun">：</span><span style="font-family:Calibri">local</span><span style="font-family:SimSun">变量，比如方法的入参和方法内创建的变量；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">8</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">native stack</span><span style="font-family:SimSun">：</span><span style="font-family:Calibri">native</span><span style="font-family:SimSun">代码里的出入参数，比如</span><span style="font-family:Calibri">file/net/IO</span><span style="font-family:SimSun">方法以及反射的参数；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">9</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">finalizable</span><span style="font-family:SimSun">：在一个队列里等待它的</span><span style="font-family: Calibri">finalizer </span><span style="font-family:SimSun">运行的对象；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">10</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">unfinalized</span><span style="font-family:SimSun">：一个有</span><span style="font-family:Calibri">finalize</span><span style="font-family:SimSun">方法的对象，还没有被</span><span style="font-family:Calibri">finalize</span><span style="font-family: SimSun">，同时也没有进入</span><span style="font-family:Calibri">finalizer</span><span style="font-family:SimSun">队列等待</span><span style="font-family:Calibri">finalize</span><span style="font-family:SimSun">；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">11</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">unreachable</span><span style="font-family:SimSun">：不会被触碰到的对象，在</span><span style="font-family:Calibri">MAT</span><span style="font-family:SimSun">里被标记为</span><span style="font-family:Calibri">root</span><span style="font-family:SimSun">用来</span><span style="font-family:Calibri">retain object</span><span style="font-family:SimSun">，否则是不会在分析中出现的；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">12</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">java stack frame</span><span style="font-family:SimSun">：</span><span style="font-family:Calibri">java</span><span style="font-family:SimSun">栈帧包含了本地变量，当</span><span style="font-family:Calibri">dump</span><span style="font-family: SimSun">被解析时且在</span><span style="font-family:Calibri">preferences</span><span style="font-family:SimSun">里设置过把栈帧当做对象，这时才会产生；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">13</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">unknown</span><span style="font-family: SimSun">：位置的</span><span style="font-family:Calibri">root</span><span style="font-family:SimSun">类型。</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:SimSun">接下来是一些获取</span><span style="font-family:Calibri">dump</span><span style="font-family:SimSun">的方法：</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:SimSun">，在</span><span style="font-family:Calibri">oom</span><span style="font-family:SimSun">时</span><span style="font-family:Calibri">dump</span><span style="font-family:SimSun">：</span><span style="font-family:Calibri">JVM</span><span style="font-family:SimSun">参数：</span><span style="font-family:Calibri">-XX:+HeapDumpOnOutOfMemoryError</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:SimSun">，交互式环境下</span><span style="font-family:Calibri">dump</span><span style="font-family: SimSun">：</span></p>  <p style="margin:0in;margin-left:.375in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:SimSun">）</span><span style="font-family:Calibri">JVM</span><span style="font-family:SimSun">参数：</span><span style="font-family:Calibri">-XX:+HeapDumpOnCtrlBreak</span></p>  <p style="margin:0in;margin-left:.375in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:SimSun">）用外部</span><span style="font-family:Calibri">tools</span><span style="font-family:SimSun">：</span><span style="font-family:Calibri">jmap -dump:format=b,file=&lt;filename.hprof&gt; &lt;pid&gt;</span></p>  <p style="margin:0in;margin-left:.375in;font-size:10.5pt"><span style="font-family:Calibri">3</span><span style="font-family:SimSun">）用外部</span><span style="font-family:Calibri">tools</span><span style="font-family:SimSun">：</span><span style="font-family:Calibri">jconsole</span></p>  <p style="margin:0in;margin-left:.375in;font-size:10.5pt"><span style="font-family:Calibri">4</span><span style="font-family:SimSun">）用外部工具：</span><span style="font-family:Calibri">MAT</span></p>  <p style="margin:0in;margin-left:.375in;font-size:10.5pt"><span style="font-family:Calibri">5</span><span style="font-family:SimSun">）</span><span style="font-family:Calibri">kill -3 &lt;pid&gt;</span></p>  <p style="margin:0in;margin-left:.375in;font-size:10.5pt"><span style="font-family:Calibri">6</span><span style="font-family:SimSun">）</span><span style="font-family:Calibri">jstack -l &lt;pid&gt; &gt; &lt;dumpfile&gt;</span></p>  <p style="margin:0in;font-family:Calibri;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">一些排查方法：</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">1</span><span style="font-family:SimSun">，通过</span><span style="font-family:Calibri">top consumers</span><span style="font-family:SimSun">查找大对象，可以按照</span><span style="font-family: Calibri">class</span><span style="font-family:SimSun">、</span><span style="font-family:Calibri">classloader</span><span style="font-family:SimSun">和</span><span style="font-family:Calibri">package</span><span style="font-family:SimSun">进行</span><span style="font-family:Calibri">group by</span><span style="font-family: SimSun">；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">2</span><span style="font-family:SimSun">，通过</span><span style="font-family:Calibri">immediate dominator</span><span style="font-family:SimSun">找到责任对象，对于快速定位一组对象的持有者非常有用，这个操作直接解决了&#8220;谁让这些对象</span><span style="font-family:Calibri">alive</span><span style="font-family: SimSun">&#8221;的问题，而不是&#8220;谁有这些对象的引用&#8221;的问题，更直接高效；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">3</span><span style="font-family:SimSun">，运行</span><span style="font-family:Calibri">classloader</span><span style="font-family:SimSun">分析，这个重要性体现在亮点：第一，应用使用不同的</span><span style="font-family:Calibri">classloader</span><span style="font-family:SimSun">加载类，第二，不同</span><span style="font-family: Calibri">classloader</span><span style="font-family:SimSun">加载的类存储在不同的永久代，这理论上也是可以被回收的。当有一个类被不同的</span><span style="font-family: Calibri">classloader</span><span style="font-family:SimSun">加载时，这时要根据各自</span><span style="font-family:Calibri">loader</span><span style="font-family:SimSun">下的</span><span style="font-family:Calibri">instance</span><span style="font-family:SimSun">数量判断哪个</span><span style="font-family:Calibri">loader</span><span style="font-family: SimSun">更重要，从而要把另一个回收掉；</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">4</span><span style="font-family:SimSun">，分析线程，本身</span><span style="font-family:Calibri">heap dump</span><span style="font-family: SimSun">里包含了</span><span style="font-family:Calibri">thread</span><span style="font-family:SimSun">信息，可以通过</span><span style="font-family: Calibri">MAT</span><span style="font-family:SimSun">来查看</span><span style="font-family:Calibri">threads </span><span style="font-family: SimSun">的</span><span style="font-family:Calibri">overview</span><span style="font-family:SimSun">和</span><span style="font-family:Calibri">detail</span><span style="font-family:SimSun">，</span><span style="font-family:Calibri">detail</span><span style="font-family: SimSun">中有线程的堆内存信息，也有线程栈，同时还包含了操作系统本地栈。假设不做</span><span style="font-family:Calibri">heap dump</span><span style="font-family: SimSun">，我们检查到系统有问题，如何通过线程的角度来排查呢？首先</span><span style="font-family: Calibri">top -H -p &lt;pid&gt;</span><span style="font-family:SimSun">以线程的模式查看</span><span style="font-family:Calibri">java</span><span style="font-family:SimSun">应用的运行情况，找到占用</span><span style="font-family:Calibri">cpu</span><span style="font-family:SimSun">或者内存大的线程，记录线程</span><span style="font-family:Calibri">id</span><span style="font-family:SimSun">，然后</span><span style="font-family:Calibri">printf %x &lt;tid&gt;</span><span style="font-family:SimSun">转为</span><span style="font-family:Calibri">16</span><span style="font-family:SimSun">进制，再</span><span style="font-family:Calibri">jstack -l &lt;pid&gt; &gt; thread.log</span><span style="font-family: SimSun">把</span><span style="font-family:Calibri">java</span><span style="font-family:SimSun">进程的</span><span style="font-family:Calibri">thread dump</span><span style="font-family:SimSun">出来，从里面找到</span><span style="font-family:Calibri">tid</span><span style="font-family:SimSun">，分析是哪个线程占用了系统资源。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">5</span><span style="font-family:SimSun">，分析</span><span style="font-family:Calibri">java</span><span style="font-family: SimSun">容器类，因为</span><span style="font-family:Calibri">java</span><span style="font-family:SimSun">的容器类是最常用来存储对象的，所以理论上发生内存泄露的风险也最高。可以从几个角度来看：</span><span style="font-family:Calibri">1</span><span style="font-family:SimSun">）</span><span style="font-family:Calibri">array</span><span style="font-family:SimSun">填充率查询（填充率</span><span style="font-family: Calibri">fill ratio</span><span style="font-family:SimSun">是数组中非空元素的比例），打印非原生类型数组的填充率频率分布，从而排查系统中</span><span style="font-family: Calibri">array</span><span style="font-family:SimSun">的利用率；</span><span style="font-family:Calibri">2</span><span style="font-family:SimSun">）数组按照</span><span style="font-family:Calibri">size</span><span style="font-family:SimSun">分组查询，打印一个按</span><span style="font-family: Calibri">size</span><span style="font-family:SimSun">分组的直方图；</span><span style="font-family:Calibri">3</span><span style="font-family:SimSun">）</span><span style="font-family:Calibri">collection</span><span style="font-family:SimSun">的填充率查询，</span><span style="font-family: Calibri">ArrayList/HashMap/Hashtable/Properties/Vector/WeakHashMap/ConcurrentHashMap$Segment</span><span style="font-family:SimSun">；</span><span style="font-family:Calibri">4</span><span style="font-family:SimSun">）</span><span style="font-family:Calibri">collection</span><span style="font-family: SimSun">按照</span><span style="font-family:Calibri">size</span><span style="font-family:SimSun">分组直方图；</span><span style="font-family: Calibri">5</span><span style="font-family:SimSun">）查看一个</span><span style="font-family:Calibri">list</span><span style="font-family: SimSun">里的所有对象；</span><span style="font-family:Calibri">6</span><span style="font-family:SimSun">）查看</span><span style="font-family:Calibri">hashmap</span><span style="font-family:SimSun">里的所有对象；</span><span style="font-family:Calibri">7</span><span style="font-family:SimSun">）查看</span><span style="font-family:Calibri">hashset</span><span style="font-family:SimSun">里的对象；</span><span style="font-family: Calibri">8</span><span style="font-family:SimSun">）检查</span><span style="font-family:Calibri">map</span><span style="font-family:SimSun">的碰撞率；</span><span style="font-family:Calibri">9</span><span style="font-family:SimSun">）检查所有只有一个常量的</span><span style="font-family:Calibri">array</span><span style="font-family: SimSun">。</span></p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">6</span><span style="font-family:SimSun">，分析</span><span style="font-family:Calibri">Finalizer</span><span style="font-family: SimSun">，</span><span style="font-family:Calibri">1</span><span style="font-family:SimSun">）查询</span><span style="font-family:Calibri">finalizer</span><span style="font-family:SimSun">正在处理的对象；</span><span style="font-family:Calibri">2</span><span style="font-family:SimSun">）查询</span><span style="font-family:Calibri">finalizer</span><span style="font-family:SimSun">准备处理的对象；</span><span style="font-family: Calibri">3</span><span style="font-family:SimSun">）直接查看</span><span style="font-family:Calibri">finalizer</span><span style="font-family: SimSun">线程；</span><span style="font-family:Calibri">4</span><span style="font-family:SimSun">）查看</span><span style="font-family:Calibri">finalizer</span><span style="font-family:SimSun">线程的</span><span style="font-family:Calibri">thread local</span><span style="font-family:SimSun">对象。</span></p><img src ="http://www.blogjava.net/changedi/aggbug/426849.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/changedi/" target="_blank">changedi</a> 2015-08-17 19:08 <a href="http://www.blogjava.net/changedi/archive/2015/08/17/426849.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>blogjava的广告</title><link>http://www.blogjava.net/changedi/archive/2015/07/13/426209.html</link><dc:creator>changedi</dc:creator><author>changedi</author><pubDate>Mon, 13 Jul 2015 14:58:00 GMT</pubDate><guid>http://www.blogjava.net/changedi/archive/2015/07/13/426209.html</guid><wfw:comment>http://www.blogjava.net/changedi/comments/426209.html</wfw:comment><comments>http://www.blogjava.net/changedi/archive/2015/07/13/426209.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/changedi/comments/commentRss/426209.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/changedi/services/trackbacks/426209.html</trackback:ping><description><![CDATA[blogjava最近没什么节操啊，为什么全是chinese lady。这是技术blog，不至于吧~~~<br /><br />为智能上网提供一个url，很好用，先体验再买，智能上网全年无忧~~<br /><div><br />http://honx.in/_VZPFA4kWGkB3nugl</div><img src ="http://www.blogjava.net/changedi/aggbug/426209.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/changedi/" target="_blank">changedi</a> 2015-07-13 22:58 <a href="http://www.blogjava.net/changedi/archive/2015/07/13/426209.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>该如何良好的实践Java中的Exception机制</title><link>http://www.blogjava.net/changedi/archive/2015/02/26/423050.html</link><dc:creator>changedi</dc:creator><author>changedi</author><pubDate>Thu, 26 Feb 2015 07:19:00 GMT</pubDate><guid>http://www.blogjava.net/changedi/archive/2015/02/26/423050.html</guid><wfw:comment>http://www.blogjava.net/changedi/comments/423050.html</wfw:comment><comments>http://www.blogjava.net/changedi/archive/2015/02/26/423050.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.blogjava.net/changedi/comments/commentRss/423050.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/changedi/services/trackbacks/423050.html</trackback:ping><description><![CDATA[<p style="margin:0in;font-family:SimSun;font-size:10.5pt">首先，我先声明一点，我讨论的仅限于互联网数据产品，当然可能会涉及到一些其他的抽象，但是所有的结论不代表能复用到所有场景。</p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:SimSun">几乎每个</span><span style="font-family:Calibri">Java</span><span style="font-family:SimSun">程序员都清楚知道</span><span style="font-family:Calibri">Java</span><span style="font-family: SimSun">的异常和错误机制，无论是在面试过程中，还是在学习中，你看到</span><span style="font-family: Calibri">Exception</span><span style="font-family:SimSun">，无非就是了解一下继承关系、子类、和</span><span style="font-family:Calibri">Error</span><span style="font-family:SimSun">的关系等等。当然这些知识点是基础，那么在实践中，用到了吗？你确定你使用</span><span style="font-family:Calibri">Exception</span><span style="font-family: SimSun">时没有偷懒？我的经验告诉我，良好的使用</span><span style="font-family:Calibri">Exception</span><span style="font-family:SimSun">能让你的程序</span><span style="font-family:Calibri">bug</span><span style="font-family:SimSun">更少，或者至少能保证你的程序更容易被理解和跟踪。</span></p>  <p style="margin:0in;font-family:SimSun;font-size:10.5pt">&nbsp;</p>  <p style="margin:0in;font-size:10.5pt"><span style="font-family:Calibri">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="font-family:SimSun">先回到老的知识点吧&#8212;&#8212;</span><span style="font-family: Calibri">Java</span><span style="font-family:SimSun">的异常机制，我们知道</span><span style="font-family:Calibri">Java</span><span style="font-family: SimSun">里的异常是完全继承</span><span style="font-family:Calibri">Throwable</span><span style="font-family:SimSun">的，正如</span><span style="font-family:Calibri">java doc</span><span style="font-family: SimSun">里注释的，无论你</span><span style="font-family:Calibri">throw</span><span style="font-family:SimSun">的还是</span><span style="font-family:Calibri">JVM throw</span><span style="font-family:SimSun">的，抑或是你想</sp