理解JVM如何使用Windows和Linux上的本機(jī)_第1頁
理解JVM如何使用Windows和Linux上的本機(jī)_第2頁
理解JVM如何使用Windows和Linux上的本機(jī)_第3頁
理解JVM如何使用Windows和Linux上的本機(jī)_第4頁
理解JVM如何使用Windows和Linux上的本機(jī)_第5頁
已閱讀5頁,還剩4頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、理解JVM如何使用Windows和Linux上的本機(jī)摘要:Java堆耗盡并不是造成java.lang.OutOfMemoryError的惟一原因。如果本機(jī)內(nèi)存耗盡,則會(huì)發(fā)生普通調(diào)試技巧無法解決的OutOfMemoryError。本文將討論本機(jī)內(nèi)存的概念,Java運(yùn)行時(shí)如何使用它,它被耗盡時(shí)會(huì)出現(xiàn)什么情況,以及如何在Windows和Linux上調(diào)試本機(jī)OutOfMemoryError。Java堆(每個(gè)Java對(duì)象在其中分配)是您在編寫Java應(yīng)用程序時(shí)使用最頻繁的內(nèi)存區(qū)域。JVM設(shè)計(jì)用于將我們與主機(jī)的特性隔離,所以將內(nèi)存當(dāng)作堆來考慮再正常不過了。您一定遇到過Java堆OutOfMemoryErr

2、or,它可能是由于對(duì)象泄漏造成的,也可能是因?yàn)槎训拇笮〔蛔阋源鎯?chǔ)所有數(shù)據(jù),您也可能了解這些場(chǎng)景的一些調(diào)試技巧。但是隨著您的Java應(yīng)用程序處理越來越多的數(shù)據(jù)和越來越多的并發(fā)負(fù)載,您可能就會(huì)遇到無法使用常規(guī)技巧進(jìn)行修復(fù)的OutOfMemoryError.在一些場(chǎng)景中,即使java堆未滿,也會(huì)拋出錯(cuò)誤。當(dāng)這類場(chǎng)景發(fā)生時(shí),您需要理解Java運(yùn)行時(shí)環(huán)境(Java Runtime Environment,JRE)內(nèi)部到底發(fā)生了什么。Java應(yīng)用程序在Java運(yùn)行時(shí)的虛擬化環(huán)境中運(yùn)行,但是運(yùn)行時(shí)本身是使用C之類的語言編寫的本機(jī)程序,它也會(huì)耗用本機(jī)資源,包括本機(jī)內(nèi)存。本機(jī)內(nèi)存是可用于運(yùn)行時(shí)進(jìn)程的內(nèi)存,它與J

3、ava應(yīng)用程序使用的java堆內(nèi)存不同。每種虛擬化資源(包括Java堆和Java線程)都必須存儲(chǔ)在本機(jī)內(nèi)存中,虛擬機(jī)在運(yùn)行時(shí)使用的數(shù)據(jù)也是如此。這意味著主機(jī)的硬件和操作系統(tǒng)施加在本機(jī)內(nèi)存上的限制會(huì)影響到Java應(yīng)用程序的性能。本機(jī)內(nèi)存簡(jiǎn)介我將首先解釋一下操作系統(tǒng)和底層硬件給本機(jī)內(nèi)存帶來的限制。如果您熟悉使用C等語言管理動(dòng)態(tài)內(nèi)存,那么您可以直接跳到下一節(jié)。硬件限制本機(jī)進(jìn)程遇到的許多限制都是由硬件造成的,而與操作系統(tǒng)沒有關(guān)系。每臺(tái)計(jì)算機(jī)都有一個(gè)處理器和一些隨機(jī)存取存儲(chǔ)器(RAM),后者也稱為物理內(nèi)存。處理器將數(shù)據(jù)流解釋為要執(zhí)行的指令,它擁有一個(gè)或多個(gè)處理單元,用于執(zhí)行整數(shù)和浮點(diǎn)運(yùn)算以及更高級(jí)的計(jì)算

