資源描述:
《java內(nèi)存問(wèn)題-java開發(fā)java經(jīng)驗(yàn)技巧》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫(kù)。
1、Java內(nèi)存問(wèn)題-編程開發(fā)技術(shù)Java內(nèi)存問(wèn)題木文由ImportNew?Kevin_007翻譯自apmblogo歡迎加入翻譯小組。轉(zhuǎn)載請(qǐng)見文末要求。在Java中,內(nèi)存泄霜和其他內(nèi)存相關(guān)問(wèn)題在性能和口J擴(kuò)展性方面表現(xiàn)的最為突出。我們有充分的理由去詳細(xì)地討論他們。Java內(nèi)存模型——或者更確切的說(shuō)垃圾回收器——已經(jīng)解決了許多內(nèi)存問(wèn)題。然而同時(shí),也帶來(lái)了新的問(wèn)題。特別是在有著大量并行用戶的J2EE運(yùn)行環(huán)境下,內(nèi)存越來(lái)越成為一種至關(guān)重耍的資源。乍看之下,這似乎有些奇怪,因?yàn)楫?dāng)前內(nèi)存已經(jīng)足夠廉價(jià),并且我們也有了64位的JVM和更先進(jìn)的垃圾冋收算法。接卜?來(lái),我們將會(huì)仔細(xì)的討論一下
2、關(guān)于匕陽(yáng)內(nèi)存的問(wèn)題。這些問(wèn)題可以分為四組:?在Java中,內(nèi)存泄露-般都是山于引用對(duì)象不再被使用而造成的。當(dāng)有多個(gè)引用的對(duì)彖,同時(shí)這些對(duì)彖又不再需耍,然而開發(fā)者又忘記清理它們,這時(shí)極容易導(dǎo)致內(nèi)存泄露的發(fā)生。?執(zhí)行消耗太多的內(nèi)存而導(dǎo)致不必要的高內(nèi)存占用。這在為了用戶體驗(yàn)而管理大雖狀態(tài)信息的?Web?應(yīng)用中很常見。隨著活躍用戶數(shù)最的增加,內(nèi)存很快到達(dá)了上限。未綁定或低效緩存配置是持續(xù)高內(nèi)存占用的另一來(lái)源。?當(dāng)用戶負(fù)載增加時(shí),低效的對(duì)象創(chuàng)建容易導(dǎo)致性能問(wèn)題。從而垃圾回收器必須不斷地清理堆內(nèi)存。而這導(dǎo)致了垃圾回收器對(duì)CPU產(chǎn)生了不必要的高占用。隨著CPU因垃圾回收而被阻塞,應(yīng)用
3、程序響應(yīng)時(shí)間頻繁的增加,導(dǎo)致其一直處于中等負(fù)載Z下。這種行為也成為4tGC?trashingMo?低效的垃圾回收行為往往是山于垃圾回收器的缺失或者錯(cuò)誤的配置。這些垃圾回收器將會(huì)時(shí)刻追蹤對(duì)彖是否被清理。然而這種行為如何以及何時(shí)發(fā)生必須由配置或者程序員,或者系統(tǒng)架構(gòu)師決定的。通常,人們只是簡(jiǎn)單地“忘記"了正確的配置和優(yōu)化垃圾冋收器。我曾參加過(guò)一些關(guān)于“性能"的專題討論會(huì),發(fā)現(xiàn)一個(gè)簡(jiǎn)單的參數(shù)變化將會(huì)導(dǎo)致高達(dá)25%的性能提升。在大多數(shù)情況下,內(nèi)存問(wèn)題不僅影響性能,還會(huì)影響可擴(kuò)展性。每次請(qǐng)求消耗的內(nèi)存數(shù)量越高,用戶或Session可以執(zhí)行的并行事務(wù)就越少。在某些情況下內(nèi)存問(wèn)題也影
4、響可用性。當(dāng)JVM耗盡了內(nèi)存或者即將接近內(nèi)存極限,這個(gè)時(shí)候它將退出并報(bào)OutOfMcmory錯(cuò)謀。這時(shí)經(jīng)理會(huì)來(lái)到你的辦公室,你就知道R己攤上大事了。內(nèi)存問(wèn)題很難被解決通常冇兩個(gè)原因:?第一,某些情況下分析很復(fù)雜,也很困難,特別是如果你缺少正確的方法來(lái)解決他們;其次,他們通常是應(yīng)用程序的架構(gòu)基礎(chǔ)。簡(jiǎn)單的代碼更改不會(huì)幫助解決他們。為了使開發(fā)過(guò)程更容易,我會(huì)展示一些實(shí)際應(yīng)用中常被使用的反模式。這些模式已經(jīng)能夠在開發(fā)過(guò)程中避免內(nèi)存問(wèn)題。HTTPSession作為緩存此反模式是指濫用HTTPSession對(duì)象作為數(shù)據(jù)緩存。session對(duì)象的存在是為了存儲(chǔ)信息,這個(gè)信息里面存在著
5、一個(gè)HTTP請(qǐng)求。這也稱為一個(gè)Session狀態(tài)。這意味著,數(shù)據(jù)將被保存直至它們被處理。這些方法通常存在于一些重要的web應(yīng)用程序小。web應(yīng)用程序除了在服務(wù)器上存儲(chǔ)這些信息外,沒(méi)有別的方法。然而,一些信息是能夠存儲(chǔ)在cookie中,但是這將會(huì)帶來(lái)一些其他的影響。在cookie中,盡可能地保持少而短的數(shù)據(jù),這是非常重要的。有時(shí)候很容易發(fā)生這種現(xiàn)象,session里存儲(chǔ)著成兆字節(jié)的數(shù)據(jù)對(duì)象。這將會(huì)立即導(dǎo)致堆棧高占用和內(nèi)存短缺。同時(shí)并行用戶的數(shù)量非常有限,JVM將應(yīng)對(duì)越來(lái)越多出現(xiàn)OutOfMcmoryError錯(cuò)謀的用戶。多數(shù)用戶Session也有其他性能損失。集群場(chǎng)景的s
6、ession復(fù)制屮,這將會(huì)增加序列化和溝通工作將導(dǎo)致額外的性能和可伸縮性問(wèn)題。在某些項(xiàng)口屮這些問(wèn)題的解決方案是增加數(shù)量的內(nèi)存和切換到64位jvmo他們無(wú)法抵抗住僅僅壇加幾個(gè)G大小的堆棧內(nèi)存的誘惑。然而,與其提供一個(gè)對(duì)真正問(wèn)題的解決方案,不如隱藏這個(gè)現(xiàn)象。這個(gè)“解決方案”只是暫時(shí)的,同時(shí)還會(huì)引入了一個(gè)新的問(wèn)題。越來(lái)越大的堆內(nèi)存使它更難以找到“真正的”內(nèi)存問(wèn)題。對(duì)這種非常大的堆(大約6G)來(lái)說(shuō),大部分可用的分析工具是無(wú)法處理這些內(nèi)存垃圾。我們?cè)赿ynaTrace投入了大量的研發(fā)工作希望能夠有效地分析大量的內(nèi)存垃圾。隨著這個(gè)問(wèn)題變得越來(lái)越重要,一種新的JSR規(guī)范也提到了它。由
7、于應(yīng)用程序架構(gòu)尚未明確,導(dǎo)致Session緩存問(wèn)題經(jīng)常岀現(xiàn),。在開發(fā)過(guò)程小,數(shù)據(jù)被輕松而乂簡(jiǎn)單的放入session當(dāng)中。這是經(jīng)常發(fā)生的,類似于一種"add?and?forget"方式,即沒(méi)有人能夠確保當(dāng)這種數(shù)據(jù)不再需要時(shí)是被移除的。通常,當(dāng)session超吋吋不需要的session數(shù)據(jù)應(yīng)該被處理。在企業(yè)中,一些應(yīng)用程序常常大量使用Session超時(shí),這將會(huì)導(dǎo)致無(wú)法正常工作。此外經(jīng)常使用非常高的Session超時(shí)-?24小時(shí)為用戶提供額外的“體驗(yàn)”,使他們不必再次登錄。舉一個(gè)實(shí)際的例子,從session里的數(shù)據(jù)庫(kù)列表中選擇所需要的數(shù)據(jù)。其目