﻿<?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-Java改变应用 应用影响你我-文章分类-技术知识</title><link>http://www.blogjava.net/jnbzwm/category/46201.html</link><description>在学习中成长 在总结中进步</description><language>zh-cn</language><lastBuildDate>Fri, 03 Sep 2010 09:54:19 GMT</lastBuildDate><pubDate>Fri, 03 Sep 2010 09:54:19 GMT</pubDate><ttl>60</ttl><item><title>try-catch-finally的用法之finally </title><link>http://www.blogjava.net/jnbzwm/articles/330552.html</link><dc:creator>Java你我</dc:creator><author>Java你我</author><pubDate>Wed, 01 Sep 2010 04:00:00 GMT</pubDate><guid>http://www.blogjava.net/jnbzwm/articles/330552.html</guid><wfw:comment>http://www.blogjava.net/jnbzwm/comments/330552.html</wfw:comment><comments>http://www.blogjava.net/jnbzwm/articles/330552.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jnbzwm/comments/commentRss/330552.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jnbzwm/services/trackbacks/330552.html</trackback:ping><description><![CDATA[<p><span style="font-family: SimSun">关于</span>try-catch-finally<span style="font-family: SimSun">的用法我就不多说了。网上搜一下，资料很多。</span></p>
<p><span style="font-family: SimSun">这里我想主要讨论下在</span><strong><span style="color: #ff0000">finally</span></strong><span style="font-family: SimSun">块加入</span><strong><span style="color: #ff0000">return</span></strong><span style="font-family: SimSun"><strong><span style="color: #ff0000">语句</span></strong>，<strong><span style="color: #ff0000">屏蔽异常</span></strong>的问题。</span></p>
<p><span style="font-family: SimSun">我们先来看这样一段代码，</span></p>
<p><span style="font-family: SimSun"><br />
</span></p>
<p><span style="font-family: SimSun">代码</span>1<span style="font-family: SimSun">：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_25_481_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_481_Open_Text.style.display='none'; Codehighlighter1_25_481_Closed_Image.style.display='inline'; Codehighlighter1_25_481_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_481_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_481_Closed_Text.style.display='none'; Codehighlighter1_25_481_Open_Image.style.display='inline'; Codehighlighter1_25_481_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FinallyTest&nbsp;</span><span id="Codehighlighter1_25_481_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_73_120_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_120_Open_Text.style.display='none'; Codehighlighter1_73_120_Closed_Image.style.display='inline'; Codehighlighter1_73_120_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_73_120_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_120_Closed_Text.style.display='none'; Codehighlighter1_73_120_Open_Image.style.display='inline'; Codehighlighter1_73_120_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_73_120_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FinallyTest().print();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_149_476_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_476_Open_Text.style.display='none'; Codehighlighter1_149_476_Closed_Image.style.display='inline'; Codehighlighter1_149_476_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_149_476_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_149_476_Closed_Text.style.display='none'; Codehighlighter1_149_476_Open_Image.style.display='inline'; Codehighlighter1_149_476_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print()&nbsp;</span><span id="Codehighlighter1_149_476_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_189_260_Open_Image" onclick="this.style.display='none'; Codehighlighter1_189_260_Open_Text.style.display='none'; Codehighlighter1_189_260_Closed_Image.style.display='inline'; Codehighlighter1_189_260_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_189_260_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_189_260_Closed_Text.style.display='none'; Codehighlighter1_189_260_Open_Image.style.display='inline'; Codehighlighter1_189_260_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span>&nbsp;<span id="Codehighlighter1_189_260_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">1</span>&nbsp;<span style="color: #000000">/</span>&nbsp;<span style="color: #000000">0</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_282_380_Open_Image" onclick="this.style.display='none'; Codehighlighter1_282_380_Open_Text.style.display='none'; Codehighlighter1_282_380_Closed_Image.style.display='inline'; Codehighlighter1_282_380_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_282_380_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_282_380_Closed_Text.style.display='none'; Codehighlighter1_282_380_Open_Image.style.display='inline'; Codehighlighter1_282_380_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span>&nbsp;<span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_282_380_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">at&nbsp;catch&nbsp;block&nbsp;step&nbsp;1.</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;e;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img id="Codehighlighter1_390_467_Open_Image" onclick="this.style.display='none'; Codehighlighter1_390_467_Open_Text.style.display='none'; Codehighlighter1_390_467_Closed_Image.style.display='inline'; Codehighlighter1_390_467_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_390_467_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_390_467_Closed_Text.style.display='none'; Codehighlighter1_390_467_Open_Image.style.display='inline'; Codehighlighter1_390_467_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span>&nbsp;<span style="color: #0000ff">finally</span>&nbsp;<span id="Codehighlighter1_390_467_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">at&nbsp;finally&nbsp;block&nbsp;i&nbsp;=&nbsp;</span><span style="color: #000000">"</span>&nbsp;<span style="color: #000000">+</span><span style="color: #000000">&nbsp;i);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span></div>
<br />
<br />
<p><span style="font-size: 10pt; color: black; font-family: SimSun">以上代码在</span><span style="font-size: 10pt; color: black; font-family: 'ＭＳ ゴシック'">Eclipse</span><span style="font-size: 10pt; color: black; font-family: SimSun">里是不会编译通过的，因为在</span><span style="font-size: 10pt; color: black; font-family: 'ＭＳ ゴシック'">catch</span><span style="font-size: 10pt; color: black; font-family: SimSun">块中</span><span style="font-size: 10pt; color: black; font-family: 'ＭＳ ゴシック'">throw</span><span style="font-size: 10pt; color: black; font-family: SimSun">了一个异常，而</span><span style="font-size: 10pt; color: black; font-family: 'ＭＳ ゴシック'">print</span><span style="font-size: 10pt; color: black; font-family: SimSun">方法并没有声明要抛出异常。</span></p>
<p><span style="font-size: 10pt; color: black; font-family: SimSun"><br />
</span></p>
<p><span style="font-family: SimSun">现在我们修改代码，让它能够通过编译，代码</span>2<span style="font-family: SimSun">：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img id="Codehighlighter1_25_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_192_Open_Text.style.display='none'; Codehighlighter1_25_192_Closed_Image.style.display='inline'; Codehighlighter1_25_192_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_192_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_192_Closed_Text.style.display='none'; Codehighlighter1_25_192_Open_Image.style.display='inline'; Codehighlighter1_25_192_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FinallyTest&nbsp;</span><span id="Codehighlighter1_25_192_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_90_137_Open_Image" onclick="this.style.display='none'; Codehighlighter1_90_137_Open_Text.style.display='none'; Codehighlighter1_90_137_Closed_Image.style.display='inline'; Codehighlighter1_90_137_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_90_137_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_90_137_Closed_Text.style.display='none'; Codehighlighter1_90_137_Open_Image.style.display='inline'; Codehighlighter1_90_137_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_90_137_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FinallyTest().print();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img id="Codehighlighter1_183_192_Open_Image" onclick="this.style.display='none'; Codehighlighter1_183_192_Open_Text.style.display='none'; Codehighlighter1_183_192_Closed_Image.style.display='inline'; Codehighlighter1_183_192_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_183_192_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_183_192_Closed_Text.style.display='none'; Codehighlighter1_183_192_Open_Image.style.display='inline'; Codehighlighter1_183_192_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print()&nbsp;</span><span style="color: #0000ff">throws</span><span style="color: #000000">&nbsp;Exception&nbsp;</span><span id="Codehighlighter1_183_192_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&#8230;&nbsp;&nbsp;<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" /></span></div>
</span></span><br />
<br />
<p><span style="font-size: 10pt; color: black; font-family: SimSun">就是在</span><span style="font-size: 10pt; color: black; font-family: 'ＭＳ ゴシック'">print</span><span style="font-size: 10pt; color: black; font-family: SimSun">和</span><span style="font-size: 10pt; color: black; font-family: 'ＭＳ ゴシック'">main</span><span style="font-size: 10pt; color: black; font-family: SimSun">方法后加</span><strong><span style="font-size: 10pt; color: #7f0055; font-family: 'ＭＳ ゴシック'">throws</span></strong><span style="font-size: 10pt; color: black; font-family: 'ＭＳ ゴシック'"> Exception</span><span style="font-size: 10pt; color: black; font-family: SimSun">，然后运行，看运行结果：<br />
</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">at&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;block&nbsp;step&nbsp;</span><span style="color: #000000">1</span><span style="color: #000000">.&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />at&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;block&nbsp;i&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />Exception&nbsp;in&nbsp;thread&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">main</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;java.lang.ArithmeticException:&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;by&nbsp;zero&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;wxhx.csdn2.FinallyTest.print(FinallyTest.java:</span><span style="color: #000000">12</span><span style="color: #000000">)&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">5</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;at&nbsp;wxhx.csdn2.FinallyTest.main(FinallyTest.java:</span><span style="color: #000000">5</span><span style="color: #000000">)&nbsp;&nbsp;</span></div>
<p style="text-align: left" align="left"><span style="font-family: SimSun">程序先是走到了</span>catch<span style="font-family: SimSun">块的第一句，打印了</span><span style="font-size: 10pt; color: black; font-family: 'ＭＳ ゴシック'">at catch block step 1.</span></p>
<p><span style="font-family: SimSun">但并没有紧接着去</span>throw e<span style="font-family: SimSun">，<strong><span style="color: #ff0000">即没有立刻抛出这个异常</span></strong>，之所以这样说，是因为异常的信息是在</span>finally<span style="font-family: SimSun">块的打印信息之后才打印的。</span></p>
<p><span style="font-family: SimSun">这个例子告诉我们，</span>finally<span style="font-family: 'ＭＳ 明朝'">不管出</span><span style="font-family: PMingLiU">现</span><span style="font-family: 'ＭＳ 明朝'">异常与否，</span><strong><span style="color: red; font-family: 'ＭＳ 明朝'">都必</span></strong><strong><span style="color: red; font-family: PMingLiU">须</span></strong><strong><span style="color: red; font-family: 'ＭＳ 明朝'">去</span></strong><strong><span style="color: red; font-family: PMingLiU">执</span></strong><strong><span style="color: red; font-family: 'ＭＳ 明朝'">行的代</span></strong><strong><span style="color: red; font-family: PMingLiU">码</span></strong><span style="font-family: 'ＭＳ 明朝'">。</span><span style="font-family: SimSun">（如果中途终止了</span>jvm<span style="font-family: SimSun">，就不必去执行了）</span></p>
<p><span style="font-family: SimSun">那么何时执行</span>finally<span style="font-family: SimSun">块中的代码呢？</span></p>
<p><span style="font-family: SimSun">在这个例子中，</span>try<span style="font-family: SimSun">块中有异常抛出，所以</span>finally<span style="font-family: SimSun">块中的代码<strong><span style="color: red">是在执行了</span></strong></span><strong><span style="color: red">catch</span></strong><strong><span style="color: red; font-family: SimSun">语句之后、退出方法之前被执行的</span></strong>(<span style="font-family: SimSun">如果这里执行了</span>throw e<span style="font-family: SimSun">，则方法就退出了</span>) <span style="font-family: SimSun">。</span></p>
<p><br />
&nbsp;</p>
<p><span style="font-family: SimSun">下面再看另外一个代码，代码</span>3<span style="font-family: SimSun">：</span></p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img id="Codehighlighter1_25_504_Open_Image" onclick="this.style.display='none'; Codehighlighter1_25_504_Open_Text.style.display='none'; Codehighlighter1_25_504_Closed_Image.style.display='inline'; Codehighlighter1_25_504_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_25_504_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_25_504_Closed_Text.style.display='none'; Codehighlighter1_25_504_Open_Image.style.display='inline'; Codehighlighter1_25_504_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" align="top" /><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;FinallyTest&nbsp;</span><span id="Codehighlighter1_25_504_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img id="Codehighlighter1_73_120_Open_Image" onclick="this.style.display='none'; Codehighlighter1_73_120_Open_Text.style.display='none'; Codehighlighter1_73_120_Closed_Image.style.display='inline'; Codehighlighter1_73_120_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_73_120_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_73_120_Closed_Text.style.display='none'; Codehighlighter1_73_120_Open_Image.style.display='inline'; Codehighlighter1_73_120_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">static</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span id="Codehighlighter1_73_120_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FinallyTest().print();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_149_499_Open_Image" onclick="this.style.display='none'; Codehighlighter1_149_499_Open_Text.style.display='none'; Codehighlighter1_149_499_Closed_Image.style.display='inline'; Codehighlighter1_149_499_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_149_499_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_149_499_Closed_Text.style.display='none'; Codehighlighter1_149_499_Open_Image.style.display='inline'; Codehighlighter1_149_499_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span>&nbsp;<span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;print()&nbsp;</span><span id="Codehighlighter1_149_499_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">int</span><span style="color: #000000">&nbsp;i&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">-</span><span style="color: #000000">1</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img id="Codehighlighter1_189_260_Open_Image" onclick="this.style.display='none'; Codehighlighter1_189_260_Open_Text.style.display='none'; Codehighlighter1_189_260_Closed_Image.style.display='inline'; Codehighlighter1_189_260_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_189_260_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_189_260_Closed_Text.style.display='none'; Codehighlighter1_189_260_Open_Image.style.display='inline'; Codehighlighter1_189_260_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span>&nbsp;<span id="Codehighlighter1_189_260_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(</span><span style="color: #000000">1</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000">=</span>&nbsp;<span style="color: #000000">1</span>&nbsp;<span style="color: #000000">/</span>&nbsp;<span style="color: #000000">0</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_282_380_Open_Image" onclick="this.style.display='none'; Codehighlighter1_282_380_Open_Text.style.display='none'; Codehighlighter1_282_380_Closed_Image.style.display='inline'; Codehighlighter1_282_380_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_282_380_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_282_380_Closed_Text.style.display='none'; Codehighlighter1_282_380_Open_Image.style.display='inline'; Codehighlighter1_282_380_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span>&nbsp;<span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_282_380_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">at&nbsp;catch&nbsp;block&nbsp;step&nbsp;1.</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">throw</span><span style="color: #000000">&nbsp;e;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img id="Codehighlighter1_390_490_Open_Image" onclick="this.style.display='none'; Codehighlighter1_390_490_Open_Text.style.display='none'; Codehighlighter1_390_490_Closed_Image.style.display='inline'; Codehighlighter1_390_490_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_390_490_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_390_490_Closed_Text.style.display='none'; Codehighlighter1_390_490_Open_Image.style.display='inline'; Codehighlighter1_390_490_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span>&nbsp;<span style="color: #0000ff">finally</span>&nbsp;<span id="Codehighlighter1_390_490_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000">"</span><span style="color: #000000">at&nbsp;finally&nbsp;block&nbsp;i&nbsp;=&nbsp;</span><span style="color: #000000">"</span>&nbsp;<span style="color: #000000">+</span><span style="color: #000000">&nbsp;i);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">return</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span>&nbsp;</div>
<p><br />
&nbsp;</p>
<p>这段代码与之前相比，在finally块中增加了return语句。</p>
<p>虽然在catch块中有throw e语句，但在print方法后并不用声明throws Exception，也可以通过编译。</p>
<p>因为在try块中有Thread.sleep(1);语句，所以必须要捕获InterruptedException，但在这种情况下，即使我们把catch块去掉了，也不会有问题，这是怎么回事呢？</p>
<p>因为在finally块中的return语句屏蔽了异常。</p>
<p>经过代码2我们已经知道了，异常在finally块被执行之前，虽然会执行catch块中的代码，但并不会退出方法，在退出方法之前，会转向finally块中执行，而在finally块中又恰好有return语句，所以方法就正常退出了，在try块中产生的异常就不会有机会被抛出。</p>
<p><br />
----2009年02月13日</p>
<p></span></p>
</span>
<img src ="http://www.blogjava.net/jnbzwm/aggbug/330552.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jnbzwm/" target="_blank">Java你我</a> 2010-09-01 12:00 <a href="http://www.blogjava.net/jnbzwm/articles/330552.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析 Java Thread.join()</title><link>http://www.blogjava.net/jnbzwm/articles/330549.html</link><dc:creator>Java你我</dc:creator><author>Java你我</author><pubDate>Wed, 01 Sep 2010 03:52:00 GMT</pubDate><guid>http://www.blogjava.net/jnbzwm/articles/330549.html</guid><wfw:comment>http://www.blogjava.net/jnbzwm/comments/330549.html</wfw:comment><comments>http://www.blogjava.net/jnbzwm/articles/330549.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jnbzwm/comments/commentRss/330549.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jnbzwm/services/trackbacks/330549.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 一、在研究join的用法之前，先明确两件事情。1.join方法定义在Thread类中，则调用者必须是一个线程，例如：Thread t = new CustomThread();//这里一般是自定义的线程类t.start();//线程起动t.join();//此处会抛出InterruptedException异常&nbsp;2.上面的两行代码也是在一个线程里面执行的。...&nbsp;&nbsp;<a href='http://www.blogjava.net/jnbzwm/articles/330549.html'>阅读全文</a><img src ="http://www.blogjava.net/jnbzwm/aggbug/330549.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jnbzwm/" target="_blank">Java你我</a> 2010-09-01 11:52 <a href="http://www.blogjava.net/jnbzwm/articles/330549.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>浅析java内存泄露问题</title><link>http://www.blogjava.net/jnbzwm/articles/330538.html</link><dc:creator>Java你我</dc:creator><author>Java你我</author><pubDate>Wed, 01 Sep 2010 03:31:00 GMT</pubDate><guid>http://www.blogjava.net/jnbzwm/articles/330538.html</guid><wfw:comment>http://www.blogjava.net/jnbzwm/comments/330538.html</wfw:comment><comments>http://www.blogjava.net/jnbzwm/articles/330538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jnbzwm/comments/commentRss/330538.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jnbzwm/services/trackbacks/330538.html</trackback:ping><description><![CDATA[<p class="MsoNormal"><span lang="ZH-CN" style="font-family: SimSun">最近一段时间，在公司里对</span><span lang="EN-US">java</span><span lang="ZH-CN" style="font-family: SimSun">内存泄露的问题进行了调查。</span></p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-family: SimSun">问题的发现：</span></p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-family: SimSun">系统中在连续不停地、反复进行一个操作（先打开</span><span lang="EN-US">A</span><span lang="ZH-CN" style="font-family: SimSun">，然后切替到画面</span><span lang="EN-US">B</span><span lang="ZH-CN" style="font-family: SimSun">，点击画面履历再回到</span><span lang="EN-US">A</span><span lang="ZH-CN" style="font-family: SimSun">，如此反复）。经过长时间的测试，经常会</span><span lang="EN-US">20</span><span lang="ZH-CN" style="font-family: SimSun">小时，</span><span lang="EN-US">JVM</span><span lang="ZH-CN" style="font-family: SimSun">的内存使用量增长</span><span lang="EN-US">30M</span><span lang="ZH-CN" style="font-family: SimSun">以上。</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;</span></p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-family: SimSun">问题的分析：</span></p>
<p class="MsoNormal"><span lang="ZH-CN" style="font-family: SimSun">首先根据操作，找到会执行的代码，对代码进行分析。</span></p>
<p class="MsoNormal"><span lang="EN-US">Java</span><span lang="ZH-CN" style="font-family: SimSun">会产生内存泄露的原因，经过本次调查，</span></p>
1.<span lang="ZH-CN" style="font-family: SimSun">对于打开的</span><span lang="EN-US">socket</span><span lang="ZH-CN" style="font-family: SimSun">等资源，没有做及时的回收处理。</span><br />
2.<span lang="ZH-CN" style="font-family: SimSun">生存周期较长的对象，持有了生存周期较短的对象的引用，以至于那些生存周期短的对象，在无用的情况下，没有得到回收。<br />
3.<span lang="ZH-CN" style="font-family: SimSun">对于类的成员变量为集合的情况，对集合的使用应该谨慎。比如，一个专门保存用户操作履历的对象，有全局变量</span><span lang="EN-US">List</span><span lang="ZH-CN" style="font-family: SimSun">来保存用户所有点击过的链接。但实际项目中，不可能保存住用户的每一次链接操作，然后显示给用户，有时候可能只是显示最新的</span><span lang="EN-US">20</span><span lang="ZH-CN" style="font-family: SimSun">条。所以这时候就要对这个全局变量进行处理，不能让它无限的膨胀下去。<br />
4.<span lang="ZH-CN" style="font-family: SimSun">在类的成员变量为集合的情况，集合中的元素又是比较复杂的对象，（这个对象中可能还包含着是集合的成员变量）在不需要此类的对象的时候，应该自己来实现对类的成员的销毁。如：<br />
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #000000">Iterator&nbsp;itor&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;myMap.keySet().iterator();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">2</span><span style="color: #000000"><img id="Codehighlighter1_69_229_Open_Image" onclick="this.style.display='none'; Codehighlighter1_69_229_Open_Text.style.display='none'; Codehighlighter1_69_229_Closed_Image.style.display='inline'; Codehighlighter1_69_229_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_69_229_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_69_229_Closed_Text.style.display='none'; Codehighlighter1_69_229_Open_Image.style.display='inline'; Codehighlighter1_69_229_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">while</span><span style="color: #000000">&nbsp;(itor.hasNext())&nbsp;</span><span id="Codehighlighter1_69_229_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_69_229_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;MyObject&nbsp;selectedInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;(MyObject)&nbsp;itor.next();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">4</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;selectedInfo.destroy();</span><span style="color: #008000">//</span><span style="color: #008000">&nbsp;假设MyObject里有destroy方法，对MyObjec中的成员进行销毁&nbsp;&nbsp;&nbsp;</span><span style="color: #008000"><br />
</span><span style="color: #008080">5</span><span style="color: #008000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" /></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;&nbsp;selectedInfo&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" />myMap.clear();&nbsp;&nbsp;</span></div>
<br />
5.<span lang="ZH-CN" style="font-size: 10pt; color: black; font-family: SimSun">对单态模式应该慎用，</span><span lang="ZH-CN" style="font-family: PMingLiU">单</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">例</span><span lang="ZH-CN" style="font-family: PMingLiU">对</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">象在被初始化后将在</span><span lang="EN-US">JVM</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">的整个生命周期中存在</span><span lang="ZH-CN" style="font-family: SimSun">，</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">如果</span><span lang="ZH-CN" style="font-family: SimSun">单态</span><span lang="ZH-CN" style="font-family: PMingLiU">对</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">象持有外部</span><span lang="ZH-CN" style="font-family: PMingLiU">对</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">象的引用，那</span><span lang="ZH-CN" style="font-family: PMingLiU">么这</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">个外部</span><span lang="ZH-CN" style="font-family: PMingLiU">对</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">象将不能被</span><span lang="ZH-CN" style="font-family: 'ＭＳ 明朝'">回收，</span><span lang="ZH-CN" style="font-family: SimSun">如故这个外部对象很庞大，那么对内存的消耗是很大的。<br />
6.<span lang="ZH-CN" style="font-family: SimSun">虽然写</span><span lang="EN-US">java</span><span lang="ZH-CN" style="font-family: SimSun">程序，有</span><span lang="EN-US">GC</span><span lang="ZH-CN" style="font-family: SimSun">帮助我们管理内存，但好的编程习惯还是需要的，可以避免不必要的麻烦。</span><br />
<br />
<p><span style="font-family: SimSun">虽然写</span>java<span style="font-family: SimSun">程序，有</span>GC<span style="font-family: SimSun">帮助我们管理内存，但好的编程习惯还是需要的，可以避免不必要的麻烦。</span></p>
<span lang="ZH-CN" style="font-family: SimSun">1.复杂的对象，在不需要的情况下，最好能实现对它的成员的销毁，然后再将其赋为</span><span lang="EN-US">null</span><span lang="ZH-CN" style="font-family: SimSun">。<br />
</span>2.<span lang="ZH-CN" style="font-family: SimSun">对于打开的流，一定要做及时的处理。另外对于</span><span lang="EN-US">HttpURLConnection</span><span lang="ZH-CN" style="font-family: SimSun">对象，连接后，要调用它的</span><span lang="EN-US">disconnect</span><span lang="ZH-CN" style="font-family: SimSun">（），不要对资源进行不必要的浪费。<br />
</span>3.<span lang="ZH-CN" style="font-family: SimSun">尽量少用全局变量。<br />
</span>4.<span lang="ZH-CN" style="font-family: SimSun">在哪里生成对象，就在哪里销毁它。</span><br />
5.<span lang="ZH-CN" style="font-family: SimSun">尽量避免对象之间的相互引用。<br />
</span><br />
<p><span style="font-family: SimSun">最后，记述一下我记录内存的方法。</span></p>
<p><span style="font-family: SimSun">由于对代码做好修改之后，要确认一下内存是否有明显增长。</span></p>
<p><span style="font-family: SimSun">于是写一段代码，每个</span>5<span style="font-family: SimSun">分钟对对内存进行一次记录，在连续运行</span>20<span style="font-family: SimSun">小时候，做成曲线图，以便分析。</span></p>
<p style="margin-left: 18pt; text-indent: -18pt">（以下是为了方便，重新写的，原来项目中用到的，有一整套完备的定时器生成和起动的管理类，这里没有写出来。）</p>
<div style="border-right: #cccccc 1px solid; padding-right: 5px; border-top: #cccccc 1px solid; padding-left: 4px; font-size: 13px; padding-bottom: 4px; border-left: #cccccc 1px solid; width: 98%; word-break: break-all; padding-top: 4px; border-bottom: #cccccc 1px solid; background-color: #eeeeee"><span style="color: #008080">&nbsp;1</span><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.DataOutputStream;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;2</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.FileOutputStream;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;3</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/None.gif" align="top" /></span><span style="color: #0000ff">import</span><span style="color: #000000">&nbsp;java.io.IOException;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;4</span><span style="color: #000000"><img id="Codehighlighter1_130_276_Open_Image" onclick="this.style.display='none'; Codehighlighter1_130_276_Open_Text.style.display='none'; Codehighlighter1_130_276_Closed_Image.style.display='inline'; Codehighlighter1_130_276_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_130_276_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_130_276_Closed_Text.style.display='none'; Codehighlighter1_130_276_Open_Image.style.display='inline'; Codehighlighter1_130_276_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MemoryCollect&nbsp;</span><span id="Codehighlighter1_130_276_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_130_276_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;5</span><span style="color: #000000"><img id="Codehighlighter1_178_271_Open_Image" onclick="this.style.display='none'; Codehighlighter1_178_271_Open_Text.style.display='none'; Codehighlighter1_178_271_Closed_Image.style.display='inline'; Codehighlighter1_178_271_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_178_271_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_178_271_Closed_Text.style.display='none'; Codehighlighter1_178_271_Open_Image.style.display='inline'; Codehighlighter1_178_271_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;main(String&nbsp;args[])&nbsp;</span><span id="Codehighlighter1_178_271_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_178_271_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;6</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MemoryCollector&nbsp;mc&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;MemoryCollector(</span><span style="color: #000000">300000</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;7</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mc.start();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;8</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">&nbsp;9</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">10</span><span style="color: #000000"><img id="Codehighlighter1_331_2186_Open_Image" onclick="this.style.display='none'; Codehighlighter1_331_2186_Open_Text.style.display='none'; Codehighlighter1_331_2186_Closed_Image.style.display='inline'; Codehighlighter1_331_2186_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockStart.gif" align="top" /><img id="Codehighlighter1_331_2186_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_331_2186_Closed_Text.style.display='none'; Codehighlighter1_331_2186_Open_Image.style.display='inline'; Codehighlighter1_331_2186_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedBlock.gif" align="top" /></span><span style="color: #0000ff">class</span><span style="color: #000000">&nbsp;MemoryCollector&nbsp;</span><span style="color: #0000ff">extends</span><span style="color: #000000">&nbsp;java.util.TimerTask&nbsp;</span><span id="Codehighlighter1_331_2186_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_331_2186_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">11</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;java.text.NumberFormat&nbsp;nf&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;java.text.NumberFormat&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">12</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.getPercentInstance();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">13</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">static</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">final</span><span style="color: #000000">&nbsp;java.text.DateFormat&nbsp;df&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.text.SimpleDateFormat(&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">14</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">yyyy-MM-dd&nbsp;HH:mm:ss</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">15</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;DataOutputStream&nbsp;dos&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">16</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;period&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">17</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">private</span><span style="color: #000000">&nbsp;java.util.Timer&nbsp;timer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">18</span><span style="color: #000000"><img id="Codehighlighter1_727_801_Open_Image" onclick="this.style.display='none'; Codehighlighter1_727_801_Open_Text.style.display='none'; Codehighlighter1_727_801_Closed_Image.style.display='inline'; Codehighlighter1_727_801_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_727_801_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_727_801_Closed_Text.style.display='none'; Codehighlighter1_727_801_Open_Image.style.display='inline'; Codehighlighter1_727_801_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;MemoryCollector(</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;p)&nbsp;</span><span id="Codehighlighter1_727_801_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_727_801_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">19</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;period&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;p;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">20</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.util.Timer();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">21</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">22</span><span style="color: #000000"><img id="Codehighlighter1_830_883_Open_Image" onclick="this.style.display='none'; Codehighlighter1_830_883_Open_Text.style.display='none'; Codehighlighter1_830_883_Closed_Image.style.display='inline'; Codehighlighter1_830_883_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_830_883_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_830_883_Closed_Text.style.display='none'; Codehighlighter1_830_883_Open_Image.style.display='inline'; Codehighlighter1_830_883_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;start()&nbsp;</span><span id="Codehighlighter1_830_883_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_830_883_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">23</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.schedule(</span><span style="color: #0000ff">this</span><span style="color: #000000">,&nbsp;</span><span style="color: #000000">0</span><span style="color: #000000">,&nbsp;period);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">24</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">25</span><span style="color: #000000"><img id="Codehighlighter1_910_2012_Open_Image" onclick="this.style.display='none'; Codehighlighter1_910_2012_Open_Text.style.display='none'; Codehighlighter1_910_2012_Closed_Image.style.display='inline'; Codehighlighter1_910_2012_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_910_2012_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_910_2012_Closed_Text.style.display='none'; Codehighlighter1_910_2012_Open_Image.style.display='inline'; Codehighlighter1_910_2012_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;run()&nbsp;</span><span id="Codehighlighter1_910_2012_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_910_2012_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">26</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.gc();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">27</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Runtime&nbsp;imp&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;Runtime.getRuntime();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">28</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imp.totalMemory();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">29</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;totol&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;imp.totalMemory()&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1024</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">30</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">long</span><span style="color: #000000">&nbsp;free&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;imp.freeMemory()&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">1024</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">31</span><span style="color: #000000"><img id="Codehighlighter1_1126_1622_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1126_1622_Open_Text.style.display='none'; Codehighlighter1_1126_1622_Closed_Image.style.display='inline'; Codehighlighter1_1126_1622_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1126_1622_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1126_1622_Closed_Text.style.display='none'; Codehighlighter1_1126_1622_Open_Image.style.display='inline'; Codehighlighter1_1126_1622_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_1126_1622_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1126_1622_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">32</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dos&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;DataOutputStream(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;FileOutputStream(</span><span style="color: #000000">"</span><span style="color: #000000">D:\\memory.txt</span><span style="color: #000000">"</span><span style="color: #000000">,&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">33</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">true</span><span style="color: #000000">));&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">34</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;date&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;df.format(</span><span style="color: #0000ff">new</span><span style="color: #000000">&nbsp;java.util.Date());&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">35</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;info&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;date&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\t</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;totol&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\t</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;free&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\t</span><span style="color: #000000">"</span><span style="color: #000000">&nbsp;&nbsp;<br />
</span><span style="color: #008080">36</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;nf.format((</span><span style="color: #0000ff">double</span><span style="color: #000000">)&nbsp;free&nbsp;</span><span style="color: #000000">/</span><span style="color: #000000">&nbsp;(</span><span style="color: #0000ff">double</span><span style="color: #000000">)&nbsp;totol);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">37</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(info);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">38</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dos.writeUTF(info&nbsp;</span><span style="color: #000000">+</span><span style="color: #000000">&nbsp;</span><span style="color: #000000">"</span><span style="color: #000000">\r</span><span style="color: #000000">"</span><span style="color: #000000">);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">39</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dos.flush();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">40</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dos.close();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">41</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dos&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">42</span><span style="color: #000000"><img id="Codehighlighter1_1644_1695_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1644_1695_Open_Text.style.display='none'; Codehighlighter1_1644_1695_Closed_Image.style.display='inline'; Codehighlighter1_1644_1695_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1644_1695_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1644_1695_Closed_Text.style.display='none'; Codehighlighter1_1644_1695_Open_Image.style.display='inline'; Codehighlighter1_1644_1695_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(Exception&nbsp;e)&nbsp;</span><span id="Codehighlighter1_1644_1695_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1644_1695_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">43</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(e);&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">44</span><span style="color: #000000"><img id="Codehighlighter1_1705_2003_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1705_2003_Open_Text.style.display='none'; Codehighlighter1_1705_2003_Closed_Image.style.display='inline'; Codehighlighter1_1705_2003_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1705_2003_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1705_2003_Closed_Text.style.display='none'; Codehighlighter1_1705_2003_Open_Image.style.display='inline'; Codehighlighter1_1705_2003_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">finally</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_1705_2003_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1705_2003_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">45</span><span style="color: #000000"><img id="Codehighlighter1_1726_1909_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1726_1909_Open_Text.style.display='none'; Codehighlighter1_1726_1909_Closed_Image.style.display='inline'; Codehighlighter1_1726_1909_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1726_1909_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1726_1909_Closed_Text.style.display='none'; Codehighlighter1_1726_1909_Open_Image.style.display='inline'; Codehighlighter1_1726_1909_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">try</span><span style="color: #000000">&nbsp;</span><span id="Codehighlighter1_1726_1909_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1726_1909_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">46</span><span style="color: #000000"><img id="Codehighlighter1_1764_1892_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1764_1892_Open_Text.style.display='none'; Codehighlighter1_1764_1892_Closed_Image.style.display='inline'; Codehighlighter1_1764_1892_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1764_1892_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1764_1892_Closed_Text.style.display='none'; Codehighlighter1_1764_1892_Open_Image.style.display='inline'; Codehighlighter1_1764_1892_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(dos&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_1764_1892_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1764_1892_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">47</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dos.flush();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">48</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dos.close();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">49</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dos&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">50</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">51</span><span style="color: #000000"><img id="Codehighlighter1_1933_1990_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1933_1990_Open_Text.style.display='none'; Codehighlighter1_1933_1990_Closed_Image.style.display='inline'; Codehighlighter1_1933_1990_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_1933_1990_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_1933_1990_Closed_Text.style.display='none'; Codehighlighter1_1933_1990_Open_Image.style.display='inline'; Codehighlighter1_1933_1990_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">catch</span><span style="color: #000000">&nbsp;(IOException&nbsp;e)&nbsp;</span><span id="Codehighlighter1_1933_1990_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_1933_1990_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">52</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">53</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">54</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">55</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">56</span><span style="color: #000000"><img id="Codehighlighter1_2040_2181_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2040_2181_Open_Text.style.display='none'; Codehighlighter1_2040_2181_Closed_Image.style.display='inline'; Codehighlighter1_2040_2181_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2040_2181_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2040_2181_Closed_Text.style.display='none'; Codehighlighter1_2040_2181_Open_Image.style.display='inline'; Codehighlighter1_2040_2181_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">public</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">void</span><span style="color: #000000">&nbsp;stop()&nbsp;</span><span id="Codehighlighter1_2040_2181_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2040_2181_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">57</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">super</span><span style="color: #000000">.cancel();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">58</span><span style="color: #000000"><img id="Codehighlighter1_2099_2172_Open_Image" onclick="this.style.display='none'; Codehighlighter1_2099_2172_Open_Text.style.display='none'; Codehighlighter1_2099_2172_Closed_Image.style.display='inline'; Codehighlighter1_2099_2172_Closed_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockStart.gif" align="top" /><img id="Codehighlighter1_2099_2172_Closed_Image" style="display: none" onclick="this.style.display='none'; Codehighlighter1_2099_2172_Closed_Text.style.display='none'; Codehighlighter1_2099_2172_Open_Image.style.display='inline'; Codehighlighter1_2099_2172_Open_Text.style.display='inline';" alt="" src="http://www.blogjava.net/images/OutliningIndicators/ContractedSubBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff">if</span><span style="color: #000000">&nbsp;(timer&nbsp;</span><span style="color: #000000">!=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">)&nbsp;</span><span id="Codehighlighter1_2099_2172_Closed_Text" style="border-right: #808080 1px solid; border-top: #808080 1px solid; display: none; border-left: #808080 1px solid; border-bottom: #808080 1px solid; background-color: #ffffff"><img alt="" src="http://www.blogjava.net/Images/dot.gif" /></span><span id="Codehighlighter1_2099_2172_Open_Text"><span style="color: #000000">{&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">59</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer.cancel();&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">60</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/InBlock.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;timer&nbsp;</span><span style="color: #000000">=</span><span style="color: #000000">&nbsp;</span><span style="color: #0000ff">null</span><span style="color: #000000">;&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">61</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">62</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000">&nbsp;&nbsp;&nbsp;<br />
</span><span style="color: #008080">63</span><span style="color: #000000"><img alt="" src="http://www.blogjava.net/images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" />}</span></span><span style="color: #000000">&nbsp;</span></div>
<br />
<br />
----2009年02月02日</span></span></span></span>
 <img src ="http://www.blogjava.net/jnbzwm/aggbug/330538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jnbzwm/" target="_blank">Java你我</a> 2010-09-01 11:31 <a href="http://www.blogjava.net/jnbzwm/articles/330538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]jdk与jre的区别</title><link>http://www.blogjava.net/jnbzwm/articles/330530.html</link><dc:creator>Java你我</dc:creator><author>Java你我</author><pubDate>Wed, 01 Sep 2010 03:11:00 GMT</pubDate><guid>http://www.blogjava.net/jnbzwm/articles/330530.html</guid><wfw:comment>http://www.blogjava.net/jnbzwm/comments/330530.html</wfw:comment><comments>http://www.blogjava.net/jnbzwm/articles/330530.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jnbzwm/comments/commentRss/330530.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jnbzwm/services/trackbacks/330530.html</trackback:ping><description><![CDATA[<p>简单的说JDK是面向开发人员使用的SDK，它提供了Java的开发环境和运行环境。SDK是Software Development Kit 一般指软件开发包，可以包括函数库、编译程序等。<br />