4、。處理器具有許多寄存器-常快速的內(nèi)存元素,用作被執(zhí)行的計(jì)算的工作存儲(chǔ),寄存器大小決定了一次計(jì)算可使用的最大數(shù)值。處理器通過內(nèi)存總線連接到物理內(nèi)存。物理地址(處理器用于索引物理RAM的地址)的大小限制了可以尋址的內(nèi)存。例如,一個(gè)16位物理地址可以尋址0x0000到0xFFFF的內(nèi)存地址,這個(gè)地址范圍包括216=65536個(gè)惟一的內(nèi)存位置。如果每個(gè)地址引用一個(gè)存儲(chǔ)字節(jié),那么一個(gè)16位物理地址將允許處理器尋址64KB內(nèi)存。處理器被描述為特定數(shù)量的數(shù)據(jù)位。這通常指的是寄存器大小,但是也存在例外,比如32位390指的是物理地址大小。對(duì)于桌面和服務(wù)器平臺(tái),這個(gè)數(shù)字為31、32或64;對(duì)于嵌入式設(shè)備和微處理

5、器,這個(gè)數(shù)字可能小至4.物理地址大小可以與寄存器帶寬一樣大,也可以比它大或小。如果在適當(dāng)?shù)牟僮飨到y(tǒng)上運(yùn)行,大部分64位處理器可以運(yùn)行32位程序。表1列出了一些流行的Linux和Windows架構(gòu),以及它們的寄存器和物理地址大小:表1.一些流行處理器架構(gòu)的寄存器和物理地址大小架構(gòu)寄存器帶寬(位)物理地址大小(位)(現(xiàn)代)Intel x86 32 32 36,具有物理地址擴(kuò)展(Pentium Pro和更高型號(hào))x86 64 64目前為48位(以后將會(huì)增大)PPC64 64在POWER 5上為50位390 31位32 31 390 64位64 64操作系統(tǒng)和虛擬內(nèi)存如果您編寫無需操作系統(tǒng),直接在處理

6、器上運(yùn)行的應(yīng)用程序,您可以使用處理器可以尋址的所有內(nèi)存(假設(shè)連接到了足夠的物理RAM)。但是要使用多任務(wù)和硬件抽象等特性,幾乎所有人都會(huì)使用某種類型的操作系統(tǒng)來運(yùn)行他們的程序。在Windows和Linux等多任務(wù)操作系統(tǒng)中,有多個(gè)程序在使用系統(tǒng)資源。需要為每個(gè)程序分配物理內(nèi)存區(qū)域來在其中運(yùn)行??梢栽O(shè)計(jì)這樣一個(gè)操作系統(tǒng):每個(gè)程序直接使用物理內(nèi)存,并且可以可靠地僅使用分配給它的內(nèi)存。一些嵌入式操作系統(tǒng)以這種方式工作,但是這在包含多個(gè)未經(jīng)過集中測(cè)試的應(yīng)用程序的環(huán)境中是不切實(shí)際的,因?yàn)槿魏纬绦蚨伎赡芷茐钠渌绦蚧蛘卟僮飨到y(tǒng)本身的內(nèi)存。虛擬內(nèi)存允許多個(gè)進(jìn)程共享物理內(nèi)存,而且不會(huì)破壞彼此的數(shù)據(jù)。在具有虛擬

7、內(nèi)存的操作系統(tǒng)(比如Windows、Linux和許多其他操作系統(tǒng))中,每個(gè)程序都擁有自己的虛擬地址空間-一個(gè)邏輯地址區(qū)域,其大小由該系統(tǒng)上的地址大小規(guī)定(所以,桌面和服務(wù)器平臺(tái)的虛擬地址空間為31、32或64位)。進(jìn)程的虛擬地址空間中的區(qū)域可被映射到物理內(nèi)存、文件或任何其他可尋址存儲(chǔ)。當(dāng)數(shù)據(jù)未使用時(shí),操作系統(tǒng)可以在物理內(nèi)存與一個(gè)交換區(qū)域(Windows上的頁面文件或者Linux上的交換分區(qū))之間移動(dòng)它,以實(shí)現(xiàn)對(duì)物理內(nèi)存的最佳利用率。當(dāng)一個(gè)程序嘗試使用虛擬地址訪問內(nèi)存時(shí),操作系統(tǒng)連同片上硬件會(huì)將該虛擬地址映射到物理位置,這個(gè)位置可以是物理RAM、一個(gè)文件或頁面文件/交換分區(qū)。如果一個(gè)內(nèi)存區(qū)域被移

