JVM性能优化一些概念简介
數(shù)據(jù)類型
基本類型包括:byte,short,int,long,char,float,double,Boolean,returnAddress
引用類型包括:類類型,接口類型和數(shù)組。
堆與棧
堆和棧是程序運(yùn)行的關(guān)鍵,很有必要把他們的關(guān)系說清楚。棧是運(yùn)行時(shí)的單位,而堆是存儲(chǔ)的單位。棧解決程序的運(yùn)行問題,即程序如何執(zhí)行,或者說如何處理數(shù)據(jù);堆解決的是數(shù)據(jù)存儲(chǔ)的問題,即數(shù)據(jù)怎么放、放在哪兒。在Java中一個(gè)線程就會(huì)相應(yīng)有一個(gè)線程棧與之對(duì)應(yīng),這點(diǎn)很容易理解,因?yàn)椴煌木€程執(zhí)行邏輯有所不同,因此需要一個(gè)獨(dú)立的線程棧。而堆則是所有線程共享的。棧因?yàn)槭沁\(yùn)行單位,因此里面存儲(chǔ)的信息都是跟當(dāng)前線程(或程序)相關(guān)信息的。包括局部變量、程序運(yùn)行狀態(tài)、方法返回值等等;而堆只負(fù)責(zé)存儲(chǔ)對(duì)象信息。為什么要把堆和棧區(qū)分出來呢?棧中不是也可以存儲(chǔ)數(shù)據(jù)嗎?第一,從軟件設(shè)計(jì)的角度看,棧代表了處理邏輯,而堆代表了數(shù)據(jù)。這樣分開,使得處理邏輯更為清晰。分而治之的思想。這種隔離、模塊化的思想在軟件設(shè)計(jì)的方方面面都有體現(xiàn)。第二,堆與棧的分離,使得堆中的內(nèi)容可以被多個(gè)棧共享(也可以理解為多個(gè)線程訪問同一個(gè)對(duì)象)。這種共享的收益是很多的。一方面這種共享提供了一種有效的數(shù)據(jù)交互方式(如:共享內(nèi)存),另一方面,堆中的共享常量和緩存可以被所有棧訪問,節(jié)省了空間。第三,棧因?yàn)檫\(yùn)行時(shí)的需要,比如保存系統(tǒng)運(yùn)行的上下文,需要進(jìn)行地址段的劃分。由于棧只能向上增長,因此就會(huì)限制住棧存儲(chǔ)內(nèi)容的能力。而堆不同,堆中的對(duì)象是可以根據(jù)需要?jiǎng)討B(tài)增長的,因此棧和堆的拆分,使得動(dòng)態(tài)增長成為可能,相應(yīng)棧中只需記錄堆中的一個(gè)地址即可。第四,面向?qū)ο缶褪嵌押蜅5耐昝澜Y(jié)合。其實(shí),面向?qū)ο蠓绞降某绦蚺c以前結(jié)構(gòu)化的程序在執(zhí)行上沒有任何區(qū)別。但是,面向?qū)ο蟮囊?#xff0c;使得對(duì)待問題的思考方式發(fā)生了改變,而更接近于自然方式的思考。當(dāng)我們把對(duì)象拆開,你會(huì)發(fā)現(xiàn),對(duì)象的屬性其實(shí)就是數(shù)據(jù),存放在堆中;而對(duì)象的行為(方法),就是運(yùn)行邏輯,放在棧中。我們?cè)诰帉憣?duì)象的時(shí)候,其實(shí)即編寫了數(shù)據(jù)結(jié)構(gòu),也編寫的處理數(shù)據(jù)的邏輯。不得不承認(rèn),面向?qū)ο蟮脑O(shè)計(jì),確實(shí)很美。在Java中,Main函數(shù)就是棧的起始點(diǎn),也是程序的起始點(diǎn)。程序要運(yùn)行總是有一個(gè)起點(diǎn)的。同C語言一樣,java中的Main就是那個(gè)起點(diǎn)。無論什么java程序,找到main就找到了程序執(zhí)行的入口:)堆中存什么?棧中存什么?堆中存的是對(duì)象。棧中存的是基本數(shù)據(jù)類型和堆中對(duì)象的引用。一個(gè)對(duì)象的大小是不可估計(jì)的,或者說是可以動(dòng)態(tài)變化的,但是在棧中,一個(gè)對(duì)象只對(duì)應(yīng)了一個(gè)4btye的引用(堆棧分離的好處:))。為什么不把基本類型放堆中呢?因?yàn)槠湔加玫目臻g一般是1~8個(gè)字節(jié)——需要空間比較少,而且因?yàn)槭腔绢愋?#xff0c;所以不會(huì)出現(xiàn)動(dòng)態(tài)增長的情況——長度固定,因此棧中存儲(chǔ)就夠了,如果把他存在堆中是沒有什么意義的(還會(huì)浪費(fèi)空間,后面說明)。可以這么說,基本類型和對(duì)象的引用都是存放在棧中,而且都是幾個(gè)字節(jié)的一個(gè)數(shù),因此在程序運(yùn)行時(shí),他們的處理方式是統(tǒng)一的。但是基本類型、對(duì)象引用和對(duì)象本身就有所區(qū)別了,因?yàn)橐粋€(gè)是棧中的數(shù)據(jù)一個(gè)是堆中的數(shù)據(jù)。最常見的一個(gè)問題就是,Java中參數(shù)傳遞時(shí)的問題。Java中的參數(shù)傳遞時(shí)傳值呢?還是傳引用?要說明這個(gè)問題,先要明確兩點(diǎn):1. 不要試圖與C進(jìn)行類比,Java中沒有指針的概念2. 程序運(yùn)行永遠(yuǎn)都是在棧中進(jìn)行的,因而參數(shù)傳遞時(shí),只存在傳遞基本類型和對(duì)象引用的問題。不會(huì)直接傳對(duì)象本身。明確以上兩點(diǎn)后。Java在方法調(diào)用傳遞參數(shù)時(shí),因?yàn)闆]有指針,所以它都是進(jìn)行傳值調(diào)用(這點(diǎn)可以參考C的傳值調(diào)用)。因此,很多書里面都說Java是進(jìn)行傳值調(diào)用,這點(diǎn)沒有問題,而且也簡化的C中復(fù)雜性。但是傳引用的錯(cuò)覺是如何造成的呢?在運(yùn)行棧中,基本類型和引用的處理是一樣的,都是傳值,所以,如果是傳引用的方法調(diào)用,也同時(shí)可以理解為“傳引用值”的傳值調(diào)用,即引用的處理跟基本類型是完全一樣的。但是當(dāng)進(jìn)入被調(diào)用方法時(shí),被傳遞的這個(gè)引用的值,被程序解釋(或者查找)到堆中的對(duì)象,這個(gè)時(shí)候才對(duì)應(yīng)到真正的對(duì)象。如果此時(shí)進(jìn)行修改,修改的是引用對(duì)應(yīng)的對(duì)象,而不是引用本身,即:修改的是堆中的數(shù)據(jù)。所以這個(gè)修改是可以保持的了。對(duì)象,從某種意義上說,是由基本類型組成的。可以把一個(gè)對(duì)象看作為一棵樹,對(duì)象的屬性如果還是對(duì)象,則還是一顆樹(即非葉子節(jié)點(diǎn)),基本類型則為樹的葉子節(jié)點(diǎn)。程序參數(shù)傳遞時(shí),被傳遞的值本身都是不能進(jìn)行修改的,但是,如果這個(gè)值是一個(gè)非葉子節(jié)點(diǎn)(即一個(gè)對(duì)象引用),則可以修改這個(gè)節(jié)點(diǎn)下面的所有內(nèi)容。堆和棧中,棧是程序運(yùn)行最根本的東西。程序運(yùn)行可以沒有堆,但是不能沒有棧。而堆是為棧進(jìn)行數(shù)據(jù)存儲(chǔ)服務(wù),說白了堆就是一塊共享的內(nèi)存。不過,正是因?yàn)槎押蜅5姆蛛x的思想,才使得Java的垃圾回收成為可能。Java中,棧的大小通過-Xss來設(shè)置,當(dāng)棧中存儲(chǔ)數(shù)據(jù)比較多時(shí),需要適當(dāng)調(diào)大這個(gè)值,否則會(huì)出現(xiàn)java.lang.StackOverflowError異常。常見的出現(xiàn)這個(gè)異常的是無法返回的遞歸,因?yàn)榇藭r(shí)棧中保存的信息都是方法返回的記錄點(diǎn)。Java對(duì)象的大小
基本數(shù)據(jù)的類型的大小是固定的,這里就不多說了。對(duì)于非基本類型的Java對(duì)象,其大小就值得商榷。在Java中,一個(gè)空Object對(duì)象的大小是8byte,這個(gè)大小只是保存堆中一個(gè)沒有任何屬性的對(duì)象的大小。看下面語句:Object ob = new Object();
這樣在程序中完成了一個(gè)Java對(duì)象的生命,但是它所占的空間為:4byte+8byte。4byte是上面部分所說的Java棧中保存引用的所需要的空間。而那8byte則是Java堆中對(duì)象的信息。因?yàn)樗械腏ava非基本類型的對(duì)象都需要默認(rèn)繼承Object對(duì)象,因此不論什么樣的Java對(duì)象,其大小都必須是大于8byte。有了Object對(duì)象的大小,我們就可以計(jì)算其他對(duì)象的大小了。
Class NewObject {
int count;boolean flag;Object ob;}
其大小為:空對(duì)象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。但是因?yàn)镴ava在對(duì)對(duì)象內(nèi)存分配時(shí)都是以8的整數(shù)倍來分,因此大于17byte的最接近8的整數(shù)倍的是24,因此此對(duì)象的大小為24byte。這里需要注意一下基本類型的包裝類型的大小。因?yàn)檫@種包裝類型已經(jīng)成為對(duì)象了,因此需要把他們作為對(duì)象來看待。包裝類型的大小至少是12byte(聲明一個(gè)空Object至少需要的空間),而且12byte沒有包含任何有效信息,同時(shí),因?yàn)镴ava對(duì)象大小是8的整數(shù)倍,因此一個(gè)基本類型包裝類的大小至少是16byte。這個(gè)內(nèi)存占用是很恐怖的,它是使用基本類型的N倍(N>2),有些類型的內(nèi)存占用更是夸張(隨便想下就知道了)。因此,可能的話應(yīng)盡量少使用包裝類。在JDK5.0以后,因?yàn)榧尤肓俗詣?dòng)類型裝換,因此,Java虛擬機(jī)會(huì)在存儲(chǔ)方面進(jìn)行相應(yīng)的優(yōu)化。引用類型
對(duì)象引用類型分為強(qiáng)引用、軟引用、弱引用和虛引用。強(qiáng)引用:就是我們一般聲明對(duì)象是時(shí)虛擬機(jī)生成的引用,強(qiáng)引用環(huán)境下,垃圾回收時(shí)需要嚴(yán)格判斷當(dāng)前對(duì)象是否被強(qiáng)引用,如果被強(qiáng)引用,則不會(huì)被垃圾回收
軟引用:軟引用一般被做為緩存來使用。與強(qiáng)引用的區(qū)別是,軟引用在垃圾回收時(shí),虛擬機(jī)會(huì)根據(jù)當(dāng)前系統(tǒng)的剩余內(nèi)存來決定是否對(duì)軟引用進(jìn)行回收。如果剩余內(nèi)存比較緊張,則虛擬機(jī)會(huì)回收軟引用所引用的空間;如果剩余內(nèi)存相對(duì)富裕,則不會(huì)進(jìn)行回收。換句話說,虛擬機(jī)在發(fā)生OutOfMemory時(shí),肯定是沒有軟引用存在的。
弱引用:弱引用與軟引用類似,都是作為緩存來使用。但與軟引用不同,弱引用在進(jìn)行垃圾回收時(shí),是一定會(huì)被回收掉的,因此其生命周期只存在于一個(gè)垃圾回收周期內(nèi)。
強(qiáng)引用不用說,我們系統(tǒng)一般在使用時(shí)都是用的強(qiáng)引用。而“軟引用”和“弱引用”比較少見。他們一般被作為緩存使用,而且一般是在內(nèi)存大小比較受限的情況下做為緩存。因?yàn)槿绻麅?nèi)存足夠大的話,可以直接使用強(qiáng)引用作為緩存即可,同時(shí)可控性更高。因而,他們常見的是被使用在桌面應(yīng)用系統(tǒng)的緩存。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
9V07uKOF5/8FWZuVTT/pbg==
總結(jié)
以上是生活随笔為你收集整理的JVM性能优化一些概念简介的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 校园网连接不上 问题解决记录
- 下一篇: 《Unity3D人工智能编程精粹》笔记