資源描述:
《Java內(nèi)存機(jī)制詳解》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫(kù)。
1、Java內(nèi)存機(jī)制詳解Java堆(每個(gè)Java對(duì)象在其中分配)是您在編寫(xiě)Java應(yīng)用程序時(shí)使用最頻繁的內(nèi)存區(qū)域。JVM設(shè)計(jì)用于將我們與主機(jī)的特性隔離,所以將內(nèi)存當(dāng)作堆來(lái)考慮再正常不過(guò)了。您一定遇到過(guò)Java堆OutOfMemoryError,它可能是由于對(duì)象泄漏造成的,也可能是因?yàn)槎训拇笮〔蛔阋源鎯?chǔ)所有數(shù)據(jù),您也可能了解這些場(chǎng)景的一些調(diào)試技巧。但是隨著您的Java應(yīng)用程序處理越來(lái)越多的數(shù)據(jù)和越來(lái)越多的并發(fā)負(fù)載,您可能就會(huì)遇到無(wú)法使用常規(guī)技巧進(jìn)行修復(fù)的OutOfMemoryError。在一些場(chǎng)景中,即使java堆未滿,也會(huì)拋出錯(cuò)誤。當(dāng)這類(lèi)場(chǎng)景發(fā)生時(shí),您需要理解
2、Java運(yùn)行時(shí)環(huán)境(JavaRuntimeEnvironment,JRE)內(nèi)部到底發(fā)生了什么。Java應(yīng)用程序在Java運(yùn)行時(shí)的虛擬化環(huán)境中運(yùn)行,但是運(yùn)行時(shí)本身是使用C之類(lèi)的語(yǔ)言編寫(xiě)的本機(jī)程序,它也會(huì)耗用本機(jī)資源,包括本機(jī)內(nèi)存。本機(jī)內(nèi)存是可用于運(yùn)行時(shí)進(jìn)程的內(nèi)存,它與Java應(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)用程序的性能。本系列文章共分兩篇,討論不同平臺(tái)上的相應(yīng)話題。本文是其中一篇。在這兩
3、篇文章中,您將了解什么是本機(jī)內(nèi)存,Java運(yùn)行時(shí)如何使用它,本機(jī)內(nèi)存耗盡之后會(huì)發(fā)生什么情況,以及如何調(diào)試本機(jī)OutOfMemoryError。本文介紹Windows和Linux平臺(tái)上的這一主題,不會(huì)介紹任何特定的運(yùn)行時(shí)實(shí)現(xiàn)。本機(jī)內(nèi)存簡(jiǎn)介硬件限制本機(jī)進(jìn)程遇到的許多限制都是由硬件造成的,而與操作系統(tǒng)沒(méi)有關(guān)系。每臺(tái)計(jì)算機(jī)都有一個(gè)處理器和一些隨機(jī)存取存儲(chǔ)器(RAM),后者也稱(chēng)為物理內(nèi)存。處理器將數(shù)據(jù)流解釋為要執(zhí)行的指令,它擁有一個(gè)或多個(gè)處理單元,用于執(zhí)行整數(shù)和浮點(diǎn)運(yùn)算以及更高級(jí)的計(jì)算。處理器具有許多寄存器——??焖俚膬?nèi)存元素,用作被執(zhí)行的計(jì)算的工作存儲(chǔ),寄存器大小
4、決定了一次計(jì)算可使用的最大數(shù)值。處理器通過(guò)內(nèi)存總線連接到物理內(nèi)存。物理地址(處理器用于索引物理RAM的地址)的大小限制了可以尋址的內(nèi)存。例如,一個(gè)16位物理地址可以尋址0x0000到0xFFFF的內(nèi)存地址,這個(gè)地址范圍包括2^16=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è)備和微處理器,這個(gè)數(shù)字可能小至4。物理地址大小可以
5、與寄存器帶寬一樣大,也可以比它大或小。如果在適當(dāng)?shù)牟僮飨到y(tǒng)上運(yùn)行,大部分64位處理器可以運(yùn)行32位程序。表1列出了一些流行的Linux和Windows架構(gòu),以及它們的寄存器和物理地址大?。罕?.一些流行處理器架構(gòu)的寄存器和物理地址大小架構(gòu)寄存器帶寬(位)物理地址大?。ㄎ唬ìF(xiàn)代)Intel?x86323236,具有物理地址擴(kuò)展(PentiumPro和更高型號(hào))x866464目前為48位(以后將會(huì)增大)PPC6464在POWER5上為50位39031位323139064位6464操作系統(tǒng)和虛擬內(nèi)存如果您編寫(xiě)無(wú)需操作系統(tǒng),直接在處理器上運(yùn)行的應(yīng)用程序,您可以使
6、用處理器可以尋址的所有內(nèi)存(假設(shè)連接到了足夠的物理RAM)。但是要使用多任務(wù)和硬件抽象等特性,幾乎所有人都會(huì)使用某種類(lèi)型的操作系統(tǒng)來(lái)運(yùn)行他們的程序。在Windows和Linux等多任務(wù)操作系統(tǒng)中,有多個(gè)程序在使用系統(tǒng)資源。需要為每個(gè)程序分配物理內(nèi)存區(qū)域來(lái)在其中運(yùn)行。可以設(shè)計(jì)這樣一個(gè)操作系統(tǒng):每個(gè)程序直接使用物理內(nèi)存,并且可以可靠地僅使用分配給它的內(nèi)存。一些嵌入式操作系統(tǒng)以這種方式工作,但是這在包含多個(gè)未經(jīng)過(guò)集中測(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上的頁(yè)面文件或者Linux上的交換分區(qū))之間移動(dòng)它,以實(shí)現(xiàn)對(duì)物理內(nèi)存的最佳利用率。當(dāng)一個(gè)程序嘗試使用虛擬地址訪問(wèn)內(nèi)存時(shí),操作系統(tǒng)連同片上硬件會(huì)將該虛擬地址映射到物理位置,這個(gè)位置可以是物理RAM、
8、一個(gè)文件或頁(yè)面文件/交換分區(qū)。如果一個(gè)內(nèi)存區(qū)域被移動(dòng)到交換空間,那