8、動(dòng)到交換空間,那么它將在被使用之前加載回物理內(nèi)存中。圖1展示了虛擬內(nèi)存如何將進(jìn)程地址空間區(qū)域映射到共享資源:圖1.虛擬內(nèi)存將進(jìn)程地址空間映射到物理資源程序的每個(gè)實(shí)例以進(jìn)程的形式運(yùn)行。在Linux和Windows上,進(jìn)程是一個(gè)由受操作系統(tǒng)控制的資源(比如文件和套接字信息)、一個(gè)典型的虛擬地址空間(在某些架構(gòu)上不止一個(gè))和至少一個(gè)執(zhí)行線程構(gòu)成的集合。虛擬地址空間大小可能比處理器的物理地址大小更小。32位Intel x86最初擁有的32位物理地址僅允許處理器尋址4GB存儲(chǔ)空間。后來,添加了一種稱為物理地址擴(kuò)展(Physical Address Extension,PAE)的特性,將物理地址大小擴(kuò)大到

9、了36位,允許安裝或?qū)ぶ分炼?4GB RAM.PAE允許操作系統(tǒng)將32位的4GB虛擬地址空間映射到一個(gè)較大的物理地址范圍,但是它不允許每個(gè)進(jìn)程擁有64GB虛擬地址空間。這意味著如果您將大于4GB的內(nèi)存放入32位Intel服務(wù)器中,您將無法將所有內(nèi)存直接映射到一個(gè)單一進(jìn)程中。地址窗口擴(kuò)展(Address Windowing Extension)特性允許Windows進(jìn)程將其32位地址空間的一部分作為滑動(dòng)窗口映射到較大的內(nèi)存區(qū)域中。Linux使用類似的技術(shù)將內(nèi)存區(qū)域映射到虛擬地址空間中。這意味著盡管您無法直接引用大于4GB的內(nèi)存,但您仍然可以使用較大的內(nèi)存區(qū)域。內(nèi)核空間和用戶空間盡管每個(gè)進(jìn)程都有其

10、自己的地址空間,但程序通常無法使用所有這些空間。地址空間被劃分為用戶空間和內(nèi)核空間。內(nèi)核是主要的操作系統(tǒng)程序,包含用于連接計(jì)算機(jī)硬件、調(diào)度程序以及提供聯(lián)網(wǎng)和虛擬內(nèi)存等服務(wù)的邏輯。作為計(jì)算機(jī)啟動(dòng)序列的一部分,操作系統(tǒng)內(nèi)核運(yùn)行并初始化硬件。一旦內(nèi)核配置了硬件及其自己的內(nèi)部狀態(tài),第一個(gè)用戶空間進(jìn)程就會(huì)啟動(dòng)。如果用戶程序需要來自操作系統(tǒng)的服務(wù),它可以執(zhí)行一種稱為系統(tǒng)調(diào)用的操作與內(nèi)核程序交互,內(nèi)核程序然后執(zhí)行該請(qǐng)求。系統(tǒng)調(diào)用通常是讀取和寫入文件、聯(lián)網(wǎng)和啟動(dòng)新進(jìn)程等操作所必需的。當(dāng)執(zhí)行系統(tǒng)調(diào)用時(shí),內(nèi)核需要訪問其自己的內(nèi)存和調(diào)用進(jìn)程的內(nèi)存。因?yàn)檎趫?zhí)行當(dāng)前線程的處理器被配置為使用地址空間映射來為當(dāng)前進(jìn)程映射

11、虛擬地址,所以大部分操作系統(tǒng)將每個(gè)進(jìn)程地址空間的一部分映射到一個(gè)通用的內(nèi)核內(nèi)存區(qū)域。被映射來供內(nèi)核使用的地址空間部分稱為內(nèi)核空間,其余部分稱為用戶空間,可供用戶應(yīng)用程序使用。內(nèi)核空間和用戶空間之間的平衡關(guān)系因操作系統(tǒng)的不同而不同,甚至在運(yùn)行于不同硬件架構(gòu)之上的同一操作系統(tǒng)的各個(gè)實(shí)例間也有所不同。這種平衡通常是可配置的,可進(jìn)行調(diào)整來為用戶應(yīng)用程序或內(nèi)核提供更多空間。縮減內(nèi)核區(qū)域可能導(dǎo)致一些問題,比如能夠同時(shí)登錄的用戶數(shù)量限制或能夠運(yùn)行的進(jìn)程數(shù)量限制。更小的用戶空間意味著應(yīng)用程序編程人員只能使用更少的內(nèi)存空間。默認(rèn)情況下,32位Windows擁有2GB用戶空間和2GB內(nèi)核空間。在一些Windows

