java內(nèi)存的詳細(xì)分析(包括垃圾回收)_第1頁
已閱讀1頁,還剩5頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、Java內(nèi)存的詳細(xì)分析(包括垃圾回收)內(nèi)存的詳細(xì)分析(包括垃圾回收)JVMJava數(shù)據(jù)結(jié)構(gòu)應(yīng)用服務(wù)器配置管理1.JAVA的內(nèi)存概述:的內(nèi)存概述:JVM系統(tǒng)中存在一個(gè)主內(nèi)存(MainMemy或JavaHeapMemy),Java中所有變量都儲(chǔ)存在主存中,對(duì)于所有線程都是共享的。當(dāng)然,從進(jìn)程是操作系統(tǒng)資源分配的單位這個(gè)角度來看,每個(gè)主內(nèi)存對(duì)應(yīng)于一個(gè)進(jìn)程,多個(gè)線程共享該進(jìn)程的資源(主內(nèi)存)。每條線程(主要處理用戶定義的運(yùn)算)都有自己的工作內(nèi)存

2、(WkingMemy),工作內(nèi)存中保存的是主存中某些變量的拷貝,線程對(duì)所有變量的操作都是在工作內(nèi)存中進(jìn)行,線程之間無法相互直接訪問,變量傳遞均需要通過主存完成。他們從主內(nèi)存中取數(shù)據(jù),然后計(jì)算,再存入主內(nèi)存中。當(dāng)多條線程同時(shí)對(duì)主存的同一臨界資源操作時(shí),就會(huì)有線程同步問題;一些是JVM同步機(jī)制的大致過程:(1)獲取對(duì)象監(jiān)視器的鎖(lock)(2)清空工作內(nèi)存數(shù)據(jù)從主存復(fù)制變量到當(dāng)前工作內(nèi)存即同步數(shù)據(jù)(readload)(3)執(zhí)行代碼,改變共

3、享變量值(useassign)(4)將工作內(nèi)存數(shù)據(jù)刷回主存(stewrite)(5)釋放對(duì)象監(jiān)視器的鎖(unlock)注意:其中45兩步是同時(shí)進(jìn)行的.這些涉及到線程同步問題,在這里就不累述了,簡單了解一下。者指令,Stack指針壓棧相應(yīng)的字節(jié)位移;pop一定字節(jié)長度數(shù)據(jù)或者指令,Stack指針彈棧。Stack的速度很快,管理很簡單,并且每次操作的數(shù)據(jù)或者指令字節(jié)長度是已知的。所以Java基本數(shù)據(jù)類型,Java指令代碼,常量都保存在Sta

4、ck中。Java棧是與每一個(gè)線程關(guān)聯(lián)的,JVM在創(chuàng)建每一個(gè)線程的時(shí)候,會(huì)分配一定的??臻g給線程。它主要用來存儲(chǔ)線程執(zhí)行過程中的局部變量,方法的返回值,以及方法調(diào)用上下文。??臻g隨著線程的終止而釋放。StackOverflowErr:如果在線程執(zhí)行的過程中,棧空間不夠用,那么JVM就會(huì)拋出此異常,這種情況一般是死遞歸造成的。Heap(堆)是(堆)是JVM的內(nèi)存數(shù)據(jù)區(qū)的內(nèi)存數(shù)據(jù)區(qū)。Heap的管理很復(fù)雜,每次分配不定長的內(nèi)存空間,專門用來保存

5、對(duì)象的實(shí)例。在Heap中分配一定的內(nèi)存來保存對(duì)象實(shí)例,實(shí)際上也只是保存對(duì)象實(shí)例的屬性值,屬性的類型和對(duì)象本身的類型標(biāo)記等,并不保存對(duì)象的方法(方法是指令,保存在Stack中)在Heap中分配一定的內(nèi)存保存對(duì)象實(shí)例和對(duì)象的序列化比較類似。而對(duì)象實(shí)例在Heap中分配好以后,需要在Stack中保存一個(gè)4字節(jié)的Heap內(nèi)存地址,用來定位該對(duì)象實(shí)例在Heap中的位置,便于找到該對(duì)象實(shí)例。由于Stack的內(nèi)存管理是順序分配的,而且定長,不存在內(nèi)存回

