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

<channel>
	<title>Shadow &#38; Honnix &#187; Java</title>
	<atom:link href="http://honnix.com/blog/archives/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://honnix.com/blog</link>
	<description>Two Months</description>
	<lastBuildDate>Wed, 21 Jul 2010 14:09:50 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>慢慢地转到maven</title>
		<link>http://honnix.com/blog/archives/483</link>
		<comments>http://honnix.com/blog/archives/483#comments</comments>
		<pubDate>Mon, 09 Nov 2009 12:48:16 +0000</pubDate>
		<dc:creator>honnix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Scala]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[jfetion]]></category>
		<category><![CDATA[libfetion]]></category>
		<category><![CDATA[-d32]]></category>
		<category><![CDATA[64bit]]></category>
		<category><![CDATA[64位]]></category>
		<category><![CDATA[smsd]]></category>
		<category><![CDATA[Snow Leopard]]></category>
		<category><![CDATA[参数]]></category>
		<category><![CDATA[飞信]]></category>

		<guid isPermaLink="false">http://honnix.com/blog/?p=483</guid>
		<description><![CDATA[开始把之前做的一些项目往maven上转了。先是jfetion，再加上今天做的smsd。 说来惭愧，jfetion做了很久了，但是自己一直都没弄个什么应用出来，一直在用的smsd还是最早的时候用C写的。今天老婆出去逛街，闲来无事，用Scala重写了一遍，已经可以正常工作了，其它的功能慢慢加吧。 基本想法很简单，后台启一个daemon，监视某个文件夹，如果里面有.sms文件，就把里面的内容发送给相应的人，当然必须是飞信上面的好友。 顺便说一下，Snow Leopard的Java默认是64位的，而libfetion没有Mac上64位的版本，所以要么在系统设置里面更改Java的默认设置，要么运行的时候给个参数：java -d32 &#8230;]]></description>
			<content:encoded><![CDATA[<p>开始把之前做的一些项目往maven上转了。先是jfetion，再加上今天做的smsd。</p>
<p>说来惭愧，jfetion做了很久了，但是自己一直都没弄个什么应用出来，一直在用的smsd还是最早的时候用C写的。今天老婆出去逛街，闲来无事，用Scala重写了一遍，已经可以正常工作了，其它的功能慢慢加吧。</p>
<p>基本想法很简单，后台启一个daemon，监视某个文件夹，如果里面有.sms文件，就把里面的内容发送给相应的人，当然必须是飞信上面的好友。</p>
<p>顺便说一下，Snow Leopard的Java默认是64位的，而libfetion没有Mac上64位的版本，所以要么在系统设置里面更改Java的默认设置，要么运行的时候给个参数：java -d32 &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://honnix.com/blog/archives/483/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>我是如何用Scala定义新异常类型的</title>
		<link>http://honnix.com/blog/archives/412</link>
		<comments>http://honnix.com/blog/archives/412#comments</comments>
		<pubDate>Sun, 09 Aug 2009 02:41:30 +0000</pubDate>
		<dc:creator>honnix</dc:creator>
				<category><![CDATA[Scala]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[apply]]></category>
		<category><![CDATA[constructor]]></category>
		<category><![CDATA[Exception]]></category>
		<category><![CDATA[extends]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[override]]></category>
		<category><![CDATA[trait]]></category>

		<guid isPermaLink="false">http://honnix.com/blog/?p=412</guid>
		<description><![CDATA[Scala的构造方法非常灵活（具体怎么个灵活法这里不多说了），但随之而来的是重载构造方法的麻烦。 例如定义新异常类型。一般来说，自己定义的异常都属于checked异常，大都从Exception继承过来，所以也大都需要定义多个构造方法。如果用Java来定义，没什么好说的，重载就行，但是用Scala的话就有点麻烦。Scala规定所有重载的构造方法都必须调用或间接调用默认构造方法，所以必须使用如下的方法。 ?View Code SCALAclass MyException&#40;message: String, cause: Throwable&#41; extends Exception&#40;message, cause&#41; &#123; def this&#40;message: String&#41;: = this&#40;message, null&#41; def this&#40;cause: Throwable&#41;: = this&#40;null, cause&#41; def this: = this&#40;null, null&#41; &#125; 当然，这样是可以工作的，但是仔细看看Throwable的实现就会发现如果传入的cause为null话会导致异常栈的丢失。而且最恶心的是Throwable没有提供相应的setter/getter，我们能做的就是调用构造方法。 所以我就想出了下面的怪招。 ?View Code SCALAobject SpcException &#123; def apply&#40;message: String, cause: Throwable&#41;: Exception = &#40;new SpcException1&#40;message, cause&#41;&#41;.asInstanceOf&#91;Exception&#93; &#160; def apply&#40;message: String&#41;: Exception = &#40;new [...]]]></description>
			<content:encoded><![CDATA[<p>Scala的构造方法非常灵活（具体怎么个灵活法这里不多说了），但随之而来的是重载构造方法的麻烦。</p>
<p>例如定义新异常类型。一般来说，自己定义的异常都属于checked异常，大都从Exception继承过来，所以也大都需要定义多个构造方法。如果用Java来定义，没什么好说的，重载就行，但是用Scala的话就有点麻烦。Scala规定所有重载的构造方法都必须调用或间接调用默认构造方法，所以必须使用如下的方法。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p412code3'); return false;">View Code</a> SCALA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4123"><td class="code" id="p412code3"><pre class="scala" style="font-family:monospace;"><a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">class</span></a> MyException<span style="color: #F78811;">&#40;</span>message<span style="color: #000080;">:</span> String, cause<span style="color: #000080;">:</span> Throwable<span style="color: #F78811;">&#41;</span> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">extends</span></a> Exception<span style="color: #F78811;">&#40;</span>message, cause<span style="color: #F78811;">&#41;</span> <span style="color: #F78811;">&#123;</span>
  <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">def</span></a> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">this</span></a><span style="color: #F78811;">&#40;</span>message<span style="color: #000080;">:</span> String<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> <span style="color: #000080;">=</span> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">this</span></a><span style="color: #F78811;">&#40;</span>message, <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">null</span></a><span style="color: #F78811;">&#41;</span>
  <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">def</span></a> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">this</span></a><span style="color: #F78811;">&#40;</span>cause<span style="color: #000080;">:</span> Throwable<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> <span style="color: #000080;">=</span> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">this</span></a><span style="color: #F78811;">&#40;</span><a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">null</span></a>, cause<span style="color: #F78811;">&#41;</span>
  <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">def</span></a> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">this</span></a><span style="color: #000080;">:</span> <span style="color: #000080;">=</span> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">this</span></a><span style="color: #F78811;">&#40;</span><a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">null</span></a>, <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">null</span></a><span style="color: #F78811;">&#41;</span>
<span style="color: #F78811;">&#125;</span></pre></td></tr></table></div>

<p>当然，这样是可以工作的，但是仔细看看Throwable的实现就会发现如果传入的cause为null话会导致异常栈的丢失。而且最恶心的是Throwable没有提供相应的setter/getter，我们能做的就是调用构造方法。<br />
所以我就想出了下面的怪招。</p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p412code4'); return false;">View Code</a> SCALA</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4124"><td class="code" id="p412code4"><pre class="scala" style="font-family:monospace;"><a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">object</span></a> SpcException <span style="color: #F78811;">&#123;</span>
  <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">def</span></a> apply<span style="color: #F78811;">&#40;</span>message<span style="color: #000080;">:</span> String, cause<span style="color: #000080;">:</span> Throwable<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Exception <span style="color: #000080;">=</span>
    <span style="color: #F78811;">&#40;</span><a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">new</span></a> SpcException1<span style="color: #F78811;">&#40;</span>message, cause<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">asInstanceOf</span><span style="color: #F78811;">&#91;</span>Exception<span style="color: #F78811;">&#93;</span>
&nbsp;
  <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">def</span></a> apply<span style="color: #F78811;">&#40;</span>message<span style="color: #000080;">:</span> String<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Exception <span style="color: #000080;">=</span>
    <span style="color: #F78811;">&#40;</span><a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">new</span></a> SpcException2<span style="color: #F78811;">&#40;</span>message<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">asInstanceOf</span><span style="color: #F78811;">&#91;</span>Exception<span style="color: #F78811;">&#93;</span>
&nbsp;
  <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">def</span></a> apply<span style="color: #F78811;">&#40;</span>cause<span style="color: #000080;">:</span> Throwable<span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Exception <span style="color: #000080;">=</span>
    <span style="color: #F78811;">&#40;</span><a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">new</span></a> SpcException3<span style="color: #F78811;">&#40;</span>cause<span style="color: #F78811;">&#41;</span><span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">asInstanceOf</span><span style="color: #F78811;">&#91;</span>Exception<span style="color: #F78811;">&#93;</span>
&nbsp;
  <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">def</span></a> apply<span style="color: #F78811;">&#40;</span><span style="color: #F78811;">&#41;</span><span style="color: #000080;">:</span> Exception <span style="color: #000080;">=</span>
    <span style="color: #F78811;">&#40;</span><a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">new</span></a> SpcException4<span style="color: #F78811;">&#41;</span>.<span style="color: #000000;">asInstanceOf</span><span style="color: #F78811;">&#91;</span>Exception<span style="color: #F78811;">&#93;</span>
<span style="color: #F78811;">&#125;</span>
&nbsp;
<a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">trait</span></a> SpcException
&nbsp;
<a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">class</span></a> SpcException1<span style="color: #F78811;">&#40;</span>message<span style="color: #000080;">:</span> String, cause<span style="color: #000080;">:</span> Throwable<span style="color: #F78811;">&#41;</span>
    <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">extends</span></a> Exception<span style="color: #F78811;">&#40;</span>message, cause<span style="color: #F78811;">&#41;</span> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">with</span></a> SpcException
&nbsp;
<a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">class</span></a> SpcException2<span style="color: #F78811;">&#40;</span>message<span style="color: #000080;">:</span> String<span style="color: #F78811;">&#41;</span>
    <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">extends</span></a> Exception<span style="color: #F78811;">&#40;</span>message<span style="color: #F78811;">&#41;</span> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">with</span></a> SpcException
&nbsp;
<a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">class</span></a> SpcException3<span style="color: #F78811;">&#40;</span>cause<span style="color: #000080;">:</span> Throwable<span style="color: #F78811;">&#41;</span>
    <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">extends</span></a> Exception<span style="color: #F78811;">&#40;</span>cause<span style="color: #F78811;">&#41;</span> <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">with</span></a> SpcException
&nbsp;
<a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">class</span></a> SpcException4 <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">extends</span></a> Exception <a href="http://scala-lang.org"><span style="color: #0000ff; font-weight: bold;">with</span></a> SpcException</pre></td></tr></table></div>

<p>基本思想是定义一个trait，然后定义四种异常，每种都从该trait扩展并提供不同的默认构造方法，同时定义一个singleton，提供四种不同的apply方法用来构造四种不同的异常。这样就可以解决之前的问题，虽然不怎么好看。</p>
]]></content:encoded>
			<wfw:commentRss>http://honnix.com/blog/archives/412/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>准备发布jfetion了</title>
		<link>http://honnix.com/blog/archives/186</link>
		<comments>http://honnix.com/blog/archives/186#comments</comments>
		<pubDate>Tue, 05 Aug 2008 01:37:38 +0000</pubDate>
		<dc:creator>honnix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[libfetion]]></category>
		<category><![CDATA[jfetion]]></category>
		<category><![CDATA[JNI]]></category>
		<category><![CDATA[飞信]]></category>

		<guid isPermaLink="false">http://honnix.com/blog/?p=186</guid>
		<description><![CDATA[昨天把build.xml搞好了，现在可以方便地构建整个库，准备发布了，虽然还没有测完全。有些东西实在是不好测，尤其是要一边在虚拟的Windows上用移动官方的fetion登陆，改东西，一边又要在虚拟的Gentoo上写代码、测试，实在是麻烦。先发布一个alpha版本好了。 现在在上班，晚上回去放上来。]]></description>
			<content:encoded><![CDATA[<p>昨天把build.xml搞好了，现在可以方便地构建整个库，准备发布了，虽然还没有测完全。有些东西实在是不好测，尤其是要一边在虚拟的Windows上用移动官方的fetion登陆，改东西，一边又要在虚拟的Gentoo上写代码、测试，实在是麻烦。先发布一个alpha版本好了。</p>
<p>现在在上班，晚上回去放上来。</p>
]]></content:encoded>
			<wfw:commentRss>http://honnix.com/blog/archives/186/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Java里面的Reference</title>
		<link>http://honnix.com/blog/archives/55</link>
		<comments>http://honnix.com/blog/archives/55#comments</comments>
		<pubDate>Mon, 14 Jan 2008 13:25:08 +0000</pubDate>
		<dc:creator>honnix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[GC]]></category>
		<category><![CDATA[Reference]]></category>

		<guid isPermaLink="false">http://honnix.oicp.net:8080/blog/?p=55</guid>
		<description><![CDATA[之前写过一篇关于Java Reference的文章，只放了一个链接；这个星期要开Java的Workshop，所以仔细研究了一把。 首先是对几个Reachable作定义（其实是从Java Doc抄来的，翻得我实在不爽，直接看Java Doc吧） ： Strongly Reachable──一个对象是strongly reachable的，当且仅当它能够被某个线程reach到而不需要通过任何的Reference Object Weakly Reachable──一个对象是weakly reachable的，当且仅当它不是strongly reachable的，而且仅通过Soft Reference就可以被查找到 Phantom Reachable──一个对象是phantom reachable的，当且仅当它既不是strongly reachable的，也不是weakyly reachable的，它已经被finalized了，而且有一些Phantom Reference指向它 Phantom Reference： 如果在ReferenceQueue里面读到了一个Phantom Reference对象，说明该reference的referent已经被finalized了，如果它是finalizable的（这样的话需要两次GC才能在ReferenceQueue里面读到），否则一但referent成为phantom reachable的时候reference就被放入ReferenceQueue中。 实验表明，如果referent是finalizable的话，要经过两次GC之后才能在ReferenQueue里面读到Phantom Reference，第一次GC时，referent被finalized，但Phantom Reference不会被放到队列中。 如果new一个Phantom Reference的时候不传给它一个ReferenceQueue，那这个reference几乎没有任何用处，因为PhantomReference.get()永远返回null。 需要注意的是，GC不会调用PhantomReference.clear()，如果不对它显示地进行clear，那么它所引用到的对象就一直以finalized过的状态待在堆里而不被真正的回收，除非所有指向它的Phantom Reference都被clear了，或者它本身变为unreachable了。这一点和Weak Reference以及Soft Reference都不一样。 Phantom Reference一般用来处理一些cleanup的事情：监视某个对象，如果它被finalized之后，释放资源。例如：一个大的图片对象被finalized之后，那么用来读取和处理它的其它一些资源就可以被释放掉了。 Weak Reference： 如果在ReferenceQueue里面读到了一个Weak Reference对象，并不能说明该reference的referent已经被finalized了 所有对象的finalization都由一个FinalizeQueue来处理，这个queue本身就是一个线程；当GC发现一个对象是Weakly Reachable的时候，就会把它的reference放到ReferenceQueue中，而把这个对象放到FinalizeQueue中；这两个动作的先后顺序我还不是很清楚，但似乎不是特别重要，这里只要知道由这么两件事情应该就足够了 GC会主动调用WeakReference.clear()，这一点和Soft Reference相同。这样，即使没有ReferenceQueue我们也可以知道一个对象什么时候被GC发现成为weakly reachable，只要WeakReference.get() == null就可以了。 Weak Reference一般用来实现一些容器，我们不需要对容器的引用显示地清理（container[i] = null）以防止内存泄露。比较有名就是JDK中的WeakHashMap，它的key是Weak Reference，当key成为weakly reachable的时候，key&#38;value在就会被清除出去。这样一来，我们可以用map保存对象引用，以及它的一些附加信息，当这样对象不再是strongly reachable的时候，我们不必手工清理map，一切都交给GC去做了。 [...]]]></description>
			<content:encoded><![CDATA[<p>之前写过一篇关于Java Reference的文章，只放了一个链接；这个星期要开Java的Workshop，所以仔细研究了一把。</p>
<p><span id="more-55"></span></p>
<p>首先是对几个Reachable作定义（其实是从Java Doc抄来的，翻得我实在不爽，直接看Java Doc吧） ：</p>
<ol>
<li>Strongly Reachable──一个对象是strongly reachable的，当且仅当它能够被某个线程reach到而不需要通过任何的Reference Object</li>
<li>Weakly Reachable──一个对象是weakly reachable的，当且仅当它不是strongly reachable的，而且仅通过Soft Reference就可以被查找到</li>
<li>Phantom Reachable──一个对象是phantom reachable的，当且仅当它既不是strongly reachable的，也不是weakyly reachable的，它已经被finalized了，而且有一些Phantom Reference指向它</li>
</ol>
<p><u>Phantom Reference</u>：</p>
<ul>
<li>如果在ReferenceQueue里面读到了一个Phantom  Reference对象，说明该reference的referent已经被finalized了，如果它是finalizable的（这样的话需要两次GC才能在ReferenceQueue里面读到），否则一但referent成为phantom reachable的时候reference就被放入ReferenceQueue中。</li>
<li>实验表明，如果referent是finalizable的话，要经过两次GC之后才能在ReferenQueue里面读到Phantom Reference，第一次GC时，referent被finalized，但Phantom Reference不会被放到队列中。</li>
<li>如果new一个Phantom Reference的时候不传给它一个ReferenceQueue，那这个reference几乎没有任何用处，因为PhantomReference.get()永远返回null。</li>
<li>需要注意的是，GC不会调用PhantomReference.clear()，如果不对它显示地进行clear，那么它所引用到的对象就一直以finalized过的状态待在堆里而不被真正的回收，除非所有指向它的Phantom Reference都被clear了，或者它本身变为unreachable了。<font color="#ff0000">这一点和Weak Reference以及Soft Reference都不一样。</font></li>
<li>Phantom Reference一般用来处理一些cleanup的事情：监视某个对象，如果它被finalized之后，释放资源。例如：一个大的图片对象被finalized之后，那么用来读取和处理它的其它一些资源就可以被释放掉了。</li>
</ul>
<p><u>Weak Reference</u>：</p>
<ul>
<li> 如果在ReferenceQueue里面读到了一个Weak Reference对象，并不能说明该reference的referent已经被finalized了</li>
<li>所有对象的finalization都由一个FinalizeQueue来处理，这个queue本身就是一个线程；当GC发现一个对象是Weakly Reachable的时候，就会把它的reference放到ReferenceQueue中，而把这个对象放到FinalizeQueue中；这两个动作的先后顺序我还不是很清楚，但似乎不是特别重要，这里只要知道由这么两件事情应该就足够了</li>
<li>GC会主动调用WeakReference.clear()，<font color="#ff0000">这一点和Soft Reference相同。<font color="#000000">这样，即使没有ReferenceQueue我们也可以知道一个对象什么时候被GC发现成为weakly reachable，只要WeakReference.get() == null就可以了。</font></font></li>
<li><font color="#ff0000"><font color="#000000">Weak Reference一般用来实现一些容器，我们不需要对容器的引用显示地清理（container[i] = null）以防止内存泄露。比较有名就是JDK中的WeakHashMap，它的key是Weak Reference，当key成为weakly reachable的时候，key&amp;value在就会被清除出去。这样一来，我们可以用map保存对象引用，以及它的一些附加信息，当这样对象不再是strongly reachable的时候，我们不必手工清理map，一切都交给GC去做了。</font></font></li>
</ul>
<p><u>Soft Reference</u>：</p>
<ul>
<li>Soft Reference和Weak Reference非常类似，只有一点最大的区别：当一个对象变成Soft Reachable状态的时候，它不一定被GC回收（或者说有很大可能不会被回收），具体行为由虚拟机实现决定，唯一能保证的是，在虚拟机抛出OutOfMemory异常之前，这个对象肯定已经被回收了。</li>
<li>Soft Reference的这个特定使得它非常适合做cache，用Soft Reference引用一个大对象，这个对象在某些时候是strongly reachable的，而有些时候又不需要，那么由虚拟机来确定什么时候回收它吧，如果它被回收，那么SoftReference.get()出来的东西就是null，这时候只要再重新实例化一个对象就可以了。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://honnix.com/blog/archives/55/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Java的Reference</title>
		<link>http://honnix.com/blog/archives/41</link>
		<comments>http://honnix.com/blog/archives/41#comments</comments>
		<pubDate>Sun, 16 Dec 2007 10:34:01 +0000</pubDate>
		<dc:creator>honnix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Technology]]></category>

		<guid isPermaLink="false">http://honnix.oicp.net:8080/blog/?p=41</guid>
		<description><![CDATA[很惭愧，自己对Java里面的各种refernce一直不是很明白。今天研究JNI的时候看到了这篇文章，讲得比较清晰，拿来引用一下吧：http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html]]></description>
			<content:encoded><![CDATA[<p>很惭愧，自己对Java里面的各种refernce一直不是很明白。今天研究JNI的时候看到了这篇文章，讲得比较清晰，拿来引用一下吧：<a href="http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html" target="_blank">http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://honnix.com/blog/archives/41/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>鬼知道Eclipse怎么想的</title>
		<link>http://honnix.com/blog/archives/39</link>
		<comments>http://honnix.com/blog/archives/39#comments</comments>
		<pubDate>Thu, 13 Dec 2007 03:21:47 +0000</pubDate>
		<dc:creator>honnix</dc:creator>
				<category><![CDATA[Technology]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://honnix.oicp.net:8080/blog/?p=39</guid>
		<description><![CDATA[为什么把默认的class输出目录改成bin？这么好的名字被污染了。目录命名空间的污染也是一件让人愤怒的事情，虽然我可以设置默认为classes，但实在想不明白改的初衷是什么！]]></description>
			<content:encoded><![CDATA[<p>为什么把默认的class输出目录改成bin？这么好的名字被污染了。目录命名空间的污染也是一件让人愤怒的事情，虽然我可以设置默认为classes，但实在想不明白改的初衷是什么！</p>
]]></content:encoded>
			<wfw:commentRss>http://honnix.com/blog/archives/39/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>有关J2SE培训的一些想法</title>
		<link>http://honnix.com/blog/archives/27</link>
		<comments>http://honnix.com/blog/archives/27#comments</comments>
		<pubDate>Wed, 28 Nov 2007 13:38:57 +0000</pubDate>
		<dc:creator>honnix</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Technology]]></category>
		<category><![CDATA[Garbage Collection]]></category>
		<category><![CDATA[Memory Leak]]></category>

		<guid isPermaLink="false">http://honnix.oicp.net:8080/blog/?p=27</guid>
		<description><![CDATA[如果可以监控某些对象是否在堆里存得太久而没有使用的话，是不是可以找出一些潜在的内存泄露呢？]]></description>
			<content:encoded><![CDATA[<p>如果可以监控某些对象是否在堆里存得太久而没有使用的话，是不是可以找出一些潜在的内存泄露呢？</p>
]]></content:encoded>
			<wfw:commentRss>http://honnix.com/blog/archives/27/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