12、版本上,通過向啟動(dòng)配置添加/3GB開關(guān)并使用/LARGEADDRESSAWARE開關(guān)重新鏈接應(yīng)用程序,可以將這種平衡調(diào)整為3GB用戶空間和1GB內(nèi)核空間。在32位Linux上,默認(rèn)設(shè)置為3GB用戶空間和1GB內(nèi)核空間。一些Linux分發(fā)版提供了一個(gè)hugemem內(nèi)核,支持4GB用戶空間。為了實(shí)現(xiàn)這種配置,將進(jìn)行系統(tǒng)調(diào)用時(shí)使用的地址空間分配給內(nèi)核。通過這種方式增加用戶空間會(huì)減慢系統(tǒng)調(diào)用,因?yàn)槊看芜M(jìn)行系統(tǒng)調(diào)用時(shí),操作系統(tǒng)必須在地址空間之間復(fù)制數(shù)據(jù)并重置進(jìn)程地址-空間映射。圖2展示了32位Windows的地址-空間布局:圖2.32位Windows的地址-空間布局圖3顯示了32位Linux的地址-空間

13、配置:31位Linux 390上還使用了一個(gè)獨(dú)立的內(nèi)核地址空間,其中較小的2GB地址空間使對(duì)單個(gè)地址空間進(jìn)行劃分不太合理,但是,390架構(gòu)可以同時(shí)使用多個(gè)地址空間,而且不會(huì)降低性能。進(jìn)程空間必須包含程序需要的所有內(nèi)容,包括程序本身和它使用的共享庫(在Windows上為DDL,在Linux上為.so文件)。共享庫不僅會(huì)占據(jù)空間,使程序無法在其中存儲(chǔ)數(shù)據(jù),它們還會(huì)使地址空間碎片化,減少可作為連續(xù)內(nèi)存塊分配的內(nèi)存。這對(duì)于在擁有3GB用戶空間的Windows x86上運(yùn)行的程序尤為明顯。DLL在構(gòu)建時(shí)設(shè)置了首選的加載地址:當(dāng)加載DLL時(shí),它被映射到處于特定位置的地址空間,除非該位置已經(jīng)被占用,在這種情

14、況下,它會(huì)加載到別處。Windows NT最初設(shè)計(jì)時(shí)設(shè)置了2GB可用用戶空間,這對(duì)于要構(gòu)建來加載接近2GB區(qū)域的系統(tǒng)庫很有用-使大部分用戶區(qū)域都可供應(yīng)用程序自由使用。當(dāng)用戶區(qū)域擴(kuò)展到3GB時(shí),系統(tǒng)共享庫仍然加載接近2GB數(shù)據(jù)(約為用戶空間的一半)。盡管總體用戶空間為3GB,但是不可能分配3GB大的內(nèi)存塊,因?yàn)楣蚕韼鞜o法加載這么大的內(nèi)存。在Windows中使用/3GB開關(guān),可以將內(nèi)核空間減少一半,也就是最初設(shè)計(jì)的大小。在一些情形下,可能耗盡1GB內(nèi)核空間,使I/O變得緩慢,且無法正常創(chuàng)建新的用戶會(huì)話。盡管/3GB開關(guān)可能對(duì)一些應(yīng)用程序非常有用,但任何使用它的環(huán)境在部署之前都應(yīng)該進(jìn)行徹底的負(fù)載測(cè)試

15、。參見參考資料,獲取關(guān)于/3GB開關(guān)及其優(yōu)缺點(diǎn)的更多信息的鏈接。本機(jī)內(nèi)存泄漏或過度使用本機(jī)內(nèi)存將導(dǎo)致不同的問題,具體取決于您是耗盡了地址空間還是用完了物理內(nèi)存。耗盡地址空間通常只會(huì)發(fā)生在32位進(jìn)程上,因?yàn)樽畲?GB的內(nèi)存很容易分配完。64位進(jìn)程具有數(shù)百或數(shù)千GB的用戶空間,即使您特意消耗空間也很難耗盡這么大的空間。如果您確實(shí)耗盡了Java進(jìn)程的地址空間,那么Java運(yùn)行時(shí)可能會(huì)出現(xiàn)一些陌生現(xiàn)象,本文稍后將詳細(xì)討論。當(dāng)在進(jìn)程地址空間比物理內(nèi)存大的系統(tǒng)上運(yùn)行時(shí),內(nèi)存泄漏或過度使用本機(jī)內(nèi)存會(huì)迫使操作系統(tǒng)交換后備存儲(chǔ)器來用作本機(jī)進(jìn)程的虛擬地址空間。訪問經(jīng)過交換的內(nèi)存地址比讀取駐留(在物理內(nèi)存中)的地址

