JVM內(nèi)存調(diào)優(yōu)總結(jié)

JVM內(nèi)存調(diào)優(yōu)總結(jié)

ID:37276705

大?。?.92 MB

頁數(shù):46頁

時間:2019-05-20

JVM內(nèi)存調(diào)優(yōu)總結(jié)_第1頁
JVM內(nèi)存調(diào)優(yōu)總結(jié)_第2頁
JVM內(nèi)存調(diào)優(yōu)總結(jié)_第3頁
JVM內(nèi)存調(diào)優(yōu)總結(jié)_第4頁
JVM內(nèi)存調(diào)優(yōu)總結(jié)_第5頁
資源描述:

《JVM內(nèi)存調(diào)優(yōu)總結(jié)》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫

1、JVM調(diào)優(yōu)總結(jié)(一)--一些概念原創(chuàng)作者:和你在一起??閱讀:1287次??評論:5條??更新時間:2010-11-12?????數(shù)據(jù)類型???Java虛擬機中,數(shù)據(jù)類型可以分為兩類:基本類型和引用類型?;绢愋偷淖兞勘4嬖贾?,即:他代表的值就是數(shù)值本身;而引用類型的變量保存引用值?!耙弥怠贝砹四硞€對象的引用,而不是對象本身,對象本身存放在這個引用值所表示的地址的位置?;绢愋桶ǎ篵yte,short,int,long,char,float,double,Boolean,returnAddress引用類型包括:類類型,接口類型和數(shù)組。堆與棧???堆和棧是

2、程序運行的關(guān)鍵,很有必要把他們的關(guān)系說清楚。???????棧是運行時的單位,而堆是存儲的單位。???棧解決程序的運行問題,即程序如何執(zhí)行,或者說如何處理數(shù)據(jù);堆解決的是數(shù)據(jù)存儲的問題,即數(shù)據(jù)怎么放、放在哪兒。???在Java中一個線程就會相應(yīng)有一個線程棧與之對應(yīng),這點很容易理解,因為不同的線程執(zhí)行邏輯有所不同,因此需要一個獨立的線程棧。而堆則是所有線程共享的。棧因為是運行單位,因此里面存儲的信息都是跟當前線程(或程序)相關(guān)信息的。包括局部變量、程序運行狀態(tài)、方法返回值等等;而堆只負責存儲對象信息。???為什么要把堆和棧區(qū)分出來呢?棧中不是也可以存儲數(shù)據(jù)嗎????

3、第一,從軟件設(shè)計的角度看,棧代表了處理邏輯,而堆代表了數(shù)據(jù)。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模塊化的思想在軟件設(shè)計的方方面面都有體現(xiàn)。???第二,堆與棧的分離,使得堆中的內(nèi)容可以被多個棧共享(也可以理解為多個線程訪問同一個對象)。這種共享的收益是很多的。一方面這種共享提供了一種有效的數(shù)據(jù)交互方式(如:共享內(nèi)存),另一方面,堆中的共享常量和緩存可以被所有棧訪問,節(jié)省了空間。???第三,棧因為運行時的需要,比如保存系統(tǒng)運行的上下文,需要進行地址段的劃分。由于棧只能向上增長,因此就會限制住棧存儲內(nèi)容的能力。而堆不同,堆中的對象是可以根據(jù)需要動

4、態(tài)增長的,因此棧和堆的拆分,使得動態(tài)增長成為可能,相應(yīng)棧中只需記錄堆中的一個地址即可。???第四,面向?qū)ο缶褪嵌押蜅5耐昝澜Y(jié)合。其實,面向?qū)ο蠓绞降某绦蚺c以前結(jié)構(gòu)化的程序在執(zhí)行上沒有任何區(qū)別。但是,面向?qū)ο蟮囊耄沟脤Υ龁栴}的思考方式發(fā)生了改變,而更接近于自然方式的思考。當我們把對象拆開,你會發(fā)現(xiàn),對象的屬性其實就是數(shù)據(jù),存放在堆中;而對象的行為(方法),就是運行邏輯,放在棧中。我們在編寫對象的時候,其實即編寫了數(shù)據(jù)結(jié)構(gòu),也編寫的處理數(shù)據(jù)的邏輯。不得不承認,面向?qū)ο蟮脑O(shè)計,確實很美。???在Java中,Main函數(shù)就是棧的起始點,也是程序的起始點。???程序要

5、運行總是有一個起點的。同C語言一樣,java中的Main就是那個起點。無論什么java程序,找到main就找到了程序執(zhí)行的入口:)???堆中存什么?棧中存什么????堆中存的是對象。棧中存的是基本數(shù)據(jù)類型和堆中對象的引用。一個對象的大小是不可估計的,或者說是可以動態(tài)變化的,但是在棧中,一個對象只對應(yīng)了一個4btye的引用(堆棧分離的好處:))。???為什么不把基本類型放堆中呢?因為其占用的空間一般是1~8個字節(jié)——需要空間比較少,而且因為是基本類型,所以不會出現(xiàn)動態(tài)增長的情況——長度固定,因此棧中存儲就夠了,如果把他存在堆中是沒有什么意義的(還會浪費空間,后面說

6、明)??梢赃@么說,基本類型和對象的引用都是存放在棧中,而且都是幾個字節(jié)的一個數(shù),因此在程序運行時,他們的處理方式是統(tǒng)一的。但是基本類型、對象引用和對象本身就有所區(qū)別了,因為一個是棧中的數(shù)據(jù)一個是堆中的數(shù)據(jù)。最常見的一個問題就是,Java中參數(shù)傳遞時的問題。???Java中的參數(shù)傳遞時傳值呢?還是傳引用????要說明這個問題,先要明確兩點:????????1.不要試圖與C進行類比,Java中沒有指針的概念????????2.程序運行永遠都是在棧中進行的,因而參數(shù)傳遞時,只存在傳遞基本類型和對象引用的問題。不會直接傳對象本身。???明確以上兩點后。Java在方法調(diào)用

7、傳遞參數(shù)時,因為沒有指針,所以它都是進行傳值調(diào)用(這點可以參考C的傳值調(diào)用)。因此,很多書里面都說Java是進行傳值調(diào)用,這點沒有問題,而且也簡化的C中復(fù)雜性。???但是傳引用的錯覺是如何造成的呢?在運行棧中,基本類型和引用的處理是一樣的,都是傳值,所以,如果是傳引用的方法調(diào)用,也同時可以理解為“傳引用值”的傳值調(diào)用,即引用的處理跟基本類型是完全一樣的。但是當進入被調(diào)用方法時,被傳遞的這個引用的值,被程序解釋(或者查找)到堆中的對象,這個時候才對應(yīng)到真正的對象。如果此時進行修改,修改的是引用對應(yīng)的對象,而不是引用本身,即:修改的是堆中的數(shù)據(jù)。所以這個修改是可以保

8、持的了。???對象,從某

當前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負責整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時聯(lián)系客服。
3. 下載前請仔細閱讀文檔內(nèi)容,確認文檔內(nèi)容符合您的需求后進行下載,若出現(xiàn)內(nèi)容與標題不符可向本站投訴處理。
4. 下載文檔時可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費完成后未能成功下載的用戶請聯(lián)系客服處理。