Java性能優(yōu)化
- 期刊名字:計(jì)算機(jī)應(yīng)用
- 文件大小:809kb
- 論文作者:全銳,蘆東昕,謝世波,方馬
- 作者單位:中興通訊股份有限公司
- 更新時(shí)間:2020-09-29
- 下載次數(shù):次
第23卷計(jì)算機(jī)應(yīng)用.Vol.232003年12月Computer ApplicationsDec., 2003文章編號(hào):1001 - 9081(2003)12Z - 0344- 02Java性能優(yōu)化全銳,蘆東昕,謝世波,方 馬(中興通訊股份有限公司成都研究所,四川成都610041)摘要:性能問題一直是Java無法回避的一一個(gè)弱點(diǎn)。然而造成性能低下的原因除了Java本身的實(shí)現(xiàn)外,很多時(shí)候是由于應(yīng)用沒有優(yōu)化地使用Java造成的。從虛擬機(jī)、應(yīng)用編程和測(cè)試三方面分析如何進(jìn)行Java優(yōu)化,指導(dǎo)進(jìn)行高效的Java應(yīng)用設(shè)計(jì)。關(guān)鍵詞:Java;性能;優(yōu)化中圖分類號(hào): TP311. 52文獻(xiàn)標(biāo)識(shí)碼:A面向?qū)ο蟮木幊棠J胶驼Z(yǔ)言本身的優(yōu)秀特征使Java成多介入內(nèi)存管理,但是這種簡(jiǎn)單性也導(dǎo)致了不可控性,所以唯為眾多應(yīng)用開發(fā)的首選。任何事務(wù)都有兩面性:簡(jiǎn)單、跨平-能夠做到的就是通過調(diào)整Java內(nèi)存參數(shù)進(jìn)行-定的控制。臺(tái)、垃圾收集等的確減少了程序員的許多工作;然而一個(gè)設(shè)計(jì)可以調(diào)整如下的參數(shù):良好的Java程序,其性能表現(xiàn)往往不如-個(gè)完成同樣功能的-Xms and -Xmx.控制虛擬機(jī)內(nèi)存使用量;C或C++程序。這幾乎成為Java最大的一個(gè)弱點(diǎn)。但是在-verbose: gc,觀測(cè)GC運(yùn)行的具體情況;Java程序中,大部分的性能問題并不在Java語(yǔ)言本身,而在-XX: NewSize,控制“幼稚園"(GC中的nursery概念)開于使用這種語(yǔ)言的方式和設(shè)計(jì)人員對(duì)性能問題的弱化,沒有始大小;掌握優(yōu)化使用Java語(yǔ)言的方法。-Xincgc and -Xnoincgc ,打開或者關(guān)閉增量式回收。注意:某些-X參數(shù)不是標(biāo)準(zhǔn)選項(xiàng),可能在虛擬機(jī)將來的1 Java虛擬機(jī)的優(yōu)化版本中改變。對(duì)于簡(jiǎn)單的小型程序,-般用“Java 主類”的方式來運(yùn)行-Xms控制了虛擬器初始內(nèi)存大小,-Xmx控制了虛擬機(jī)程序。但如果是大型程序,特別是服務(wù)器端程序,對(duì)各種資源最大內(nèi)存大小。虛擬機(jī)開始的時(shí)候分配Xms內(nèi)存給應(yīng)用程消耗都比較大,這時(shí)就應(yīng)該注意Java虛擬機(jī)的參數(shù)了,其對(duì)序使用,-旦內(nèi)存的使用超過了Xms,則自動(dòng)擴(kuò)展內(nèi)存,直到程序運(yùn)行有著至關(guān)重要的影響。Xmx,如果這時(shí)還有新的內(nèi)存需要,則要拋OutOfMemeory異1.1 Java虛擬機(jī)的選擇常了。Xms的值并不是隨便設(shè)定的,雖然其設(shè)定得很小沒有Java虛擬機(jī)主要有Classic.HotSpot虛擬機(jī),其中很大的影響,內(nèi)存如果不足,最終都會(huì)擴(kuò)展上去的,但是這種HotSpot虛擬機(jī)又分為Java HotSpot Client VM和Java擴(kuò)展總會(huì)耗用一定的虛擬機(jī)資源。所以Xms最佳的設(shè)定是HotSpot Server VM。Classic 虛擬機(jī)是老的虛擬機(jī),一般情比程序進(jìn)入穩(wěn)定狀態(tài)后的內(nèi)存使用值略大一點(diǎn)。HotSpot 虛況下不再使用。擬機(jī)的Xms默認(rèn)為2M,Xmx默認(rèn)為64M。對(duì)于-些大型的HotSpot虛擬機(jī)是Sun最新的Java虛擬機(jī),其重點(diǎn)突破程序這遠(yuǎn)遠(yuǎn)不能滿足。另外Xmx的設(shè)定之和(多個(gè)虛擬機(jī)了幾個(gè)關(guān)鍵性的技術(shù),從而獲得了杰出的性能:1)“運(yùn)行中適時(shí))一般不能超過物理內(nèi)存的80%,否則得不到很好的性能。配”編譯;2)方法內(nèi)置;3)改進(jìn)和重新設(shè)計(jì)的對(duì)象布局;4)快速-verbose:gc詳細(xì)觀測(cè)GC是如何起作用的,幫助進(jìn)行各且完全精確的垃圾回收;5)超快速線程同步。這些杰出的技種參數(shù)的設(shè)定。術(shù)突破使Java虛擬機(jī)的效率成倍提高。-XX:NewSize用來控制nursery 的開始大小。一般情況Java HotSpot Client VM是默認(rèn)的HotSpot虛擬機(jī),其下,即使現(xiàn)在的內(nèi)存使用小于Xms,也會(huì)有一定的GC,因?yàn)?適用于-般的客戶端程序和小型程序。JavaHotSpotServerHotSpot使用分代式GC。其基于一種合理的假設(shè):大多數(shù)的.VM是Sun在企業(yè)服務(wù)器環(huán)境中提供的快速、可靠的Java虛對(duì)象都是剛生成不久就死亡了。所以它并不是收集所有的內(nèi).擬機(jī)。-般的大型服務(wù)器端應(yīng)用應(yīng)該選擇這個(gè)虛擬機(jī)。存,而是將內(nèi)存分成-些代,當(dāng)最年輕的代(即“nursery")滿1.2Java內(nèi)存參數(shù)的調(diào)整了以后,就進(jìn)行-次部分的GC來回收這些不再使用的對(duì)象。在機(jī)器配置和Java虛擬機(jī)版本-定的情況下,影響Java這種中國(guó)煤化工得多,也快得多,其大大降程序性能最大的就應(yīng)該是Java內(nèi)存參數(shù)配置了。低了YHCN MH C提高了虛擬機(jī)的吞吐量。GC(垃圾收集)無疑是Java的一大優(yōu)點(diǎn),程序員無須過在默認(rèn)的情況下nursery為640K(Intel平臺(tái)),這個(gè)值如果設(shè).收稿日期:2003-10-16作者簡(jiǎn)介:全銳(1976-),男,四川成都人.碩土,主要研究方向:電信網(wǎng)絡(luò)管理、電子政務(wù)J2EE;蘆 東昕(1971-),男,黑龍江哈爾濱人,博士后,主要研究方向:電信網(wǎng)絡(luò)管理、嵌入式系統(tǒng)、信息安全;謝世波(1973-),男 ,四川成都人,碩士,主要研究方向:電信網(wǎng)絡(luò)管理、嵌入式系統(tǒng);方馬(1973-).男,四川成都人,碩士,主要研究方向:電信網(wǎng)絡(luò)管理、嵌入式系統(tǒng)J2EE.12月全銳等:Java性能優(yōu)化345定得太小,則對(duì)象在代間移動(dòng)很頻繁,讓該被回收的對(duì)象阻塞同步代碼段。-些集合類本身就是synchronized的,如果在在老的代中,導(dǎo)致完全GC更早發(fā)生;如果這個(gè)值設(shè)定得太單線程使用,則沒有意義,請(qǐng)自己實(shí)現(xiàn)非synchronized 的版大.則可能導(dǎo)致分代收集較長(zhǎng)的停頓,最后達(dá)到完全GC的時(shí)間。這個(gè)值只有通過-verbose:gc打開GC觀察實(shí)際的結(jié)果,d)對(duì)于I/O,如果可能,盡量用緩沖,當(dāng)然,如果flush很不斷調(diào)整。不過,在長(zhǎng)時(shí)間運(yùn)行的Java程序中,HotSpot虛擬頻繁,則用緩沖沒有意義。機(jī)能夠自動(dòng)調(diào)整nursery大小,所以HotSpot是-種很優(yōu)秀e)其它--些優(yōu)化,如盡可能多地使用static,final,private的虛擬機(jī)。等關(guān)鍵字。-Xincgc打開增量式GC。它將完全的對(duì)象集分成小的對(duì)但是在大多數(shù)實(shí)際程序中,它們的優(yōu)勢(shì)有限。盡可能地象集,每次只進(jìn)行部分的GC,縮短了GC的時(shí)間,減小了程序使用它們,但是不要把所有優(yōu)化工作都集中于此類習(xí)慣用法。的停頓。但是其總的GC消耗反大于完全GC。它適用于對(duì)同時(shí),要遵循一個(gè)原則:“過早的優(yōu)化是-切麻煩的根源”。最程序響應(yīng)時(shí)間要求較高的場(chǎng)合,如圖形界面。注意,增量式.明智的做法是抑制過早優(yōu)化的沖動(dòng),因?yàn)槟菢幼隹赡苓z漏多GC不是等內(nèi)存滿了再運(yùn)行,而是-旦發(fā)現(xiàn)機(jī)會(huì)就進(jìn)行。種有用的編程技術(shù),造成代碼更難理解和操控,并需更大的精總的來說,HotSpot虛擬機(jī)有一定自適應(yīng)能力,但是調(diào)整力進(jìn)行維護(hù)。HotSpot內(nèi)存管理還是一件相當(dāng)復(fù)雜的工作,需要進(jìn)行各種3從測(cè)試的角度進(jìn)行Java優(yōu)化測(cè)試和模擬,找到一組最優(yōu)的值。這里說的是性能測(cè)試,其主要目的是找出Java程序的性2Java程序的優(yōu)化能瓶頸。通行的測(cè)試工具,如ProfileViewer. Jswat、Optimizeit等,可以幫助定位性能瓶頸及優(yōu)化的方向。Java程序的優(yōu)化-般分為如下幾個(gè)層次:測(cè)試的時(shí)候,應(yīng)該通過各種工具提供的指標(biāo),對(duì)系統(tǒng)各個(gè)1)良好的構(gòu)架設(shè)計(jì)組成部分的內(nèi)存耗用和CPU時(shí)間進(jìn)行橫向比較,特別是那些構(gòu)架是應(yīng)用的基礎(chǔ),如果構(gòu)架設(shè)計(jì)得不合理,則會(huì)對(duì)后續(xù)關(guān)鍵性的代碼段。通過分析找出性能瓶頸所在,集中用上面的優(yōu)化造成很大的障礙。構(gòu)架應(yīng)該簡(jiǎn)單、清晰,同時(shí)又考慮到介紹的方法對(duì)它們進(jìn)行優(yōu)化,再進(jìn)行測(cè)試,找出新的瓶頸所-定的可擴(kuò)展性。--定要注意構(gòu)架的設(shè)計(jì)不能過多考慮將來在,最終達(dá)到性能需求。這里,一個(gè)明確的性能需求是很重要可能會(huì)有的功能,這樣只會(huì)使構(gòu)架設(shè)計(jì)變得越來越復(fù)雜,最終的。導(dǎo)致低效的設(shè)計(jì),即使后面再怎么優(yōu)化也起不到實(shí)質(zhì)的作用。在測(cè)試的時(shí)候要注意如下的-些原則:2)關(guān)鍵流程的算法設(shè)計(jì)1)測(cè)試代碼不能對(duì)系統(tǒng)的性能有太大影響。算法改進(jìn)這類高級(jí)優(yōu)化技術(shù)具有很大潛力。在優(yōu)化性能2)如對(duì)自己的程序進(jìn)行了修改,并試圖(至少在開發(fā)平關(guān)鍵型代碼塊時(shí),先分析此代碼的實(shí)現(xiàn)過程,嘗試從不同的角臺(tái)上)改善它的性能,那么在修改前后應(yīng)分別測(cè)試一下代碼的度處理該問題。這類優(yōu)化的一個(gè)明顯困難是難于一般化。每執(zhí)行時(shí)間。個(gè)算法都特定于特殊應(yīng)用程序領(lǐng)域,因此能夠提供的通用指3)如果要進(jìn)行縱向比較,則應(yīng)盡量在完全-致的環(huán)境中導(dǎo)原則幾乎沒有。這取決于程序員是否有創(chuàng)造力以及對(duì)問題進(jìn)行每-次測(cè)試,如機(jī)器的配置、負(fù)載、網(wǎng)絡(luò)的狀況和數(shù)據(jù)庫(kù).的把握程度。的情況要盡量一致,才具有可比性。3)性能改進(jìn)技術(shù)4)如果可能,應(yīng)設(shè)計(jì)一個(gè)不依賴任何用戶輸入的測(cè)試,最基本思路是用數(shù)據(jù)復(fù)雜度換取時(shí)間復(fù)雜度。比如對(duì)象避免用戶的不同反應(yīng)導(dǎo)致結(jié)果出現(xiàn)誤差。高速緩存技術(shù)。在Java程序中,對(duì)象高速緩存特別有用,因性能測(cè)試是-項(xiàng)較為復(fù)雜的工作,它要求測(cè)試人員要有為它避免了巨大的對(duì)象創(chuàng)建和垃圾收集開銷。又如軟引用技-定經(jīng)驗(yàn),并選擇合適的測(cè)試方法,而且有時(shí)還要對(duì)源碼進(jìn)行術(shù),其將對(duì)象的緩沖區(qū)完全置于GC的管理之下;還有就是線一定的走讀。核心源碼的作者可以進(jìn)行相應(yīng)的性能測(cè)試,往程池、連接池等技術(shù),其實(shí)質(zhì)也是緩存一些重新生成會(huì)很耗時(shí)往收到事半功倍的效果。這樣,設(shè)計(jì)的時(shí)候運(yùn)用各種優(yōu)化思想,實(shí)現(xiàn)的時(shí)候運(yùn)用各種優(yōu)化技術(shù),嚴(yán)格的測(cè)試找出并解決系的資源。這些都能很好提高系統(tǒng)效率。統(tǒng)的性能瓶頸,最后在合理的虛擬機(jī)參數(shù)下運(yùn)行,一定能夠在4)Java語(yǔ)言級(jí)別的優(yōu)化Java應(yīng)用中取得性能的較大突破。這是Java語(yǔ)言級(jí)別的編程優(yōu)化。比如:參考文獻(xiàn)a)-般的,用StringBuffer代替String;盡可能使用靜態(tài)[1] Eckel B. Java編程思想[M]. 北京:機(jī)械工業(yè)出版社,2002.變量;不要對(duì)已生成的對(duì)象做過多的改變;生成對(duì)象時(shí),要分中國(guó)煤化工)[M].北京:清華大學(xué)出版配給它合理的空間和大小;避免生成不太使用或生命周期短HCNMHG的對(duì)象或變量;只在對(duì)象作用范圍內(nèi)進(jìn)行初始化。[3] http://Java. sun. com/b)只用異常機(jī)制進(jìn)行真正的異常處理,而不是進(jìn)行流程[4] http:// www. jboss. org/控制;盡可能重用已經(jīng)存在的異常,而不是new新的異常。5] http://www. csdn. net.c)線程的synchronized 盡量少用,用同步方法而不要用[6] http:// www. huihoo. com.
-
C4烯烴制丙烯催化劑 2020-09-29
-
煤基聚乙醇酸技術(shù)進(jìn)展 2020-09-29
-
生物質(zhì)能的應(yīng)用工程 2020-09-29
-
我國(guó)甲醇工業(yè)現(xiàn)狀 2020-09-29
-
石油化工設(shè)備腐蝕與防護(hù)參考書十本免費(fèi)下載,絕版珍藏 2020-09-29
-
四噴嘴水煤漿氣化爐工業(yè)應(yīng)用情況簡(jiǎn)介 2020-09-29
-
Lurgi和ICI低壓甲醇合成工藝比較 2020-09-29
-
甲醇制芳烴研究進(jìn)展 2020-09-29
-
精甲醇及MTO級(jí)甲醇精餾工藝技術(shù)進(jìn)展 2020-09-29