16、慢得多,因?yàn)椴僮飨到y(tǒng)必須從硬盤驅(qū)動(dòng)器拉取數(shù)據(jù)??赡軙?huì)分配大量?jī)?nèi)存來用完所有物理內(nèi)存和所有交換內(nèi)存(頁面空間),在Linux上,這將觸發(fā)內(nèi)核內(nèi)存不足(OOM)結(jié)束程序,強(qiáng)制結(jié)束最消耗內(nèi)存的進(jìn)程。在Windows上,與地址空間被占滿時(shí)一樣,內(nèi)存分配將會(huì)失敗。同時(shí),如果嘗試使用比物理內(nèi)存大的虛擬內(nèi)存,顯然在進(jìn)程由于消耗內(nèi)存太大而被結(jié)束之前就會(huì)遇到問題。系統(tǒng)將變得異常緩慢,因?yàn)樗鼤?huì)將大部分時(shí)間用于在內(nèi)存與交換空間之間來回復(fù)制數(shù)據(jù)。當(dāng)發(fā)生這種情況時(shí),計(jì)算機(jī)和獨(dú)立應(yīng)用程序的性能將變得非常糟糕,從而使用戶意識(shí)到出現(xiàn)了問題。當(dāng)JVM的Java堆被交換出來時(shí),垃圾收集器的性能會(huì)變得非常差,應(yīng)用程序可能被掛起。如

17、果一臺(tái)機(jī)器上同時(shí)使用了多個(gè)Java運(yùn)行時(shí),那么物理內(nèi)存必須足夠分配給所有Java堆。Java運(yùn)行時(shí)如何使用本機(jī)內(nèi)存Java運(yùn)行時(shí)是一個(gè)操作系統(tǒng)進(jìn)程,它會(huì)受到我在上一節(jié)中列出的硬件和操作系統(tǒng)局限性的限制。運(yùn)行時(shí)環(huán)境提供的功能受一些未知的用戶代碼驅(qū)動(dòng),這使得無法預(yù)測(cè)在每種情形中運(yùn)行時(shí)環(huán)境將需要何種資源。Java應(yīng)用程序在托管Java環(huán)境中執(zhí)行的每個(gè)操作都會(huì)潛在地影響提供該環(huán)境的運(yùn)行時(shí)的需求。本節(jié)描述Java應(yīng)用程序?yàn)槭裁春腿绾问褂帽緳C(jī)內(nèi)存。Java堆和垃圾收集Java堆是分配了對(duì)象的內(nèi)存區(qū)域。大多數(shù)Java SE實(shí)現(xiàn)都擁有一個(gè)邏輯堆,但是一些專家級(jí)Java運(yùn)行時(shí)擁有多個(gè)堆,比如實(shí)現(xiàn)Java實(shí)時(shí)規(guī)范

18、(Real Time Specification for Java,RTSJ)的運(yùn)行時(shí)。一個(gè)物理堆可被劃分為多個(gè)邏輯扇區(qū),具體取決于用于管理堆內(nèi)存的垃圾收集(GC)算法。這些扇區(qū)通常實(shí)現(xiàn)為連續(xù)的本機(jī)內(nèi)存塊,這些內(nèi)存塊受Java內(nèi)存管理器(包含垃圾收集器)控制。堆的大小可以在Java命令行使用-Xmx和-Xms選項(xiàng)來控制(mx表示堆的最大大小,ms表示初始大小)。盡管邏輯堆(經(jīng)常被使用的內(nèi)存區(qū)域)可以根據(jù)堆上的對(duì)象數(shù)量和在GC上花費(fèi)的時(shí)間而增大和縮小,但使用的本機(jī)內(nèi)存大小保持不變,而且由-Xmx值(最大堆大小)指定。大部分GC算法依賴于被分配為連續(xù)的內(nèi)存塊的堆,因此不能在堆需要擴(kuò)大時(shí)分配更多本機(jī)

