posts - 32, comments - 153, trackbacks - 0, articles - 0
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          Java基礎知識,打好基礎才能更好地學習!
          原帖地址:http://www.linuxmine.com/44702.html
          對象引用應用程序設計接口是JDKTM1.2中新定義的。該應用程序設計接口允許應用程序以對象引用的方式與JVM的內存管理器進行交互。當應用程序需管理大量內存對象或者在新的Java對象創建之前需刪除原有對象時,Java對象引用應用程序設計接口具有相當大的用途,例如:
            
            ● 基于Web的應用程序常常要求顯示大量圖片,當用戶離開某一Web頁時,往往不能確定是否能夠順利的返回。在這種程序中,應用Java對象引用API可以創建這樣一個環境,即當堆內存以最小程度運行時,內存管理器創建對象。當用戶返回時,應用程序就會重新載入已經創建的圖片。
            
            ● 應用對象引用隊列可以創建這樣一個環境,當通過對象引用獲得某一對象時,應用程序得到通知。然后,應用程序就可以對相關對象進行清除操作,同時使這些對象在內存管理器中合法化。
            
            內存管理器的工作機制
            
            下面將首先介紹未嵌入引用對象時內存管理器的工作機制,然后討論引用對象加入之后Java堆發生的變化。
            
            內存管理器的作用就是識別程序中不再使用的對象,并且回收其內存。
            
            一個Java應用程序由一系列線程組成,每個線程執行一系列方法,而每個方法通過參數或局部變量來引用對象。這些引用屬于引用集合中的一部分,直接進入應用程序。另外,引用集合中還包括類庫中定義的靜態引用變量,以及通過Java本地接口(JNI)API獲得的引用。引用集合中的所有引用對象都可以被當前應用程序獲取,而不必被回收。同樣地,這些對象可能包含對其它對象的引用,也可以被應用程序獲取,依此類推。Java堆中的其它對象視為不可獲取的,而所有這些不可獲取的對象在內存管理中也是合法的。如果一個不可獲取的對象使用finalize()方法,任務就交給了對象所調用的收尾器(finalizer)。在內存回收期間,不具有收尾器的不可獲取對象和已經調用收尾器的對象被簡單回收。
            
            內存回收的算法是不斷變化的,共性的方面是從引用集合中識別可獲取的對象以及回收被其它對象占據的內存空間。
            
            加入引用對象之后的引用與常規引用的區別在于,引用對象中的引用專門由內存管理器來處理。引用對象封裝了其它一些對象的引用,我們稱之為指示對象。在引用對象創建的同時,也就定義了該引用對象的指示對象。
            
            Java對象引用
            
            圖1所示為對象引用應用程序設計接口中定義的類層次。其中SoftReference類、WeakReference類和PhantomReference類中分別定義了三種引用對象以及相應的三種獲取對象的能力。因此按照由強到弱,對象可獲取程度可劃分為如下五種類型:強獲取(strongly reachable)、次獲取(softly reachable)、弱獲取(weakly reachable)、虛獲取(phantomly reachable)和不可獲取(unreachable)。
             
            圖1 對象應用類層次
            
            根據應用程序要求,對象可以是強引用(strong references)、次引用(soft references)、弱引用(weak references)、虛引用(phantom references)的任意組合。為了確定對象的可獲取程度,JVM內存管理器從引用集合出發遍尋堆中所有到對象的路徑。當到達某對象的任意路徑都不含有引用對象時,則稱該對象具有強獲取能力;當路徑中含有一個或幾個引用對象時,根據內存管理器所查詢的引用對象的類型分別歸為次獲取、弱獲取、虛獲取。
            
            另外,對象引用API中還定義了引用對象隊列(java.lang.ref.ReferenceQueue),這是內存管理器對引用對象進行管理的一種簡單數據結構。值得注意的是,在進行引用對象定義時,要求phantom reference對象必須產生于一個引用對象隊列,而soft reference和weak reference對象則無此限制,如:
            
            

          ReferenceQueue?queue? = ? new ?ReferenceQueue();
            PhantomReference?pr?
          = ? new ?PhantomReference(object,?queue);

            Soft References 應用實例
            
            下面以在基于web的應用程序中使用soft references為例,來說明Java對象引用與JVM的內存管理器進行交互的原理。
            
            當用戶打開某一web頁時,applet代碼獲得圖片并且得到顯示。如果在代碼中同時創建了該圖片對象的soft references,那么當用戶離開該web頁時,內存管理器對圖片所分配的內存是否回收做出選擇。當用戶返回該web頁時,在applet代碼中使用SoftReference.get方法就會得到圖片才內存中是否仍存在的消息。如果在內存管理器中未創建該圖片,在web頁上會很快得到顯示;否則,applet代碼就會重新獲取。
            
            下面是Example.java的完整源代碼。
            
            

          import ?java.awt.Graphics;
            
          import ?java.awt.Image;
            
          import ?java.applet.Applet;
            
          import ?java.lang.ref.SoftReference;
            
          public ? class ?Example? extends ?Applet? {
              SoftReference?sr?
          = ? null ;
              
          public ? void ?init()? {
                System.out.println(
          " Initializing " );
              }

              
          public ? void ?paint(Graphics?g)? {
                Image?im?
          = ?(sr? == ? null )? ? ? null ?:?(Image)(sr.get());
                
          if ?(im? == ? null )? {
                  System.out.println(
          " Fetching?image " );
                  im?
          = ?getImage(getCodeBase(), " yundong.gif " );
                  sr?
          = ? new ?SoftReference(im);
               ?}

               ?System.out.println(
          " Painting " );
               ?g.drawImage(im,?
          25 ,? 25 ,? this );
               ?g.drawString(
          " 運動之美 " , 20 , 20 );?
               im?
          = ? null ; 
              
          /* ?Clear?the?strong?reference?to?the?image? */
              }

            
              
          public ? void ?start()? {
                System.out.println(
          " Starting " );
              }

            
              
          public ? void ?stop()? {
                System.out.println(
          " Stopping " );
              }

            }


            
            在上面的代碼中,對象image是一個圖片對象,傳遞給一個SoftReference對象sr。其中image對象是sr的指示對象,sr中的引用域是從次引用(soft reference)到 image。
            
            Weak References分析
            
            對于一個穩定的對象,比如說線程類對象,當需要獲取外部數據時,在程序中應用weak references是非常理想的。如果利用引用隊列創建了某一線程的weak reference,那么當線程不再具有強獲取能力時,應用程序得到通知,根據此通知,應用程序才能執行相關數據對象的清除工作。
            
            當內存管理器未發現strong references 和 soft references 時,我們稱對象具有弱獲取能力,即在到達該對象的路徑中至少包含一個weak reference。程序中weak references被清除一段時間后,弱獲取對象被收尾器收集。由此也可以看出,soft reference和weak reference之間的區別在于,應用soft reference時,內存管理器利用算法決定是否創建弱獲取對象,而應用weak reference時,內存管理器必須創建次獲取對象。
            
            引用對象鏈
            
            當到達某一對象的路徑中含有多個引用對象時,就構成了引用對象鏈。內存管理器按照由強到弱的順序處理引用對象,具體處理步驟包括:Soft references、 Weak references、Finalization、Phantom references和創建對象五個部分。
            
            當內存管理器未發現前三種對象引用時,我們稱對象具有虛獲取能力,即在到達該對象的路徑中至少包含一個phantom reference。虛引用對象直接被收尾器收集,而不被重新創建。當內存管理器發現只有phantom references時,對象就將處于等候phantom reference狀態,應用程序向引用隊列發出通知,然后對虛引用對象調用clear()方法,將其引用域設置為null,最后對不可獲取對象執行收集清除處理任務。
            
            通常,對象所具有的獲取能力與引用對象集合直接路徑中的最弱連接者相同。據此可以看出:
            
            圖2(a)中,虛引用對象具有強獲取能力,其它對象均具虛獲取能力;
            
            (b)中虛引用對象和弱引用對象均具強獲取能力,故次引用對象和對象集合具有若獲取能力;
            
            (c)中虛引用對象、弱引用對象和次引用對象均具強獲取能力,那么對象集合則具次獲取能力。
             
            圖2 引用對象鏈
            小結
            ● 引用對象API是Java2平臺中的特色之一。
            
            ● 在程序中使用引用對象API不但可以在一定程度上控制內存管理器,實現內存自動管理,還可以提高程序的穩定性和安全性。
            
            ● 引用對象鏈中各個對象的獲取能力與整個鏈相關。

          posted @ 2006-11-29 14:08 Zou Ang 閱讀(452) | 評論 (0)編輯 收藏

          今天在宿舍,用Axis來弄了個最簡單的Web Service.先來講下怎么安裝和部署.
          首先,去Apache的網站下載Axis,我沒有下載Axis2,因為據說Axis2和Axis有比較多的不同,所以還是覺得先用以前的吧.
          下載好了以后,把axis下的webapp文件夾中的axis放到tomcat的webapp目錄下,然后啟動tomcat,輸入:http://localhost:8080/axis/,如果成功會看到歡迎頁面.
          然后寫一個Java類:
          import?java.util.HashMap;
          import?java.util.Map;

          /**
          ?*?2006-11-28
          ?*?
          @author?Zou?Ang
          ?*?Contact?<a?href?="mailto:richardeee@gmail.com">Zou?Ang</a>
          ?
          */

          public?class?BookTitleService?{

          ????Map
          <String,String>?books;
          ????
          public?BookTitleService(){
          ????????books?
          =?new?HashMap<String,String>();
          ????????
          ????????books.put(
          "0130895601","Advanced?Java?2?Platform?How?to?Program");
          ????????books.put(
          "0430895717","C++?How?to?Program,Third?edition");
          ????????books.put(
          "0430293636","Visual?Basic.?NET?How?to?Program");
          ????????books.put(
          "0130923613","Python?How?to?Program");
          ????}

          ????
          ????
          public?String?getBookTitle(String?ISBN){
          ????????
          return?books.get(ISBN);
          ????}

          }
          然后把BookTitleService.java更名為BookTitleService.jws,把更改后的文件放到%CATALINA_HOME%/webapps/axis/%包結構(比如org/apache/..)/目錄下
          ,我的是D:\apache-tomcat-5.5.17\apache-tomcat-5.5.17\webapps\axis\org\zsu\zouang\BookTitleService.jws,注意,這樣放好了jws文件后,把java類中的包名要刪除,做完了以后重新啟動tomcat,在地址欄輸入http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws,如果Web服務部署成功就會有頁面顯示的了,點Click to See WSDL后,可以看到:
          ?<?xml?version="1.0"?encoding="UTF-8"??>?
          -?
          <wsdl:definitions?targetNamespace="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?xmlns:apachesoap="http://xml.apache.org/xml-soap"?xmlns:impl="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?xmlns:intf="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/"?xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"?xmlns:wsdlsoap="http://schemas.xmlsoap.org/wsdl/soap/"?xmlns:xsd="http://www.w3.org/2001/XMLSchema">
          -?
          <!--?
          WSDL?created?by?Apache?Axis?version:?1.4
          Built?on?Apr?22,?2006?(06:55:48?PDT)

          ??
          -->?
          -?
          <wsdl:message?name="getBookTitleRequest">
          ??
          <wsdl:part?name="ISBN"?type="xsd:string"?/>?
          ??
          </wsdl:message>
          -?
          <wsdl:message?name="getBookTitleResponse">
          ??
          <wsdl:part?name="getBookTitleReturn"?type="xsd:string"?/>?
          ??
          </wsdl:message>
          -?
          <wsdl:portType?name="BookTitleService">
          -?
          <wsdl:operation?name="getBookTitle"?parameterOrder="ISBN">
          ??
          <wsdl:input?message="impl:getBookTitleRequest"?name="getBookTitleRequest"?/>?
          ??
          <wsdl:output?message="impl:getBookTitleResponse"?name="getBookTitleResponse"?/>?
          ??
          </wsdl:operation>
          ??
          </wsdl:portType>
          -?
          <wsdl:binding?name="BookTitleServiceSoapBinding"?type="impl:BookTitleService">
          ??
          <wsdlsoap:binding?style="rpc"?transport="http://schemas.xmlsoap.org/soap/http"?/>?
          -?
          <wsdl:operation?name="getBookTitle">
          ??
          <wsdlsoap:operation?soapAction=""?/>?
          -?
          <wsdl:input?name="getBookTitleRequest">
          ??
          <wsdlsoap:body?encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"?namespace="http://DefaultNamespace"?use="encoded"?/>?
          ??
          </wsdl:input>
          -?
          <wsdl:output?name="getBookTitleResponse">
          ??
          <wsdlsoap:body?encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"?namespace="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?use="encoded"?/>?
          ??
          </wsdl:output>
          ??
          </wsdl:operation>
          ??
          </wsdl:binding>
          -?
          <wsdl:service?name="BookTitleServiceService">
          -?
          <wsdl:port?binding="impl:BookTitleServiceSoapBinding"?name="BookTitleService">
          ??
          <wsdlsoap:address?location="http://localhost:8080/axis/org/zsu/zouang/BookTitleService.jws"?/>?
          ??
          </wsdl:port>
          ??
          </wsdl:service>
          ??
          </wsdl:definitions>
          這樣,一個最最簡單的Web Service就部署成功了.

          posted @ 2006-11-28 21:00 Zou Ang 閱讀(755) | 評論 (1)編輯 收藏

               摘要: Lazy Initialization and the DAO pattern with Hibernate and Spring的翻譯,照顧些不喜歡讀英文的朋友,請指導  閱讀全文

          posted @ 2006-11-27 20:03 Zou Ang 閱讀(2163) | 評論 (2)編輯 收藏

               摘要: 由于要求在項目中使用泛型的DAO,所以上網Google了一下,找到了IBM的一篇文章。文章講得不錯,但是有些地方不清楚,如果完全按照那篇文章可能還會遇到一些困難。所以寫了這篇文章,解釋如何在項目中加入泛型的DAO實現。 首先是總的類關系的UML圖:然后是在配置文件中的關系圖:??其中,IStaffDao是我們自己定義的接口,這個接口類似: publ...  閱讀全文

          posted @ 2006-11-26 21:08 Zou Ang 閱讀(5441) | 評論 (8)編輯 收藏

          測試-通過Word 2007發布Blog

          ?

          聽說可以用Word 2007發布Blog,測試一下,不過不知道有沒有代碼顯示的功能了.

          Microsoft Office Word 2007?Beta 2新增了Blog發布功能,這個一直讓人期待的功能終于可以體驗一下了。

          經過今天的努力,博客園現在已經支持通過Microsoft Office Word 2007發布Blog。

          該文章就是通過Word 2007發布。

          具體配置方法如下:

          1. 點擊選擇左上角的按鈕,選擇Publish>Blog。
          2. 點擊Manage Accounts,在Blog Accounts窗口中點擊New,
          3. 在BlogHost中選擇Other。
          4. 在API中選擇MetaWeblog。
          5. 在UserName與Password中輸入你的Blog帳戶與密碼。
          6. 在Blog Post Url地址中輸入MetaWeblog訪問地址(在Options ? Configure 頁面中可以查到),格式為:你的Blog主頁地址/services/metaweblog.aspx。

          配置完成后,你可以體驗從Word 2007發布Blog的感覺。

          以后就不用被Web編輯器排版和提交失敗的問題所困擾了。

          不過不能上傳圖片

          posted @ 2006-11-25 21:59 Zou Ang 閱讀(357) | 評論 (2)編輯 收藏

          本來沒問題的代碼,一整合就出錯了,煩

          posted @ 2006-11-25 20:10 Zou Ang 閱讀(194) | 評論 (0)編輯 收藏

          以前很喜歡在Eclipse中使用CTRL+ALT+F來進行自動排版.不過今天發現以后要絕對慎用這項功能,尤其是在xml和html中,盡量不要使用..因為今天發現,本來運行得很好的配置文件,只要一自動排版,就會報出一些莫名其妙的錯誤,而且這種錯誤是你檢查配置檢查不出來的,因為配置看起來根本就沒變!!
          猜測是由于在xml的entity中加了空格或者換行符的緣故.

          posted @ 2006-11-25 13:52 Zou Ang 閱讀(2355) | 評論 (1)編輯 收藏

               摘要: 趨向采用 SOA

            軟件開發領域的主要發展趨勢是從傳統軟件體系結構過渡到面向服務的體系結構 (SOA)。在傳統軟件體系結構中,將項目視為單個新應用程序的交付。在SOA中,將項目視為集成服務的交付——一些是新建的,一些是現有的。無論其規模和預算如何,幾乎所有信息技術(Information Technology,IT)部門當前都在進行過渡到SOA的工作。您可能已經讀過多篇關于SOA采用、成熟度模型和實現的文章了。本文將描述在組織采用SOA或過渡到更高的SOA成熟度水平的過程中,您的IT團隊成員中所需的一組新角色及其各自的職責。

            在形成SOA團隊時,最大的范式轉換是從組合應用程序交付過渡到服務交付。傳統軟件開發人員通常構建應用程序中的一個模塊,或典型的三層體系結構中的單個層的一部分。開發人員的一個例子就是在模型-視圖-控制器(Model-View-Controller,MVC)體系結構中負責控制器或模型層的人員。在SOA環境中,這些開發人員現在負責服務實現。他們并不需要知道何時、如何或為什么調用服務以及誰調用服務。他們所關心的就是,服務進行什么  閱讀全文

          posted @ 2006-11-25 09:09 Zou Ang 閱讀(237) | 評論 (0)編輯 收藏

               摘要: 嘗試使用JDOM  閱讀全文

          posted @ 2006-11-24 21:10 Zou Ang 閱讀(231) | 評論 (0)編輯 收藏

               摘要: 下午嘗試使用Rico,實現了漸變和拖拽.主要是比較在意它的效果功能..沒太多了解對Ajax的支持.下面是漸變的代碼
          Open Rico:OpenRico.org  閱讀全文

          posted @ 2006-11-24 16:17 Zou Ang 閱讀(364) | 評論 (0)編輯 收藏

          僅列出標題
          共4頁: 上一頁 1 2 3 4 下一頁 
          主站蜘蛛池模板: 咸丰县| 手游| 榕江县| 革吉县| 郎溪县| 华宁县| 芜湖市| 西华县| 太保市| 南开区| 巨鹿县| 克什克腾旗| 天峨县| 开阳县| 连州市| 安达市| 商南县| 商河县| 乐清市| 囊谦县| 阳信县| 隆化县| 司法| 新绛县| 广州市| 榆中县| 榆社县| 金门县| 绥江县| 武强县| 常山县| 仙游县| 左贡县| 亳州市| 兴义市| 鹤壁市| 永安市| 怀来县| 巧家县| 枣阳市| 泗阳县|