&nbsp;&nbsp;&nbsp; JDK就是Java Development Kit<br />
JRE是Java Runtime Enviroment是指Java的运行环境，是面向Java程序的使用者，而不是开发者。</p>
<p>如果安装了JDK，会发现你的电脑有两套JRE，一套位于 \jre 另外一套位于 C:\Program Files\Java\j2re1.4.1_01 目录下，后面这套比前面那套少了Server端的Java虚拟机，不过直接将前面那套的Server端Java虚拟机复制过来就行了。而且在安装JDK可以选择是否安装这个位于 C:\Program Files\Jav a 目录下的JRE。如果你只安装JRE，而不是JDK，那么只会在 C:\Program Files\Java 目录下安装唯一的一套JRE。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; JRE的地位就象一台PC机一样，我们写好的Win32应用程序需要操作系统帮我们运行，同样的，我们编写的Java程序也必须要JRE才能运行。所以当你装完JDK后，如果分别在硬盘上的两个不同地方安装了两套JRE，那么你可以想象你的电脑有两台虚拟的Java PC机，都具有运行Java程序的功能。所以我们可以说，只要你的电脑安装了JRE，就可以正确运行Jav a应用程序。</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1、为什么Sun要让JDK安装两套相同的JRE？这是因为JDK里面有很多用Java所编写的开发工具（如javac.exe、jar.exe等），而且都放置在 \lib\tools.jar 里。从下面例子可以看出，先将tools.jar改名为tools1.jar，然后运行javac.exe，显示如下结果： Exception in thread "main" java.lang.NoClassDefFoundError: com/sun/tools/javac /Main 这个意思是说，你输入javac.exe与输入 java -cp c:\jdk\lib\tools.jar com.sun.tools.javac.Main 是一样的，会得到相同的结果。从这里我们可以证明javac.exe只是一个包装器（Wrapper），而制作的目的是为了让开发者免于输入太长的指命。而且可以发现\lib目录下的程序都很小，不大于2 9K，从这里我们可以得出一个结论。就是JDK里的工具几乎是用Java所编写，所以也是Java应用程序，因此要使用JDK所附的工具来开发Java程序，也必须要自行附一套JRE才行，所以位于C:\Program Files\Java目录下的那套JRE就是用来运行一般Java程序用的。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2、如果一台电脑安装两套以上的JRE，谁来决定呢？这个重大任务就落在java.exe身上。Java.exe的工作就是找到合适的JRE来运行Java程序。 Java.exe依照底下的顺序来查找JRE：自己的目录下有没有JRE；父目录有没有JRE；查询注册表： [HKEY_LOCAL_MACHINE\SOFTWARE\JavaSoft\Java Runtime Environment] 所以java.exe的运行结果与你的电脑里面哪个JRE被执行有很大的关系。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3、介绍JVM JRE目录下的Bin目录有两个目录：server与client。这就是真正的jvm.dll所在。 jvm.dll无法单独工作，当jvm.dll启动后，会使用explicit的方法（就是使用Win32 API之中的LoadLibrary()与GetProcAddress()来载入辅助用的动态链接库），而这些辅助用的动态链接库（.dll）都必须位于jvm.dll所在目录的父目录之中。因此想使用哪个JVM，只需要设置PATH，指向JRE所在目录底下的jvm.dll。</p>
<p><br />
----2008年11月24日</p>
<img src ="http://www.blogjava.net/jnbzwm/aggbug/330530.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jnbzwm/" target="_blank">Java你我</a> 2010-09-01 11:11 <a href="http://www.blogjava.net/jnbzwm/articles/330530.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转]java编译执行与jvm介绍</title><link>http://www.blogjava.net/jnbzwm/articles/330527.html</link><dc:creator>Java你我</dc:creator><author>Java你我</author><pubDate>Wed, 01 Sep 2010 03:08:00 GMT</pubDate><guid>http://www.blogjava.net/jnbzwm/articles/330527.html</guid><wfw:comment>http://www.blogjava.net/jnbzwm/comments/330527.html</wfw:comment><comments>http://www.blogjava.net/jnbzwm/articles/330527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jnbzwm/comments/commentRss/330527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jnbzwm/services/trackbacks/330527.html</trackback:ping><description><![CDATA[<p><span style="font-family: 宋体">Java虚拟机(JVM)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上，就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程，随后对JVM规格描述作一说明。<br />
　　<br />
　　一.Java源文件的编译、下载、解释和执行<br />
　　Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译程序将Java源程序翻译为JVM可执行代码?字节码。这一编译过程同C/C++的编译有些不同。当C编译器编译生成一个对象的代码时，该代码是为在某一特定硬件平台运行而产生的。因此，在编译过程中，编译程序通过查表将所有对符号的引用转换为特定的内存偏移量，以保证程序运行。Java编译器却不将对变量和方法的引用编译为数值引用，也不确定程序执行过程中的内存布局，而是将这些符号引用信息保留在字节码中，由解释器在运行过程中创立内存布局，然后再通过查表来确定一个方法所在的地址。这样就有效的保证了Java的可移植性和安全性。<br />
　　<br />
　　运行JVM字节码的工作是由解释器来完成的。解释执行过程分三部进行：代码的装入、代码的校验和代码的执行。装入代码的工作由"类装载器"（class loader）完成。类装载器负责装入运行一个程序需要的所有代码，这也包括程序代码中的类所继承的类和被其调用的类。当类装载器装入一个类时，该类被放在自己的名字空间中。除了通过符号引用自己名字空间以外的类，类之间没有其他办法可以影响其他类。在本台计算机上的所有类都在同一地址空间内，而所有从外部引进的类，都有一个自己独立的名字空间。这使得本地类通过共享相同的名字空间获得较高的运行效率，同时又保证它们与从外部引进的类不会相互影响。当装入了运行程序需要的所有类后，解释器便可确定整个可执行程序的内存布局。解释器为符号引用同特定的地址空间建立对应关系及查询表。通过在这一阶段确定代码的内存布局，Java很好地解决了由超类改变而使子类崩溃的问题，同时也防止了代码对地址的非法访问。<br />
　　<br />
　　随后，被装入的代码由字节码校验器进行检查。校验器可发现操作数栈溢出，非法数据类型转化等多种错误。通过校验后，代码便开始执行了。<br />
　　<br />
　　Java字节码的执行有两种方式：<br />
　　1.即时编译方式：解释器先将字节码编译成机器码，然后再执行该机器码。<br />
　　2.解释执行方式：解释器通过每次解释并执行一小段代码来完成Java字节码程 序的所有操作。<br />
　　通常采用的是第二种方法。由于JVM规格描述具有足够的灵活性，这使得将字节码翻译为机器代码的工作<br />
　　<br />
　　具有较高的效率。对于那些对运行速度要求较高的应用程序，解释器可将Java字节码即时编译为机器码，从而很好地保证了Java代码的可移植性和高性能。<br />
　　<br />
　　二.JVM规格描述<br />
　　JVM的设计目标是提供一个基于抽象规格描述的计算机模型，为解释程序开发人员提很好的灵活性，同时也确保Java代码可在符合该规范的任何系统上运行。JVM对其实现的某些方面给出了具体的定义，特别是对Java可执行代码，即字节码(Bytecode)的格式给出了明确的规格。这一规格包括操作码和操作数的语法和数值、标识符的数值表示方式、以及Java类文件中的Java对象、常量缓冲池在JVM的存储映象。这些定义为JVM解释器开发人员提供了所需的信息和开发环境。Java的设计者希望给开发人员以随心所欲使用Java的自由。<br />
　　<br />
　　JVM定义了控制Java代码解释执行和具体实现的五种规格，它们是：<br />
　　JVM指令系统<br />
　　JVM寄存器<br />
　　JVM栈结构<br />
　　JVM碎片回收堆<br />
　　JVM存储区<br />
　　<br />
　　2.1JVM指令系统<br />
　　<br />
　　JVM指令系统同其他计算机的指令系统极其相似。Java指令也是由 操作码和操作数两部分组成。操作码为8位二进制数，操作数进紧随在操作码的后面，其长度根据需要而不同。操作码用于指定一条指令操作的性质（在这里我们采用汇编符号的形式进行说明），如iload表示从存储器中装入一个整数，anewarray表示为一个新数组分配空间，iand表示两个整数的"与"，ret用于流程控制，表示从对某一方法的调用中返回。当长度大于8位时，操作数被分为两个以上字节存放。JVM采用了"big endian"的编码方式来处理这种情况，即高位bits存放在低字节中。这同 Motorola及其他的RISC CPU采用的编码方式是一致的，而与Intel采用的"little endian "的编码方式即低位bits存放在低位字节的方法不同。<br />
　　<br />
　　Java指令系统是以Java语言的实现为目的设计的，其中包含了用于调用方法和监视多先程系统的指令。Java的8位操作码的长度使得JVM最多有256种指令，目前已使用了160多种操作码。<br />
　　<br />
　　2.2JVM指令系统<br />
　　<br />
　　所有的CPU均包含用于保存系统状态和处理器所需信息的寄存器组。如果虚拟机定义较多的寄存器，便可以从中得到更多的信息而不必对栈或内存进行访问，这有利于提高运行速度。然而，如果虚拟机中的寄存器比实际CPU的寄存器多，在实现虚拟机时就会占用处理器大量的时间来用常规存储器模拟寄存器，这反而会降低虚拟机的效率。针对这种情况，JVM只设置了4个最为常用的寄存器。它们是：<br />
　　pc程序计数器<br />
　　optop操作数栈顶指针<br />
　　frame当前执行环境指针<br />
　　vars指向当前执行环境中第一个局部变量的指针<br />
　　所有寄存器均为32位。pc用于记录程序的执行。optop,frame和vars用于记录指向Java栈区的指针。<br />
　　<br />
　　2.3JVM栈结构<br />
　　<br />
　　作为基于栈结构的计算机，Java栈是JVM存储信息的主要方法。当JVM得到一个Java字节码应用程序后，便为该代码中一个类的每一个方法创建一个栈框架，以保存该方法的状态信息。每个栈框架包括以下三类信息：<br />
　　局部变量<br />
　　执行环境<br />
　　操作数栈<br />
　　<br />
　　局部变量用于存储一个类的方法中所用到的局部变量。vars寄存器指向该变量表中的第一个局部变量。<br />
　　执行环境用于保存解释器对Java字节码进行解释过程中所需的信息。它们是：上次调用的方法、局部变量指针和操作数栈的栈顶和栈底指针。执行环境是一个执行一个方法的控制中心。例如：如果解释器要执行iadd(整数加法)，首先要从frame寄存器中找到当前执行环境，而后便从执行环境中找到操作数栈，从栈顶弹出两个整数进行加法运算，最后将结果压入栈顶。<br />
　　操作数栈用于存储运算所需操作数及运算的结果。<br />
　　<br />
　　2.4JVM碎片回收堆<br />
　　<br />
　　Java类的实例所需的存储空间是在堆上分配的。解释器具体承担为类实例分配空间的工作。解释器在为一个实例分配完存储空间后，便开始记录对该实例所占用的内存区域的使用。一旦对象使用完毕，便将其回收到堆中。<br />
　　在Java语言中，除了new语句外没有其他方法为一对象申请和释放内存。对内存进行释放和回收的工作是由Java运行系统承担的。这允许Java运行系统的设计者自己决定碎片回收的方法。在SUN公司开发的Java解释器和Hot Java环境中，碎片回收用后台线程的方式来执行。这不但为运行系统提供了良好的性能，而且使程序设计人员摆脱了自己控制内存使用的风险。<br />
　　<br />
　　2.5JVM存储区<br />
　　<br />
　　JVM有两类存储区：常量缓冲池和方法区。常量缓冲池用于存储类名称、方法和字段名称以及串常量。方法区则用于存储Java方法的字节码。对于这两种存储区域具体实现方式在JVM规格中没有明确规定。这使得Java应用程序的存储布局必须在运行过程中确定，依赖于具体平台的实现方式。<br />
　　<br />
　　JVM是为Java字节码定义的一种独立于具体平台的规格描述，是Java平台独立性的基础。目前的JVM还存在一些限制和不足，有待于进一步的完善，但无论如何，JVM的思想是成功的。<br />
　　<br />
　　对比分析：如果把Java原程序想象成我们的C++原程序，Java原程序编译后生成的字节码就相当于C++原程序编译后的80x86的机器码（二进制程序文件），JVM虚拟机相当于80x86计算机系统,Java解释器相当于80x86CPU。在80x86CPU上运行的是机器码，在Java解释器上运行的是Java字节码。<br />
　　<br />
　　Java解释器相当于运行Java字节码的&#8220;CPU&#8221;,但该&#8220;CPU&#8221;不是通过硬件实现的，而是用软件实现的。Java解释器实际上就是特定的平台下的一个应用程序。只要实现了特定平台下的解释器程序，Java字节码就能通过解释器程序在该平台下运行，这是Java跨平台的根本。当前，并不是在所有的平台下都有相应Java解释器程序，这也是Java并不能在所有的平台下都能运行的原因，它只能在已实现了Java解释器程序的平台下运行。<br />
</span></p>
<p><span style="font-family: 宋体"><br />
<br />
----2008年11月27日</span></p>
<img src ="http://www.blogjava.net/jnbzwm/aggbug/330527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jnbzwm/" target="_blank">Java你我</a> 2010-09-01 11:08 <a href="http://www.blogjava.net/jnbzwm/articles/330527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[转] java内存分配</title><link>http://www.blogjava.net/jnbzwm/articles/java.html</link><dc:creator>Java你我</dc:creator><author>Java你我</author><pubDate>Wed, 01 Sep 2010 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/jnbzwm/articles/java.html</guid><wfw:comment>http://www.blogjava.net/jnbzwm/comments/330514.html</wfw:comment><comments>http://www.blogjava.net/jnbzwm/articles/java.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jnbzwm/comments/commentRss/330514.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jnbzwm/services/trackbacks/330514.html</trackback:ping><description><![CDATA[<p>在网上收集了一些关于java内存分配的知识<br />
Java 中的堆和栈</p>
<p>简单的说：<br />
Java把内存划分成两种：一种是栈内存，一种是堆内存。 </p>
<p>&nbsp;&nbsp; 在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 </p>
<p>&nbsp;&nbsp; 当在一段代码块定义一个变量时，Java就在栈中为这个变量分配内存空间，当超过变量的作用域后，Java会自动释放掉为该变量所分配的内存空间，该内存空间可以立即被另作他用。 </p>
<p>&nbsp;&nbsp; 堆内存用来存放由new创建的对象和数组。 </p>
<p>&nbsp;&nbsp; 在堆中分配的内存，由Java虚拟机的自动垃圾回收器来管理。 </p>
<p>&nbsp;&nbsp; 在堆中产生了一个数组或对象后，还可以在栈中定义一个特殊的变量，让栈中这个变量的取值等于数组或对象在堆内存中的首地址，栈中的这个变量就成了数组或对象的引用变量。 </p>
<p>&nbsp;&nbsp; 引用变量就相当于是为数组或对象起的一个名称，以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 </p>
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p>
<p>具体的说：<br />
栈与堆都是Java用来在Ram中存放数据的地方。与C++不同，Java自动管理栈和堆，程序员不能直接地设置栈或堆。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等 指令建立，它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的，堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，因为它是在运行时 动态分配内存的，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 栈的优势是，存取速度比堆要快，仅次于寄存器，栈数据可以共享。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。栈中主要存放一些基本 类型的变量（,int, short, long, byte, float, double, boolean, char）和对象句柄。 <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 栈有一个很重要的特殊性，就是存在栈中的数据可以共享。假设我们同时定义： <br />
int a = 3; <br />
int b = 3； <br />
编译器先处理int a = 3；首先它会在栈中创建一个变量为a的引用，然后查找栈中是否有3这个值，如果没找到，就将3存放进来，然后将a指向3。接着处理int b = 3；在创建完b的引用变量后，因为在栈中已经有3这个值，便将b直接指向3。这样，就出现了a与b同时均指向3的情况。这时，如果再令a=4；那么编译器 会重新搜索栈中是否有4值，如果没有，则将4存放进来，并令a指向4；如果已经有了，则直接将a指向这个地址。因此a值的改变不会影响到b的值。要注意这 种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的，因为这种情况a的修改并不会影响到b, 它是由编译器完成的，它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态，会影响到另一个对象引用变量。 </p>
<p>String是一个特殊的包装类数据。可以用： <br />
String str = new String("abc"); <br />
String str = "abc"; <br />
两种的形式来创建，第一种是用new()来新建对象的，它会在存放于堆中。每调用一次就会创建一个新的对象。 <br />
而第二种是先在栈中创建一个对String类的对象引用变量str，然后查找栈中有没有存放"abc"，如果没有，则将"abc"存放进栈，并令str指向&#8221;abc&#8221;，如果已经有&#8221;abc&#8221; 则直接令str指向&#8220;abc&#8221;。 </p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 比较类里面的数值是否相等时，用equals()方法；当测试两个包装类的引用是否指向同一个对象时，用==，下面用例子说明上面的理论。 <br />
String str1 = "abc"; <br />
String str2 = "abc"; <br />
System.out.println(str1==str2); //true <br />
可以看出str1和str2是指向同一个对象的。 </p>
<p>String str1 =new String ("abc"); <br />
String str2 =new String ("abc"); <br />
System.out.println(str1==str2); // false <br />
用new的方式是生成不同的对象。每一次生成一个。 <br />
&nbsp;&nbsp; 因此用第二种方式创建多个&#8221;abc&#8221;字符串,在内存中其实只存在一个对象而已. 这种写法有利与节省内存空间. 同时它可以在一定程度上提高程序的运行速度，因为JVM会自动根据栈中数据的实际情况来决定是否有必要创建新对象。而对于String str = new String("abc")；的代码，则一概在堆中创建新对象，而不管其字符串值是否相等，是否有必要创建新对象，从而加重了程序的负担。 <br />
&nbsp;&nbsp; 另一方面, 要注意: 我们在使用诸如String str = "abc"；的格式定义类时，总是想当然地认为，创建了String类的对象str。担心陷阱！对象可能并没有被创建！而可能只是指向一个先前已经创建的 对象。只有通过new()方法才能保证每次都创建一个新的对象。 由于String类的immutable性质，当String变量需要经常变换其值时，应该考虑使用StringBuffer类，以提高程序效率。</p>
<p>&nbsp;</p>
<p><br />
java中内存分配策略及堆和栈的比较 <br />
2.1 内存分配策略 <br />
按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. <br />
静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允 许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求. <br />
栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知 的,只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存.和我们在数据结构所熟知 的栈一样,栈式存储分配按照先进后出的原则进行分配。 <br />
静态存储分配要求在编译时能知道所有变量的存储要求,栈式存储分配要求在过程的入口处必须知道所有的存储要求,而堆式存储分配则专门负责在编译时或运行时 模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例.堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释 放. </p>
<p>2.2 堆和栈的比较 <br />
上面的定义从编译原理的教材中总结而来,除静态存储分配之外,都显得很呆板和难以理解,下面撇开静态存储分配,集中比较堆和栈: <br />
从堆和栈的功能和作用来通俗的比较,堆主要用来存放对象的，栈主要是用来执行程序的.而这种不同又主要是由于堆和栈的特点决定的: <br />
在编程中，例如C/C++中，所有的方法调用都是通过栈来进行的,所有的局部变量,形式参数都是从栈中分配内存空间的。实际上也不是什么分配,只是从栈顶 向上用就行,就好像工厂中的传送带(conveyor belt)一样,Stack Pointer会自动指引你到放东西的位置,你所要做的只是把东西放下来就行.退出函数的时候，修改栈指针就可以把栈中的内容销毁.这样的模式速度最快, 当然要用来运行程序了.需要注意的是,在分配的时候,比如为一个即将要调用的程序模块分配数据区时,应事先知道这个数据区的大小,也就说是虽然分配是在程 序运行时进行的,但是分配的大小多少是确定的,不变的,而这个"大小多少"是在编译时确定的,不是在运行时. <br />
堆是应用程序在运行的时候请求操作系统分配给自己内存，由于从操作系统管理的内存分配,所以在分配和销毁时都要占用时间，因此用堆的效率非常低.但是堆的 优点在于,编译器不必知道要从堆里分配多少存储空间，也不必知道存储的数据要在堆里停留多长的时间,因此,用堆保存数据时会得到更大的灵活性。事实上,面 向对象的多态性,堆内存分配是必不可少的,因为多态变量所需的存储空间只有在运行时创建了对象之后才能确定.在C++中，要求创建一个对象时，只需用 new命令编制相关的代码即可。执行这些代码时，会在堆里自动进行数据的保存.当然，为达到这种灵活性，必然会付出一定的代价:在堆里分配存储空间时会花 掉更长的时间！这也正是导致我们刚才所说的效率低的原因,看来列宁同志说的好,人的优点往往也是人的缺点,人的缺点往往也是人的优点(晕~). </p>
<p><br />
2.3 JVM中的堆和栈 <br />
JVM是基于堆栈的虚拟机.JVM为每个新创建的线程都分配一个堆栈.也就是说,对于一个Java程序来说，它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。 <br />
我们知道,某个线程正在执行的方法称为此线程的当前方法.我们可能不知道,当前方法使用的帧称为当前帧。当线程激活一个Java方法,JVM就会在线程的 Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间,这个帧将用来保存参数,局部变量,中间计算过程和其他数据.这个帧在这里和编译 原理中的活动纪录的概念是差不多的. <br />
从Java的这种分配机制来看,堆栈又可以这样理解:堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域，该区域具有先进后出的特性。 <br />
每一个Java应用都唯一对应一个JVM实例，每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中,并由应用所有的线程 共享.跟C/C++不同，Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的，但是这个对象的引用却是在堆栈中分配,也 就是说在建立一个对象时从两个地方都分配内存，在堆中分配的内存实际建立这个对象，而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而已。<br />
2.4 GC的思考<br />
Java为什么慢?JVM的存在当然是一个原因,但有人说,在Java中,除了简单类型(int,char等)的数据结构,其它都是在堆中分配内存(所以说Java的一切都是对象)，这也是程序慢的原因之一。<br />
我的想法是(应该说代表TIJ的观点),如果没有Garbage Collector(GC),上面的说法就是成立的.堆不象栈是连续的空间,没有办法指望堆本身的内存分配能够象堆栈一样拥有传送带般的速度,因为,谁会 为你整理庞大的堆空间,让你几乎没有延迟的从堆中获取新的空间呢?<br />
这个时候,GC站出来解决问题.我们都知道GC用来清除内存垃圾,为堆腾出空间供程序使用,但GC同时也担负了另外一个重要的任务,就是要让Java中堆 的内存分配和其他语言中堆栈的内存分配一样快,因为速度的问题几乎是众口一词的对Java的诟病.要达到这样的目的,就必须使堆的分配也能够做到象传送带 一样,不用自己操心去找空闲空间.这样,GC除了负责清除Garbage外,还要负责整理堆中的对象,把它们转移到一个远离Garbage的纯净空间中无 间隔的排列起来,就象堆栈中一样紧凑,这样Heap Pointer就可以方便的指向传送带的起始位置,或者说一个未使用的空间,为下一个需要分配内存的对象"指引方向".因此可以这样说,垃圾收集影响了对 象的创建速度,听起来很怪,对不对?<br />
那GC怎样在堆中找到所有存活的对象呢?前面说了,在建立一个对象时，在堆中分配实际建立这个对象的内存,而在堆栈中分配一个指向这个堆对象的指针(引 用),那么只要在堆栈(也有可能在静态存储区)找到这个引用,就可以跟踪到所有存活的对象.找到之后,GC将它们从一个堆的块中移到另外一个堆的块中,并 将它们一个挨一个的排列起来,就象我们上面说的那样,模拟出了一个栈的结构,但又不是先进后出的分配,而是可以任意分配的,在速度可以保证的情况下, Isn't it great?<br />
但是，列宁同志说了,人的优点往往也是人的缺点,人的缺点往往也是人的优点(再晕~~).GC()的运行要占用一个线程,这本身就是一个降低程序运行性能 的缺陷,更何况这个线程还要在堆中把内存翻来覆去的折腾.不仅如此,如上面所说,堆中存活的对象被搬移了位置,那么所有对这些对象的引用都要重新赋值.这 些开销都会导致性能的降低.</p>
<p><br />
基础数据类型直接在栈空间分配，方法的形式参数，直接在栈空间分配，当方法调用完成后从栈空间回收。引用数据类型，需要用new来创建，既在栈空间 分配一个地址空间，又在堆空间分配对象的类变量 。方法的引用参数，在栈空间分配一个地址空间，并指向堆空间的对象区，当方法调用完成后从栈空间回收。局部变量new出来时，在栈空间和堆空间中分配空 间，当局部变量生命周期结束后，栈空间立刻被回收，堆空间区域等待GC回收。方法调用时传入的literal参数，先在栈空间分配，在方法调用完成后从栈 空间分配。字符串常量在DATA区域分配，this在堆空间分配。数组既在栈空间分配数组名称，又在堆空间分配数组实际的大小！</p>
<p>哦 对了，补充一下static在DATA区域分配。</p>
<p>其实是有规律的，只要你理解了这些个基本的原理：</p>
<p>堆空间的话：操作系统有一个记录空闲内存地址的链表，当系统收到程序的申请时，会遍历该链表，寻找第一个空间大 于所申请空间的堆结点，然后将该结点从空闲结点链表中删除，并将该结点的空间分配给程序。另外，对于大多数系统，会在这块内存空间中的首地址处记录本次分 配的大小，这样代码中的delete语句才能正确的释放本内存空间。另外由于找到的堆结点的大小不一定正好等于申请的大小，系统会自动的将多余的那部分重 新放入空闲链表中。是由new分配的内存，一般速度比较慢，而且容易产生内存碎片，不过用起来最方便。另外，在WINDOWS下，最好的方式是用 VirtualAlloc分配内存，他不是在堆，也不是在栈是直接在进程的地址空间中保留一快内存，虽然用起来最不方便。但是速度快，也最灵活。是向高地 址扩展的数据结构，是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的，自然是不连续的，而链表的遍历方向是由低地址向高地址。堆的大小受 限于计算机系统中有效的虚拟内存。由此可见，堆获得的空间比较灵活，也比较大。</p>
<p>栈空间的话：在Windows下, 栈是向低地址扩展的数据结构，是一块连续的内存的区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的，在WINDOWS下，栈的大小是固定 的（是一个编译时就确定的常数），如果申请的空间超过栈的剩余空间时，将提示overflow。因此，能从栈获得的空间较小。只要栈的剩余空间大于所申请 空间，系统将为程序提供内存，否则将报异常提示栈溢出。 由系统自动分配，速度较快。但程序员是无法控制的。</p>
<p>JVM中的堆和栈</p>
<p>JVM是基于堆栈的虚拟机。JVM为每个新创建的线程都分配一个堆栈。也就是说，对于一个Java程序来说，它的运行就是通过对堆栈的操作来完成的。堆栈以帧为单位保存线程的状态。JVM对堆栈只进行两种操作:以帧为单位的压栈和出栈操作。</p>
<p>我们知道，某个线程正在执行的方法称为此线程的当前方法。我们可能不知道，当前方法使用的帧称为当前帧。当线程激活一个Java方法，JVM就会在 线程的Java堆栈里新压入一个帧。这个帧自然成为了当前帧.在此方法执行期间，这个帧将用来保存参数，局部变量，中间计算过程和其他数据。这个帧在这里 和编译原理中的活动纪录的概念是差不多的。</p>
<p>从Java的这种分配机制来看,堆栈又可以这样理解：堆栈(Stack)是操作系统在建立某个进程时或者线程(在支持多线程的操作系统中是线程)为这个线程建立的存储区域，该区域具有先进后出的特性。</p>
<p>每一个Java应用都唯一对应一个JVM实例，每一个实例唯一对应一个堆。应用程序在运行中所创建的所有类实例或数组都放在这个堆中，并由应用所有 的线程共享。跟C/C++不同，Java中分配堆内存是自动初始化的。Java中所有对象的存储空间都是在堆中分配的，但是这个对象的引用却是在堆栈中分 配,也就是说在建立一个对象时从两个地方都分配内存，在堆中分配的内存实际建立这个对象，而在堆栈中分配的内存只是一个指向这个堆对象的指针(引用)而 已。</p>
<p>&nbsp;</p>
<p>----2008年11月24日</p>
<img src ="http://www.blogjava.net/jnbzwm/aggbug/330514.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jnbzwm/" target="_blank">Java你我</a> 2010-09-01 10:46 <a href="http://www.blogjava.net/jnbzwm/articles/java.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>