




已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀
(產業(yè)經濟學專業(yè)論文)基于JBOSS平臺的J2EE應用優(yōu)化研究與實踐.pdf.pdf 免費下載
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
對外經濟貿易大學碩士論文 摘要 本論文的研究目的是希望通過對j 2 e e 技術體系的深入研究,總結出在開發(fā) j 2 e e 應用的時候容易出現的性能問題,并結合實例提出相應的解決方案。這些 問題和解決方案都具有普遍的適應性,因此可供開發(fā)一般的j 2 e e 項目所借鑒。 j 2 e e 是由s u n 公司推出的一種全新概念的模型,目前已成為企業(yè)級應用, 電子商務交易的主要開發(fā)平臺。j 2 e e 已經被證明是個穩(wěn)定的、可擴展的、成 熟的平臺,它具有平臺獨立的特性。但是做為j 2 e e 技術的核心之一的e j b ,其 性能問題一直受到廣泛的質疑,普遍被認為執(zhí)行效率低下。正是由于j 2 e e 在性 能上的缺陷,因此我們在開發(fā)j 2 e e 應用時,必須重視應用的優(yōu)化工作,努力做 到即可以充分利用j 2 e e 的種種優(yōu)勢,又可以使項目高效的運行。 論文首先從j a v a 語言的內存管理出發(fā),深入研究了j a v a 語言內存分配及 回收的機制,重點研究了j a v a 開發(fā)中可能會出現的內存泄露問題。并提出了避 免內存泄露和如何檢測內存泄露的方法。其次,本文深入研究了e j b 技術的原理, 并結合j b o s s 平臺研究如何提高e j b 性能的問題。第三,本文對j 2 e e 集群技術 做了深入的分析,并對流行的各種集群方式的性能加以比較,提出了一種比較理 想的集群方式第四,本文對現有的多種w e b 層負載均衡方式加以研究,發(fā)現它 們都不能真實的按照各服務器結點的負載均衡情況均勻的分配請求。為此,筆者 提出基于負載檢測的負載均衡方案,其核心是給決定負載大小的各因素分配一定 的權重,在每次請求轉發(fā)時,各服務器結點按照事先分配的權重對其實際負載的 大小予以量化,并將量化后的結果反饋到負載均衡器,由負載均衡器挑選其中負 載最輕的服務器轉發(fā)請求第五,本文最后將前面所研究的種種優(yōu)化技術綜合運 用到筆者目前所開發(fā)的項目中去,并取得了一定的效果。 關鍵詞;j 2 e ej b o s s優(yōu)化 對外經濟貿易大學碩士論文 t h eo b j e c t so ft h i sp a p e ri st oc o n c l u d es o m em e t h o d st oi n c r e a s et h ep e f o l m a n c co f j 2 e e a p p l i c a t i o na tt h eb a s i so f r e s e a r c h i n gt h e a r c h i t e c h e ro f j 2 e e p l a t f o r m j 2 e e s p e c i f i c a t i o nm a k e st h en t i e re n t e r p r i s ea p p l i c a t i o nd e v e l o p m e n tm u c h m o l ee a s i e r , a n dt h es e r v e r sb a s e do ni to f f e rt h er u n n i n ge n v i r o n m e n ta n ds y s t e ms e r - s e r v i c e ss u c ha st r a n s a c t i o n , d a t a b a s ea c c e s s i n g , j m sa n ds e c u r i t ys e r v i c e t h em a j o r a d v a n t a g eo f j 2 e e i si t s “w r i t eo n c e ,r u na n y w h e r e ”j a v ac o m p o n e n t s ,w h i c hm e a n s t h a ti ti si n d e p e n d e n to ft h eo p e r a t i o ns y s t e m ,a n dt h ej 2 e ep r o d u c t i o n se a rb ed e p l o - y e dt oa n yj 2 e es e r v e r si n c l u d i n gt h es e r v e ri nn ts y s t e me n v i r o n m e n t b e c a u s et h e j 2 e et e c h n o l o g yh a ss om a n ym e r i t s s ot h et e c h n o l o g yo fj 2 e ep l a t f o r mg r a d u a l l y b e c o m et h ef a c ts t a n d a r do fe n t e r p r i s ec o m p o n e n td e p l o y m e n t b u t , a st h ec o r eo fj 2 e e p l a f f o r m , f j bt e c h n o l o g yi st h i n k e da s al o we f f i c i e n tt e c h n o l o g y b e c a n s ec j bt e c h n - o l o g ya r ed e v e l o p e da tt h eb a s i so fs e r i a l i z a t i o nt e c h n o l o g ya n dr e m o t em e t h o di n v o - c a t i o nt e c h n o l o g y s e r i a l i z a t i o ni su s e dt ot r a n s f o r mo b j e c t sb e t w e e np r o c e s s e s b u tt h e i m p l e m e n t i o no fs e r i a l i z a t i o ni sn o td 鎬i g n e dp e f e r c t l yi nj a v ap l a t f o r m , s ot h ee f f i c i e n c yo fs e r i a l i z a t i o ni sn o ts og o o d t h es a l n ea ss e r i a l i z a t i o nt e c h n o l o g y ,t h er e m o t em e t h o di n v o c a t i o nt e c h n o l o g ya l s of a c e dt h ec r i t i c i s mo fb a dp e r f o m a n c e b e c a u s eo f t h et h e s ed i s a d v a n t a g e d e v e l o p e r so f j 2 e ea p p l i c a t i o nm u s tc a r e f u l l yd e v e l o pt h e i r w o r kt oi m p r o v et h ep e f f e r m e n c eo fj 2 e ea p p l i c a t i o n i nm yp a p e r ,f i r s t l y , ir e s e a r c h e dt h em e c h a n i s mo fj a v am e m o r ya l l o c a t i o na n d m e m o r yr e c o v e r i n g 1e m p h a s e do nt h ep r o b l e mo fm e m o r yl e a k ia n a l y s e dt h er e a s o n o fm e m o r yl e a ka n dh o wt oc h e c kt h em e m o r yl e a ka n dh o wt oa v o i dt h em e m o r y l e a k s e c o n d l y ,ir e a s e a r c h e dh o wt oi m p r o v et h ep e r f o r m a n c eo ft h ee j bc o m p o n e n t s i nj b o s s p l a t f o r m t h i r d l y ,i r e a s e a r c h e dt h e t h e o r y o fj 2 e ec l u s t e ra n dt h e h n p l e m e n t i o n s o fa l lk i n d so fc l u s t e ri nt h ej 2 e ea r c m t e c t u r ei n j b o s s p l a t f o r m f i n a l l y , ip r o p o s eal o a db a l a n c i n g f o rh t t p s e r v l e tl e v e lp o l i c ya n dm a k ei t i m p l e m e n t e d k e y w o r d s :j 2 e e ,j b o s s ,p e r f o r m a n c e r u n n 礬g 2 對外經濟貿易大學碩士論文 第一章緒論 1 1 課題的研究背景與意義 本課題主要是作者在參與了j 2 e e 平臺應用項目后的分析工作的一部分。本 課題主要研究對j 2 e e 應用進行優(yōu)化的若干技術問題。 j 2 e e 是由s u n 公司推出的_ 二種全新概念的模型,是在分布式環(huán)境中的一種 體系結構,它提供了一種基于組件的設計、開發(fā)、集成部署企業(yè)應用系統(tǒng)的方法。 j 2 e e 平臺提供了多層分布式的應用系統(tǒng)模型,可重用的組件、統(tǒng)一的安全性模 型和靈活的事務控制,基于組件的j 2 e e 企業(yè)應用具有平臺獨立性,所以不受任 何軟件產品和任何軟件廠家a p i 的限制回j 2 e e 應用已經成為企業(yè)級應用,電子 商務交易的主要開發(fā)平臺符合j 2 e e 應用標準的產品主要有b 隊公司的 i g e b l o g i c 、i b m 的w e b s p h e r e 以及開源的j b o s s 等,還有包括著名數據庫廠商 o r a c l e 、s y b a s e 在內的上百種產品。它們基本上都是應用服務器系統(tǒng),因此j 2 e e 通常指的是應用服務器平臺。j 2 e e 已經被證明是一個穩(wěn)定的、可擴展的、成熟 的平臺,它具有平臺獨立的特性。 j 2 e e 平臺獨立性包括兩個方面,一是j a v a 語言的平臺獨立性,二是j 2 e e 標準的平臺獨立性j a v a 是一種跨平臺的語言,在任何平臺上,只要有j a v a v i r t u a lm a c h i n e ( j v m ) ,就能在不同平臺上執(zhí)行同一個j a v a 程序。另外,j 2 e e 標準的平臺獨立性使得任何符合j 2 e e 標準的應用服務器之間可以共用標準的組 件開發(fā)也就是說,在w e b l 0 ( ;i c 下開發(fā)的應用,也可以移植到j b o s s 平臺下, 這樣在電子商務應用的開發(fā)中,可以任意的選擇和購買通用的組件,從而加速開 發(fā)的進程最后,j 2 e e 的平臺獨立性是應用的移植變得輕松起來。在一個j 2 e e 應用中,你可以把w e b l o g i c + o r a c l e 的應用移植到j b o s s + s y b a s e 上,不需要 改動任何源代碼。只需要進行一些不算太復雜的配置即可這也是j 2 e e 為何如 此流行的一個重要原因。 j 2 e e 技術雖然受到了廣泛的歡迎,但是做為j 2 e e 技術的核心之一的e j b , 其性能問題一直受到廣泛的質疑,主要的質疑集中在兩個方面。一是對象序列化 技術,對象序列化技術是e j b 跨平臺通迅的基礎,所有的e j b 通訊都依賴于對象 序列化技術,通過對序列化技術實現了對象在多個進程之間的復制傳遞。這本是 一個很清晰的設計,但是由于j a v a 平臺對于對象序列化的實現并不盡如人意, 序列化與反序列化的效率太低,導致對象傳輸的速度極慢。二是r m i ( 遠程方 法調用) ,e j b 限定必須遵守c o r b a 規(guī)范的r m i i i o p 技術,這種技術的原理是 通過本地的一個遠程對象代理,通過網絡上的多次通訊實現對遠程對象的方法調 謝小樂,( j 2 e e 經典實例詳解 ,人民郵電出版社,2 0 0 2 ,2 3 5 2 3 9 對外經濟貿易大學碩士論文 用,這種設計架構的初衷是隱藏對象的具體位置,可以讓對象使用者不用關心對 象的實際位置。但是這種方法的實現性能極差。由于j 2 e e 技術先天上存在這些 性能上缺陷,因此我們在開發(fā)j 2 e e 應用時,必須重視應用的優(yōu)化工作,努力做 到即可以充分利用j 2 e e 的種種優(yōu)勢,又可以使項目高效的運行。 1 2 企業(yè)計算平臺的發(fā)展概況 1 2 1 傳統(tǒng)的應用體系結構 傳統(tǒng)的應用體系結構主要有兩種c s ( c l i e n t s e r v e r ) 模式和b s 模式。 ( 1 ) c s 模式( 客戶機服務器) 模式 圖1 1c s 模式 資料來源:本研究整理 目前絕大多數網絡應用都采用這種模式,它將訪問數據庫的操作放在客戶端 執(zhí)行,即客戶應用程序直接對數據庫進行操作。一般企業(yè)的m i s 系統(tǒng)都采用這種 方式。 ( 2 ) b s 模式( 瀏覽器服務器) 模式: 一妒 客戶端瀏覽器 w c b m 務器 圖1 2a s 模式 資料來源:本研究整理 a s 模式訪問數據庫的工作交由客戶端的瀏覽器來完成。不必安裝特定的程 序。隨著i n t e r n e t i n t r a n e t 技術的發(fā)展,網絡應用中的客戶端零管理成了眾多 企業(yè)的需要,所以這種體系結構正迅速的發(fā)展起來。 1 2 2 多層應用體系結構 多層應用體系結構就是傳統(tǒng)的兩層結構的客戶端與服務器之間加入一層中 間層,我們稱之為應用層。應用程序服務器就放在該層。應用程序服務器是駐留 2 對外經濟貿易大學碩士論文 在服務器上的程序,為各種應用提供了商業(yè)邏輯。服務器可以是網絡的一個組成 部分,尤其是分布式的網絡。服務器程序為客戶機上的程序提供服務。 應用程序服務器最常用的場合是基于w e b 的三層體系結構。 第一層( 前端) :b r o w s e r 瀏覽器( t h 玳c l i e n t 瘦客戶機) ,為用戶提供 g u i 圖形接口 第二層( 中間層) ;a p p l i c a t i o ns e r v e r :應用服務器。 第三層( 后端) :d a t a b a s es e r v e r ,數據庫服務器。 應用服務器位于三層結構中的第二層,它是三層體系的集成部分,和w e b s e r v e r 聯(lián)合在一起處理客戶的請求。 應用服務器的基本功能包括: ( 1 ) 組件管理 提供管理工具來處理所有組件和運行時服務( r u nt i m es e r v i c ) 如 s e s s i o n 管理,同步異步客戶端通知,以及執(zhí)行服務器上的商業(yè)邏輯。 ( 2 ) 容錯 提供沒有任何單點錯誤的性能,定義出錯恢復的策略以防止某個對象或對象 組出現錯誤。 ( 3 ) 負載均衡 根據服務器當前負載及可用性,將請求提交給不同的服務器。 ( 4 ) 事務處理 ( 5 ) 管理控制臺m a n a g e m e n tc o n s o l e 單點圖形管理界面,用于監(jiān)控遠端客戶及服務器集群管理。 ( 6 ) 安全性 提供應用的安全性。 1 3 j 2 e e 平臺的發(fā)展情況 1 3 1 j 2 e e 的內容 j 2 e e 是s u n 公司提供的旨在為支持j a v a 語言服務器端部署而提供平臺無 關、可移植的、多用戶的、安全和標準的企業(yè)級應用平臺。j 2 e e 做為2 個規(guī)范, 包括如下幾個部分: ( 1 ) 企業(yè)級j a v a b e a n 圓( e j be n t e r p r i s ej a v a b e a n s ) :e j b 定義了如何編寫 服務器端組件。并且為服務器端組件和管理這些組件的應用服務器之間提供了標 準的協(xié)議。e j b 是j 2 e e 中的重要組成部分,并且使用了其它的j 2 e e 技術 ( 2 ) j a v a 的遠程方法調用( 跏i :r e m o t em e t h o di n v o c a t i o n ) 和r m i i i o p ( r e m o t em e t h o di n v o c a t i o no v e rt h ei n t e r n e ti n t e r - o r bp r o t o c 0 1 ) r m i ( 蛩( 美) 斯瑞格奈斯。( ( 精通e j b 。電子工業(yè)出版社,2 0 0 6 。5 6 - 5 9 3 對外經濟貿易大學碩士論文 是j a v a 語言自身提供的用來在分布式對象之間通信的機制,例如運行在兩個不 同的機器上的不同的對象之間 ( 3 ) j a v a 命名和目錄接口( j n d i ,j a v an a m i n ga n dd i r e c t o r y i n t e r f a c e ) :j n d i 用來訪問命名和目錄系統(tǒng)。 ( 4 ) j a v a 數據庫連接( j d b c ,j a v ad a t a b a s ec o n n e c t i v i t y ) :j d b c 是j a v a 訪問關系型數據庫的a p i ( 5 ) j a v a 事務處理a p i ( j t a ,j a v at r a n s c a t i o na p i ) 和j a v a 事務處理服務 ( j t s ,j a v at r a n s c a t i o ns e r v i c e ) :j t a 和j t s 規(guī)范為組件提供了可靠的事 務處理支持。 ( 6 ) j a v a 消息服務( j m s ,j a v am e s s a g es e r v i c e ) :j m s 允許j 2 e e 應用通過 消息進行通信。 ( 7 ) j a v as e r v l e t :s e r v l e t 是一些用來擴展w e b 服務器功能的網絡組件,它 基于請求響應機制。 ( 8 ) j a v as e r v e rp a g e ( j s p ) 等。 i 3 2 j 2 e e 應用服務器 目前流行的應用服務器如w e b l o g i c ,w e b s p h e r ea p p s e r v e r ,j b o s s ,o r a c l e 9 i a s 等等,都是符合j 2 e e 標準的應用服務器,很好地支持了e j b 、i n d i 等j 2 e e 核心技術。 l第一層第二層第三層l 竺竺竺) 7 、 p 一i | i 曦 之曲容器 l 麓i 汐 毒 客戶端 r 、竺竺竺夕 ( 一- - - - - :二: w e b 容器 = 二) 圖1 3j 2 e e 組件模型 資料來源:本研究整理 j 2 e e 定義了下列組件; ( 1 ) 客戶層:a p p l i c a t i o n ( 2 ) w e b 層:j a v as e r v l e t 和j s p 組件 4 對外經濟貿易大學碩士論文 ( 3 ) 業(yè)務處理層:e j b 其結構如圖1 3 所示,下面簡要介紹各元素的主要功能: ( 1 ) e j b 容器 e n t e r p r i s ej a v ab e a n 實例運行于一個e j b 容器 當中。該容器是控制e j b 并為其提供重要的系統(tǒng)級服務的環(huán)境。即你可以不用自己開發(fā)這些服務,而完全 集中在e j b 的業(yè)務邏輯中。該容器為e j b 提供了以下一些服務: a ) 事務管理( t r a n s c a t i o nm a n a g e m e n t ) 事務是企業(yè)級計算中的關鍵部分,j a v at r a n s c a t i o na p i ( j t a ) 給開發(fā)人員 提供了一組簡單的面向事務命令,在j a v a 代碼中可以輕松可靠地控制事務這 些事務包括e j b 方法調用,j d b c 數據庫操作、j j i s 消息服務系統(tǒng)以及對任何其它 提供事務支持的計算源操作。 b ) 安全( s e c u r i t y ) 容器允許只有被授權的用戶才能激活e j b 的方法。每一個客戶屬于一個特別 的角色,而每個角色只允許激活特定的方法,你應該在e j b 的部署描述中聲明角 色和可激活的方法。由于這種聲明的方法,你可以不必編寫加強安全性的規(guī)則。 c ) 遠程客戶連接( r e m o t ec 1 l e n tc o n n e c t i v i t y ) 容器負責管理在客戶端及e j b 之間的底層交流。e j b 被創(chuàng)建后,客戶端可以 像在一個j v m 中一樣對e j b 激活其方法。 d ) 生存周期管理 一個e j b 在其生存周期中會經歷幾個階段。容器創(chuàng)建e j b ,并在可用實例池 與活動狀態(tài)中移動它,而最終將其中容器中移去即使可以用e j b 的c r e a t e 和 r e m o v e 方法,容器也會在后臺自動執(zhí)行。 e ) 數據庫連接池 數據庫連接池是一個有價值的資源。獲取數據庫連接是一項費時的工作i 而 且連接數據非常有限容器通過管理連接池來緩和這些問題e j b 可從池中獲取 連接,在b e a n 釋放連接后供其它連接使用。 ( 2 ) w e b 容器 w e b 容器是j s p 和s e r v l e t 的運行環(huán)境,來自客戶端的請求,首先要被w e b 容器所接收,通過j s p 或s e r v l e t 來調用e j b 完成業(yè)務功能。 1 3 3 j 印s s 應用服務器 j b o s s 是一個j a v a 開源、集成和開發(fā)基于j 2 e e 的完整服務實現。j b o s s 提 供j b o s s s e r v e r 、基本的e j b 容器及j m 】( 框架。它也為j m ) 【系統(tǒng)提供j b o s s 岫。 為j t a 事務提供j b o s s t x ,為c 髓持久化提供j b o s s c m p ,為基于j 從s 的安全性 暢紹方, ,科學出版社,2 0 0 2 1 9 2 - 1 9 8 5 對外經濟貿易大學碩士論文 提供j b o s s s x ,為j c a 提供j b o s s c x 。為支持w e b 組件,比如s e r v l e t 和j s p , j b o s s 提供了抽象集成層。而這些抽象層的集成服務實現可以由第三方s e r v l e t 引掣提供,比如t o m c a t 和j e t t l r 。j b o s s 使得開發(fā)者能夠通過j 掀混合應用這些 組件,即借助于替換j u x 兼容的組件實現完成這些任務。同時,這些j b o s s 組件 之問甚至不會產生任何影響。因此,j a o s s 現在全部都是模塊化的 1 4 本文研究內容 本文主要從以下幾個方面對j 2 e e 應用的優(yōu)化進行研究: ( 1 ) j a v a 應用的內存管理,提出了如何防止和檢查內存泄漏問題 ( 2 ) 對e j b 的原理進行分析,對如何通過配置j b o s s 服務器提高j 2 e e 應用的 效率進行了研究。 ( 3 ) 深入研究了j 2 e e 應用的各種集群技術。 ( 4 ) 提出了基于負載檢測的負載均衡算法,并予以實現。 ( 5 ) 將多種優(yōu)化技術應用到筆者所開發(fā)的廢1 日家電回收信息管理系統(tǒng)當中 去,對優(yōu)化效果予以檢驗。 6 對外經濟貿易大學碩士論文 第二章j a v a 內存管理 內存管理話題在c 或c + + 程序設計中討論得相對較多,因為在c 與c + + 程序 中,需要開發(fā)人員自己申請并管理內存,開發(fā)人員可以申請借用系統(tǒng)內存并且 負責釋放歸還系統(tǒng)內存,如果“只借不還”的話,就會造成系統(tǒng)內存泄漏的問 題,在j a v a 程序中,這些工作由j a v a 虛擬機( s v m ) 負責處理。所有內存的申 請、分配、釋放都有由j 1 i ,l i 負責完成。因此,開發(fā)人員就省去了這部分的工作, 不過這并不意味著開發(fā)人員可以完全依賴子j 的內存管理功能,如果開發(fā)人員 在開發(fā)過程中完全不理會內存的闖題,那么你所開發(fā)的應用的性能,很可能不是 最優(yōu)的。因為無論配置多么優(yōu)良的硬件環(huán)境其自身的資源都是有限的,而內存又 是硬件環(huán)境資源中重要的一部分,因此如果說如果開發(fā)人員開發(fā)的j a v a 應用沒 能有效,合理地使用系統(tǒng)內存,那么就不可能具備較高的性能。下面對在j a v a 應用開發(fā)中的內存管理相關的技術做一些探討。 2 。1 垃圾回收 j a v a 的內存管理就是對象的分配和釋放問題。在j a v a 中,程序員需要通過 關鍵字n e w 為每個對象申請內存空間( 基本類型除外) ,所有的對象都在堆 ( h e a p ) 中分配空間。另外,對象的釋放是由垃圾回收( g a r b a g ec o l l e c t i o ng c ) 決定和執(zhí)行的在j a v a 中,內存的分配是由程序完成的,而內存的釋放是由g c 完成的,這種收支兩條線的方法確實簡化了程序員的工作。但同時,它也加重了 j v u 的工作。這也是j a v a 程序運行速度較慢的原因之一因為,g c 為了能夠正 確釋放對象,g c 必須監(jiān)控每一個對象的運行狀態(tài),包括對象的申請、引用、被 引用、賦值等,g c 都需要進行監(jiān)控。監(jiān)視對象狀態(tài)是為了更加準確地、及時地 釋放對象,而釋放對象的根本原則就是該對象不再被引用。 垃圾回收( g a r b a g ec o l l e c t i o ng c ) 回是j a v a 程序設計中內存管理的核心 概念,j a v a 虛擬機( j v m ) 的內存管理機制被稱為垃圾回收機制。因此,掌握如 何在開發(fā)j a v a 應用時合理地管理內存,首先應該了解j a v a 虛擬機的內存管理機 制:垃圾回收機制,不了解垃圾回收具體實現機制,j a v a 程序設計中的內存管 理就無從談起。 那么在j v m 運行環(huán)境中什么樣的對象才是垃圾呢? 下面我們給出了在j v m 環(huán)境中垃圾對象的定義: 一個對象創(chuàng)建后放置在j v m 的堆內存中( h e a p ) ,當永遠不再引用這個對象 時,它將被j 在堆內存( h e a p ) 中回收。被創(chuàng)建的對象不能再生,同時也沒有辦 法通過程序語句釋放他們。 王森, ) ,麥格羅希爾國際出舨社2 0 0 1 1 0 2 - 1 0 4 7 對外經濟貿易大學碩士論文 我們也可以這樣給j v m 中的垃圾對象下定義: 當對象在3 v m 運行空間中無法通過根集合( r o o ts e t ) 到達時,這個對象就 被稱為垃圾對象。根集合是由類中的靜態(tài)引用域與本地引用域組成的。 為了更好理解g c 的工作原理,我們可以將對象考慮為有向圖的頂點,將引 用關系考慮為圖的有向邊,有向邊從引用者指向被引對象。另外,每個線程對象 可以作為一個圖的起始頂點,例如大多程序從m a i n 進程開始執(zhí)行,那么該圖就 是以m a i n 進程頂點開始的一棵根樹。在這個有向圖中,根頂點可達的對象都是 有效對象,g c 將不回收這些對象。如果某個對象( 連通予圖) 與這個根頂點不可 達( 注意,該圖為有向圖) ,那么我們認為這個( 這些) 對象不再被引用,可以被 g c 回收。 以下,我們舉一個例子說明如何用有向圖表示內存管理。對于程序的每一個 時刻,我們都有一個有向圖表示j v m 的內存分配情況。圖2 1 的右圖,就是左邊 程序運行到第6 行的示意圖。 d a s s t e ,h p u b l i cs t a t i cv o i dm 扭牮t l i n g a d o b j e c to l = n e w o b j d ; o t l j e c t0 2 _ w o 埒喲: 0 2 = e l ; 此行為筇6 行 該圖描述了第6 行的內存管理的有向圖 o 巧2 是第二次申請的對象,此時為可回收對象 圖2 1 垃圾對象的產生 資料來源;h t t p :榔,z h u j i a n g r o a d c o m h t m l s o f t s 2 9 5 7 h t m l 在這個例子中m a i n o 函數中的o l 與0 2 是對象的引用( 指向對象的指針) , 構成了根集合,它們存在于給m a i n 函數的堆棧中,o b j l 。o b j 2 是對象的實例, 它們創(chuàng)建于堆中。變量0 2 最初指向堆中的o h j 2 對象,當執(zhí)行0 2 = 0 1 后,0 2 就 指向了o l ,這時,從根集合出發(fā),沒有路徑可以到達o h j 2 ,這時,o h j 2 就成了 垃圾對象,可以被回收這里有一個問題,即然o h j 2 對象已經是垃圾對象,那 么j v m 何時會對它進行回收昵? 要弄清楚這個問題,必須進一步詳細了解垃圾回 收的具體機制。 2 1 1 垃圾回收機制 首先,必須先了解一下堆內存的概念堆內存是j 管理的一種內存類型, j v m 管理的內存類型有兩種:堆內存與棧內存。堆內存是用來存放對象的實例的, 也就是說任何由n e w 方法產生的對象實例和數組,都將被放入堆中一個j v m 實例唯一對應一個堆,堆是被所有線程所共享的。棧內存是用來存儲程序代碼中 8 對外經濟貿易大學碩士論文 聲明為靜態(tài)或非靜態(tài)的方法。棧內存是屬于線程私有的,j v m 會為每個正在運行 的線程一個棧,而j 硼對棧的操作是以楨為單位進行的,楨中保存的私有變量, 操作數等 堆內存在j v m 啟動的時候被創(chuàng)建,堆內存中所存儲的對象可以被j 1 m 自動回 收,不能通過其他外部手段回收,也就是說開發(fā)人員無法通過添加相關代碼的手 段回收位于堆內存中的對象。只能由j v m 通過特定的垃圾回收機制來進行回收。 常用的垃圾回收機制有以下幾種; ( 1 ) 標記一清除收集器 這種收集器首先遍歷對象圖并標記可到達的對象,然后掃描堆棧以尋找未標 記對象并釋放它們的內存。這種收集器一般使用單線程工作并停止其他操作 ( 2 ) 標記一壓縮收集器 有時也叫標記一清除一壓縮收集器,與標記一清除收集器有相同的標記階 段在第二階段,則把標記對象復制到堆棧的新域中以便壓縮堆棧。這種收集器 也停止其他操作。 c 3 ) 復制收集器 這種收集器將堆棧分為兩個域,常稱為半空間。每次僅使用一半的空間,j v n l 生成的新對象則放在另一半空間中g c 運行時,它把可到達對象復制到另一半 空間,從而壓縮了堆棧。這種方法適用于短生存期的對象,持續(xù)復制長生存期的 對象則導致效率降低 ( 4 ) 增量收集器 增量收集器把堆棧分為多個域,每次僅從一個域收集垃圾。這會造成較小的 應用程序中斷。 ( 5 ) 分代收集器 這種收集器把堆棧分為兩個或多個域,用以存放不同壽命的對象。j v m 生成 的新對象一般放在其中的某個域中過一段時聞。繼續(xù)存在的對象將獲得使用期 并轉入更長壽命的域中。分代收集器對不同的域使用不同的算法以優(yōu)化性能。 ( 6 ) 并發(fā)收集器 并發(fā)收集器與應用程序同時運行這些收集器在某點上( 比如壓縮時) 一般 都不得不停止其他操作以完成特定的任務,但是因為其他應用程序可進行其他的 后臺操作,所以中斷其他處理的實際時問大大降低。 ( 7 ) 并行收集器 并行收集器使用某種傳統(tǒng)的算法并使用多線程并行的執(zhí)行它們的工作。在多 c p u 機器上使用多線程技術可以顯著的提高j a v a 應用程序的可擴展性。 9 對外經濟貿易大學碩士論文 2 1 2 j w 調優(yōu) 下面介紹s u nh o t s p o t l 4 1 使用分代收集器,它把堆分為三個主要區(qū)域睜; 新域,舊域以及永久域。j 生成的所有新對象放在新域中一旦對象經歷了一 定數量的垃圾收集循環(huán)后,便獲得使用期并進入舊域。在永久域中j v m 則存儲 c l a s s 和m e t h o d 對象。就配置而言,永久域是一個獨立域并且不認為是堆的一 部分 下面介紹如何控制這些域的大小??墒褂靡粁 m s 和- x m x 控制整個堆的原始大 小或最大值。 下面的命令是把初始大小設置為1 2 8 m : j a v a - x m s l2 8 m - x m x 2 5 6 m 為控制新域的大小,可使用- x x :n e w r a t i o 設置新域在堆中所占 的比例。 下面的命令把整個堆設置成1 2 8 m 。新域比率設置成3 ,即新域與舊域比例 為1 :3 ,新域為堆的1 4 或3 2 m ; j a v a - x m s l2 8 m - x m x l2 8 m 锨:n e w r a t i o = 3 可使用- x x :n e w s i z e 和一x x :m a x n e w s i z e 設置新域的初 始值和最大值 下面的命令把新域的初始值和最大值設置成6 4 m : j a v a - x m s 2 5 6 m - x m x 2 5 6 m - x m n 6 4 m 永久域默認大小為4 m 。運行程序時,j v m 會調整永久域的大小以滿足需要。 每次調整時,j v m 會對堆進行次完全的垃圾收集。 默認狀態(tài)下,h o t s p o t 在新域中使用復制收集器。該域一般分為三個部分。 第一部分為e d e n ,用于生成新的對象。另兩部分稱為救助空間,所有新鉍建的 對象都在e d e n 區(qū)中分配空間,當e d e n 充滿時,j - v m 就要做可達性測試,主要 任務是檢測有哪象對象由根集合出發(fā)是不可到達的,這些對象就可以被j - v a 回 收,并把所有可到達對象復制到當前的f r o m 救助空間。一旦當前的f r o m 救助空 問充滿,j v m 則會再次做可達性測試,并把可到達對象復制到當前的t o 救助空 間。f r o m 和t o 救助空間互換角色維持活動的對象將在救助空間不斷復制,直 到它們獲得使用期并轉入舊域。使用x x :s u r v i v o r r a t i o 可控制新域子空間的大 小 聯(lián)同n e w r a t i o n 一樣,s u r v i v o r r a t i o n 規(guī)定某救助域與e d e n 空間的比值。 比如,以下命令把新域設置成6 4 m ,e d e n 占3 2 m ,每個救助域各占1 6 m : j a v a - x m s 2 5 6 m - x m x 2 5 6 m - x m n 6 4 m - x x :s u r v i v o r r a t i o n = 2 默認狀態(tài)下h o t s p o t 對新域使用復制收集器,對舊域使用標記一清除一壓縮 林勝利,王坤茹,盂海利,j v 優(yōu)化編程 電子工業(yè)出版社。2 0 0 2 ,1 0 1 1 0 7 l o 對外經濟貿易大學碩士論文 收集器。在新域中使用復制收集器有很多意義,因為應用程序生成的大部分對象 是短壽命的。理想狀態(tài)下,所有過渡對象在移出e d e n 空間時將被收集。如果能 夠這樣的話,并且移出e d e n 空間的對象是長壽命的,那么理論上可以立即把它 們移進舊域,避免在救助空間反復復制。但是,應用程序不能適合這種理想狀態(tài), 因為它們有一小部分中長壽命的對象。最好是保持這些中長壽命的對象并放在新 域中,因為復制小部分的對象總比壓縮舊域廉價。為控制新域中對象的復制,可 用x x :t a r g e t s u r v i v o r r a t i o 控制救助空間的比例( 該值是設置救助空間的使用比 例。如救助空間為1m ,該值5 0 表示可用5 0 0 k ) 。該值是一個百分比,默認值 是5 0 。當較大的堆棧使用較低的s r u v i v o r r a t i o 時,應增加該值到8 0 至9 0 ,以 更好利用救助空間。用- x x :m a x t e n u d n gt h r e s h o l d 可控制上限。 為防止所有的復制全部發(fā)生以及希望對象從e d e n 擴展到舊域,可以把 m a x t e n u d n gt h r e s h o l d 設置成0 。設置完成后,實際上就不再使用救助空間了, 因此應把s u r v i v o r r a t i o 設成最大值以最大化e d e n 空間,設置如下: j a v a - x x :m a x t e n u r i n g t h r e s h o l d = 0 - x x :s u r v i v o r r a t i o = 5 0 0 0 0 2 2 j a v a 中的內存泄漏 從上面對j a v a 垃圾回收機制的分析中可以看出,j a v a 對內存的管理完全是 由虛擬機自動管理的,不需要開發(fā)人員的人工干預,但是并不意味著垃圾回收機 制是萬能的,因為在堆中分配的對象只要還被引用,那么垃圾回收機制就不會對 它進行回收實際上,如果開發(fā)人員稍有不慎,會造成一些對象雖然不再需要, 但是對它的引用并沒有釋放,這些仍然被引用但是實際上已經不再使用的對象就 會造成內存的泄漏。下面,我們就可以描述什么是內存泄漏。在j 8 v a 中,內存 泄漏就是存在一些被分配的對象,這些對象有下面兩個特點,首先,這些對象是 可達的,即在有向圖中,存在通路可以與其相連;其次,這些對象是無用的,即 程序以后不會再使用這些對象。如果對象滿足這兩個條件,這些對象就可以判定 為j a v a 中的內存泄漏,這些對象不會被g c 所回收,然而它卻占用內存。 在c + + 中,內存泄漏的范圍更大一些有些對象被分配了內存空間,然后卻不可 達,由于c + + 中沒有g c ,這些內存將永遠收不回來在j a v a 中,這些不可達的 對象都由g c 負責回收,因此程序員不需要考慮這部分的內存泄露。 通過分析。我們得知,對于c 什,程序員需要自己管理邊和頂點,而對于j a v a 程序員只需要管理邊就可以了( 不需要管理頂點的釋放) 通過這種方式,j a v a 提高了編程的效率。 對外經濟貿易大學碩士論文 c + + 中內 存泄漏 j a v a 中內 存泄漏 圖2 2 垃圾對象示意圖 資科來源:h t t p :f a v o d b k 2 0 0 8 c o m a b s t r a c t 1 0 0 0 0 0 1 5 7 0 p h p h t m l 因此,通過以上分析,我們知道在j a v a 中也有內存泄漏,但范圍比c + + 要 小一些。因為j a v a 從語言上保證,任何對象都是可達的,所有的不可達對象都 由g c 管理 對于程序員來說,g c 基本是透明的,不可見的。雖然,我們只有幾個函數 可以訪問g c ,例如運行g c 的函數s y s t e m g c0 ,但是根據j a v a 語言規(guī)范定義, 該函數不保證j v s 的垃圾收集器一定會執(zhí)行。因為,不同的j v m 實現者可能使用 不同的算法管理g c 通常,g c 的線程的優(yōu)先級別較低。j v u 調用g c 的策略也有 很多種,有的是內存使用到達一定程度時,g c 才開始工作,也有定時執(zhí)行的, 有的是平緩執(zhí)行g c ,有的是中斷式執(zhí)行g c 。但通常來說,我們不需要關心這些 除非在一些特定的場合,g c 的執(zhí)行影響應用程序的性能,例如對于基于w e b 的 實時系統(tǒng),如網絡游戲等,用戶不希望g c 突然中斷應用程序執(zhí)行而進行垃圾回 收,那么我們需要調整g c 的參數,讓g c 能夠通過平緩的方式釋放內存,例如將 垃圾回收分解為一系列的小步驟執(zhí)行,s u n 提供的h o t s p o tj v m 就支持這一特性。 下面給出了一個簡單的內存泄露的倒子。在這個例子中,我們循環(huán)申請o b j e c t 對象,并將所申請的對象放入一個v e c t o r 中,如果我們僅僅釋放引用本身,那 么v e c t o r 仍然引用該對象,所以這個對象對g c 來說是不可回收的。因此,如果 對象加入到v e c t o r 后,還必須從v e c t o r 中刪除,最簡單的方法就是將v e c t o r 對象設置為n u l l 。 v e c t o rv = n e wv e c t o r ( 1 0 0 ) : f o r ( i n ti = l :i 1 0 0 ;i + + ) o b j e c to = n e 霄o b j e c t0 : v a d d ( o ) : o = n u l l : 對外經濟貿易大學碩士論文 j 此時,所有的o b j e c t 對象都沒有被釋放,因為變量v 引用這些對象。 2 2 - 1 如何預防內存泄漏 為了提高垃圾回收的效率,在實際應用中發(fā)現,以下幾種方法可以減少或避 免j a v a 中的內存泄漏 ( 1 ) 慎用s y s t e m g c 0 在程序中顯示的調用s y s t e m g c ( ) ,這種方法并不一定保證執(zhí)行g c ,因為不 同的j w 實現者可能使用不同的算法管理g c ,有的是內存積累到一定程序的時 候執(zhí)行,有的定時執(zhí)行,有的平緩執(zhí)行,有的中斷執(zhí)行,有的可能因為當前系統(tǒng) 內存能夠滿足需要而不會執(zhí)行。另外,雖然g c 的優(yōu)先級較低,但其本身也是線 程,也消耗系統(tǒng)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 古樹保護培訓課件
- 培訓師如何做:授課呈現技巧與培訓方法
- 《醫(yī)療機構管理實務》課件
- 起重安全警示教育培訓
- 《精神疾病識別與干預》課件
- 車庫出租協(xié)議和租賃合同
- 《深海利器公司介紹》課件
- 車輛抵押借款協(xié)議合同書
- 完善勞動合同管理的實施方案計劃
- 浙江婚前協(xié)議書
- TRIZ試題庫詳細版
- Q∕GDW 12129-2021 電網大氣腐蝕等級分布圖繪制規(guī)范
- MTM-1基本方法
- ppt精選模板:熱烈歡迎領導蒞臨指導工作PPT課件
- (完整版)高中化學必修2有機化合物試題.doc
- 可填充顏色的中國地圖,世界地圖,各省市地圖填色
- 彩圖——中國各省地質圖13四川、重慶、貴州、云南(共12頁)
- 化工企業(yè)設備管理課程(共80頁).ppt
- 防高墜安全專項施工方案
- GQ15型工程鉆機
- 廚房物品盤點表
評論
0/150
提交評論