版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、Java內(nèi)存的詳細分析(包括垃圾回收)內(nèi)存的詳細分析(包括垃圾回收)JVMJava數(shù)據(jù)結(jié)構(gòu)應(yīng)用服務(wù)器配置管理1.JAVA的內(nèi)存概述:的內(nèi)存概述:JVM系統(tǒng)中存在一個主內(nèi)存(MainMemy或JavaHeapMemy),Java中所有變量都儲存在主存中,對于所有線程都是共享的。當然,從進程是操作系統(tǒng)資源分配的單位這個角度來看,每個主內(nèi)存對應(yīng)于一個進程,多個線程共享該進程的資源(主內(nèi)存)。每條線程(主要處理用戶定義的運算)都有自己的工作內(nèi)存
2、(WkingMemy),工作內(nèi)存中保存的是主存中某些變量的拷貝,線程對所有變量的操作都是在工作內(nèi)存中進行,線程之間無法相互直接訪問,變量傳遞均需要通過主存完成。他們從主內(nèi)存中取數(shù)據(jù),然后計算,再存入主內(nèi)存中。當多條線程同時對主存的同一臨界資源操作時,就會有線程同步問題;一些是JVM同步機制的大致過程:(1)獲取對象監(jiān)視器的鎖(lock)(2)清空工作內(nèi)存數(shù)據(jù)從主存復制變量到當前工作內(nèi)存即同步數(shù)據(jù)(readload)(3)執(zhí)行代碼,改變共
3、享變量值(useassign)(4)將工作內(nèi)存數(shù)據(jù)刷回主存(stewrite)(5)釋放對象監(jiān)視器的鎖(unlock)注意:其中45兩步是同時進行的.這些涉及到線程同步問題,在這里就不累述了,簡單了解一下。者指令,Stack指針壓棧相應(yīng)的字節(jié)位移;pop一定字節(jié)長度數(shù)據(jù)或者指令,Stack指針彈棧。Stack的速度很快,管理很簡單,并且每次操作的數(shù)據(jù)或者指令字節(jié)長度是已知的。所以Java基本數(shù)據(jù)類型,Java指令代碼,常量都保存在Sta
4、ck中。Java棧是與每一個線程關(guān)聯(lián)的,JVM在創(chuàng)建每一個線程的時候,會分配一定的??臻g給線程。它主要用來存儲線程執(zhí)行過程中的局部變量,方法的返回值,以及方法調(diào)用上下文。棧空間隨著線程的終止而釋放。StackOverflowErr:如果在線程執(zhí)行的過程中,??臻g不夠用,那么JVM就會拋出此異常,這種情況一般是死遞歸造成的。Heap(堆)是(堆)是JVM的內(nèi)存數(shù)據(jù)區(qū)的內(nèi)存數(shù)據(jù)區(qū)。Heap的管理很復雜,每次分配不定長的內(nèi)存空間,專門用來保存
5、對象的實例。在Heap中分配一定的內(nèi)存來保存對象實例,實際上也只是保存對象實例的屬性值,屬性的類型和對象本身的類型標記等,并不保存對象的方法(方法是指令,保存在Stack中)在Heap中分配一定的內(nèi)存保存對象實例和對象的序列化比較類似。而對象實例在Heap中分配好以后,需要在Stack中保存一個4字節(jié)的Heap內(nèi)存地址,用來定位該對象實例在Heap中的位置,便于找到該對象實例。由于Stack的內(nèi)存管理是順序分配的,而且定長,不存在內(nèi)存回
6、收問題;而Heap則是隨機分配內(nèi)存,不定長度,存在內(nèi)存分配和回收的問題;因此在JVM中另有一個GC進程,定期掃描Heap,它根據(jù)Stack中保存的4字節(jié)對象地址掃描Heap,定位Heap中這些對象進行一些優(yōu)化(例如合并空閑內(nèi)存塊什么的),并且假設(shè)Heap中沒有掃描到的區(qū)域都是空閑的,統(tǒng)統(tǒng)refresh(實際上是把Stack中丟失了對象地址的無用對象清除了),這就是垃圾收集的過程。4.堆棧分離的好處堆棧分離的好處從JAVA內(nèi)存模型的角度去
7、理解面向?qū)ο蟮脑O(shè)計,我們就會發(fā)現(xiàn)對象它完美的表示了堆和棧,對象的數(shù)據(jù)放在堆中,而我們編寫的那些方法一般都是運行在棧中,因此面向?qū)ο蟮脑O(shè)計是一種非常完美的設(shè)計方式,它完美的統(tǒng)一了數(shù)據(jù)存儲。JVM的體系結(jié)構(gòu)的體系結(jié)構(gòu)我們首先要搞清楚的是什么是數(shù)據(jù)以及什么是指令。然后要搞清楚對象的方法和對象的屬性分別保存在哪里。1)方法本身是指令的操作碼部分,保存在Stack中;2)方法內(nèi)部變量作為指令的操作數(shù)部分,跟在指令的操作碼之后,保存在Stack中(
8、實際上是簡單類型保存在Stack中,對象類型在Stack中保存地址,在Heap中保存值);上述的指令操作碼和指令操作數(shù)構(gòu)成了完整的Java指令。3)對象實例包括其屬性值作為數(shù)據(jù),保存在數(shù)據(jù)區(qū)Heap中。非靜態(tài)的對象屬性作為對象實例的一部分保存在Heap中,而對象實例必須通過Stack中保存的地址指針才能訪問到。因此能否訪問到對象實例以及它的非靜態(tài)屬性值完全取決于能否獲得對象實例在Stack中的地址指針。非靜態(tài)方法和靜態(tài)方法的區(qū)別:非靜態(tài)
9、方法和靜態(tài)方法的區(qū)別:非靜態(tài)方法有一個和靜態(tài)方法很重大的不同:非靜態(tài)方法有一個隱含的傳入?yún)?shù),該參數(shù)是JVM給它的,和我們怎么寫代碼無關(guān),這個隱含的參數(shù)就是對象實例在Stack中的地址指針。因此非靜態(tài)方法(在Stack中的指令代碼)總是可以找到自己的專用數(shù)據(jù)(在Heap中的對象屬性值)。當然非靜態(tài)方法也必須獲得該隱含參數(shù),因此非靜態(tài)方法在調(diào)用前,必須先new一個對象實例,獲得Stack中的地址指針,否則JVM將無法將隱含參數(shù)傳給非靜態(tài)方
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 產(chǎn)前準備物品詳細分析
- 對勾函數(shù)詳細分析
- resiprocate及sdp協(xié)議詳細分析
- 3-財務(wù)比率詳細分析
- 職位分析詳細分析以及各種表格
- 【模板】運營數(shù)據(jù)詳細分析表格
- B9912029-詳細分析.doc
- struts2框架流程詳細分析
- 科目二坡道起步技巧圖解詳細分析
- 法國葡萄酒產(chǎn)區(qū)詳細分析 (1)
- 招商優(yōu)惠政策相關(guān)數(shù)據(jù)詳細分析
- 報關(guān)程序案例分析題及詳細分析答案
- 【數(shù)據(jù)分析】店鋪訪問來源構(gòu)成詳細分析
- 無領(lǐng)導小組討論案例(詳細分析)
- 科目二坡道起步技巧圖解詳細分析42739
- 波特五力模型分析-蘇寧電器-詳細分析
- satwe計算結(jié)果詳細分析之框架結(jié)構(gòu)
- a股b股的區(qū)別四大板塊詳細分析
- 根據(jù)實踐詳細分析架空電力線路設(shè)計工藝
- 中國石油ipo融資案例詳細分析(精品論文推薦)
評論
0/150
提交評論