19、內(nèi)存。所有堆內(nèi)存必須預(yù)先保留。保留本機(jī)內(nèi)存與分配本機(jī)內(nèi)存不同。當(dāng)本機(jī)內(nèi)存被保留時(shí),無法使用物理內(nèi)存或其他存儲(chǔ)器作為備用內(nèi)存。盡管保留地址空間塊不會(huì)耗盡物理資源,但會(huì)阻止內(nèi)存被用于其他用途。由保留從未使用的內(nèi)存導(dǎo)致的泄漏與泄漏分配的內(nèi)存一樣嚴(yán)重。當(dāng)使用的堆區(qū)域縮小時(shí),一些垃圾收集器會(huì)回收堆的一部分(釋放堆的后備存儲(chǔ)空間),從而減少使用的物理內(nèi)存。對(duì)于維護(hù)Java堆的內(nèi)存管理系統(tǒng),需要更多本機(jī)內(nèi)存來維護(hù)它的狀態(tài)。當(dāng)進(jìn)行垃圾收集時(shí),必須分配數(shù)據(jù)結(jié)構(gòu)來跟蹤空閑存儲(chǔ)空間和記錄進(jìn)度。這些數(shù)據(jù)結(jié)構(gòu)的確切大小和性質(zhì)因?qū)崿F(xiàn)的不同而不同,但許多數(shù)據(jù)結(jié)構(gòu)都與堆大小成正比。即時(shí)(JIT)編譯器JIT編譯器在運(yùn)行時(shí)編譯

20、Java字節(jié)碼來優(yōu)化本機(jī)可執(zhí)行代碼。這極大地提高了Java運(yùn)行時(shí)的速度,并且支持Java應(yīng)用程序以與本機(jī)代碼相當(dāng)?shù)乃俣冗\(yùn)行。字節(jié)碼編譯使用本機(jī)內(nèi)存(使用方式與gcc等靜態(tài)編譯器使用內(nèi)存來運(yùn)行一樣),但JIT編譯器的輸入(字節(jié)碼)和輸出(可執(zhí)行代碼)必須也存儲(chǔ)在本機(jī)內(nèi)存中。包含多個(gè)經(jīng)過JIT編譯的方法的Java應(yīng)用程序會(huì)使用比小型應(yīng)用程序更多的本機(jī)內(nèi)存。類和類加載器Java應(yīng)用程序由一些類組成,這些類定義對(duì)象結(jié)構(gòu)和方法邏輯。Java應(yīng)用程序也使用Java運(yùn)行時(shí)類庫(比如java.lang.String)中的類,也可以使用第三方庫。這些類需要存儲(chǔ)在內(nèi)存中以備使用。存儲(chǔ)類的方式取決于具體實(shí)現(xiàn)。Sun

21、 JDK使用永久生成(permanent generation,PermGen)堆區(qū)域。Java 5的IBM實(shí)現(xiàn)會(huì)為每個(gè)類加載器分配本機(jī)內(nèi)存塊,并將類數(shù)據(jù)存儲(chǔ)在其中?,F(xiàn)代Java運(yùn)行時(shí)擁有類共享等技術(shù),這些技術(shù)可能需要將共享內(nèi)存區(qū)域映射到地址空間。要理解這些分配機(jī)制如何影響您Java運(yùn)行時(shí)的本機(jī)內(nèi)存占用,您需要查閱該實(shí)現(xiàn)的技術(shù)文檔。然而,一些普遍的事實(shí)會(huì)影響所有實(shí)現(xiàn)。從最基本的層面來看,使用更多的類將需要使用更多內(nèi)存。(這可能意味著您的本機(jī)內(nèi)存使用量會(huì)增加,或者您必須明確地重新設(shè)置PermGen或共享類緩存等區(qū)域的大小,以裝入所有類)。記住,不僅您的應(yīng)用程序需要加載到內(nèi)存中,框架、應(yīng)用服務(wù)器、

22、第三方庫以及包含類的Java運(yùn)行時(shí)也會(huì)按需加載并占用空間。Java運(yùn)行時(shí)可以卸載類來回收空間,但是只有在非常嚴(yán)酷的條件下才會(huì)這樣做。不能卸載單個(gè)類,而是卸載類加載器,隨其加載的所有類都會(huì)被卸載。只有在以下情況下才能卸載類加載器:Java堆不包含對(duì)表示該類加載器的java.lang.ClassLoader對(duì)象的引用。Java堆不包含對(duì)表示類加載器加載的類的任何java.lang.Class對(duì)象的引用。在Java堆上,該類加載器加載的任何類的所有對(duì)象都不再存活(被引用)。需要注意的是,Java運(yùn)行時(shí)為所有Java應(yīng)用程序創(chuàng)建的3個(gè)默認(rèn)類加載器(bootstrap、extension和application)都不可能滿足這些條件,因此,任何系統(tǒng)類(比如java.lang.String)或通過應(yīng)用程序類加載器加載的任何應(yīng)用程序類都不能在運(yùn)行時(shí)釋放。即使類加載器適合

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論