6、收問題;而Heap則是隨機(jī)分配內(nèi)存,不定長度,存在內(nèi)存分配和回收的問題;因此在JVM中另有一個(gè)GC進(jìn)程,定期掃描Heap,它根據(jù)Stack中保存的4字節(jié)對(duì)象地址掃描Heap,定位Heap中這些對(duì)象進(jìn)行一些優(yōu)化(例如合并空閑內(nèi)存塊什么的),并且假設(shè)Heap中沒有掃描到的區(qū)域都是空閑的,統(tǒng)統(tǒng)refresh(實(shí)際上是把Stack中丟失了對(duì)象地址的無用對(duì)象清除了),這就是垃圾收集的過程。4.堆棧分離的好處堆棧分離的好處從JAVA內(nèi)存模型的角度去

7、理解面向?qū)ο蟮脑O(shè)計(jì),我們就會(huì)發(fā)現(xiàn)對(duì)象它完美的表示了堆和棧,對(duì)象的數(shù)據(jù)放在堆中,而我們編寫的那些方法一般都是運(yùn)行在棧中,因此面向?qū)ο蟮脑O(shè)計(jì)是一種非常完美的設(shè)計(jì)方式,它完美的統(tǒng)一了數(shù)據(jù)存儲(chǔ)。JVM的體系結(jié)構(gòu)的體系結(jié)構(gòu)我們首先要搞清楚的是什么是數(shù)據(jù)以及什么是指令。然后要搞清楚對(duì)象的方法和對(duì)象的屬性分別保存在哪里。1)方法本身是指令的操作碼部分,保存在Stack中;2)方法內(nèi)部變量作為指令的操作數(shù)部分,跟在指令的操作碼之后,保存在Stack中(

8、實(shí)際上是簡單類型保存在Stack中,對(duì)象類型在Stack中保存地址,在Heap中保存值);上述的指令操作碼和指令操作數(shù)構(gòu)成了完整的Java指令。3)對(duì)象實(shí)例包括其屬性值作為數(shù)據(jù),保存在數(shù)據(jù)區(qū)Heap中。非靜態(tài)的對(duì)象屬性作為對(duì)象實(shí)例的一部分保存在Heap中,而對(duì)象實(shí)例必須通過Stack中保存的地址指針才能訪問到。因此能否訪問到對(duì)象實(shí)例以及它的非靜態(tài)屬性值完全取決于能否獲得對(duì)象實(shí)例在Stack中的地址指針。非靜態(tài)方法和靜態(tài)方法的區(qū)別:非靜態(tài)

9、方法和靜態(tài)方法的區(qū)別:非靜態(tài)方法有一個(gè)和靜態(tài)方法很重大的不同:非靜態(tài)方法有一個(gè)隱含的傳入?yún)?shù),該參數(shù)是JVM給它的,和我們?cè)趺磳懘a無關(guān),這個(gè)隱含的參數(shù)就是對(duì)象實(shí)例在Stack中的地址指針。因此非靜態(tài)方法(在Stack中的指令代碼)總是可以找到自己的專用數(shù)據(jù)(在Heap中的對(duì)象屬性值)。當(dāng)然非靜態(tài)方法也必須獲得該隱含參數(shù),因此非靜態(tài)方法在調(diào)用前,必須先new一個(gè)對(duì)象實(shí)例,獲得Stack中的地址指針,否則JVM將無法將隱含參數(shù)傳給非靜態(tài)方

溫馨提示

  • 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. 眾賞文庫僅提供信息存儲(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)論