您好,登錄后才能下訂單哦!
jvm內(nèi)存模型
程序計(jì)數(shù)器:是一塊很小的內(nèi)存空間。當(dāng)線程數(shù)量超過(guò)cpu數(shù)量時(shí),線程之間根據(jù)時(shí)間片輪詢搶奪cpu資源。每一個(gè)線程都必須用一個(gè)獨(dú)立的程序計(jì)數(shù)器,用于記錄下一條要運(yùn)行的指令。
java虛擬機(jī)棧(線程棧 ):也是線程私有內(nèi)存空間,他和java線程在同一時(shí)間創(chuàng)建,他保存方法的局部變量、部分結(jié)果,并參與方法的調(diào)用和返回。如果線程在計(jì)算過(guò)程中,請(qǐng)求的棧深度大于最大可用的棧深度,則拋出StackOverflowError;如果java??梢詣?dòng)態(tài)擴(kuò)展,而在擴(kuò)展的過(guò)程中,操作系統(tǒng)沒有足夠的內(nèi)存空間來(lái)支持棧的擴(kuò)展,則拋出OutOfMemoryError;——參數(shù)設(shè)置參見《設(shè)置線程棧 》
本地方法棧:用于管理本地方法的調(diào)用,本地方法是使用C實(shí)現(xiàn)的。
java堆:堆空間分為新生代和老年代。新生代用于存放產(chǎn)生的新對(duì)象,老年代用于存放年長(zhǎng)的對(duì)象(存在 時(shí)間較長(zhǎng),經(jīng)過(guò)垃圾回收次數(shù)較多的對(duì)象)。新生代又可以細(xì)分為eden,s0和s1,eden大部分對(duì)象剛建立時(shí),通常放在這里。s0和s1為survivor空間,也就是說(shuō)存放其中的對(duì)象至少經(jīng)歷了一次垃圾回收,并得以幸存。如果幸存區(qū)的對(duì)象到了指定的年齡仍未被回收,則有機(jī)會(huì)進(jìn)入老年代。
方法區(qū):與堆空間類似,也是被jvm的所有線程共享的,主要保存的是類的類型信息、常量池、域信息、方法信息等元數(shù)據(jù)。
設(shè)置最大、最小堆內(nèi)存
用-Xmx指定最大堆內(nèi)存,最大堆內(nèi)存指的是新生代和老年代的大小之和的最大值,它是java應(yīng)用程序的堆上線。
用-Xms指定最小堆內(nèi)存,也就是jvm啟動(dòng)時(shí),所占據(jù)的操作系統(tǒng)內(nèi)存大小。
當(dāng)-Xms指定的內(nèi)存大小確實(shí)無(wú)法滿足應(yīng)用程序是,jvm才會(huì)向操作系統(tǒng)申請(qǐng)更多的內(nèi)存,直至達(dá)到-Xmx指定的內(nèi)存大小為止。 如果-Xms的數(shù)值較小,那么jvm為了保證系統(tǒng)盡可能的在指定內(nèi)存范圍內(nèi)運(yùn)行,就會(huì)頻繁的進(jìn)行g(shù)c操作,以釋放失效的內(nèi)存空間,從而,會(huì)增加Minor GC和Full GC的次數(shù),對(duì)系統(tǒng)性能產(chǎn)生一定影響。所以,把-Xms值設(shè)置為-Xmx時(shí),可以在系統(tǒng)運(yùn)行初期減少gc的次數(shù)和耗時(shí)。
設(shè)置線程棧
線程棧是線程的一塊私有空間,可以用-Xss設(shè)置線程棧的大小,棧的大小直接決定了函數(shù)調(diào)用的可達(dá)深度。
在線程中進(jìn)行局部變量分配,函數(shù)調(diào)用時(shí),都需要在棧中開辟空間。
如果棧的空間分配太小,那么線程在運(yùn)行時(shí),可能沒有足夠的空間分配局部變量或者達(dá)不到足夠的函數(shù)調(diào)用深度,導(dǎo)致程序異常退出;如果??臻g過(guò)大,那么開設(shè)線程所需的內(nèi)存成本就會(huì)上升,系統(tǒng)所能支持的線程總數(shù)就會(huì)下降。
java堆和線程棧都是像操作系統(tǒng)申請(qǐng)內(nèi)存空間,如果堆空間過(guò)大,就會(huì)導(dǎo)致操作系統(tǒng)可用于線程棧的內(nèi)存減小,當(dāng)系統(tǒng)由于內(nèi)存不夠而無(wú)法創(chuàng)建新的線程時(shí),會(huì)拋出OOM異常(注意這個(gè)OOM不是堆內(nèi)存不足)。所以,如果系統(tǒng)確實(shí)需要大量線程并發(fā)執(zhí)行,那么設(shè)置一個(gè)較小的堆和較小的棧,有助于提高系統(tǒng)所能承受的最大線程數(shù)。
設(shè)置新生代
用-Xmn指定新生代的大小,新生代的大小一般設(shè)置為整個(gè)堆空間的1/4到1/3。設(shè)置一個(gè)較大或較小的新生代對(duì)系統(tǒng)性能已經(jīng)gc行為有很大影響。
使用-XX:NewSize設(shè)置新生代的初始大小,-XX:MaxNewSize設(shè)置新生代的最大值。通常情況下只設(shè)置-Xmn即可滿足需要。
設(shè)置持久代
持久代(方法區(qū))不屬于堆得一部分,使用-XX:MaxPermSize設(shè)置持久代最大值,使用-XX:PermSize設(shè)置持久代最小值。
持久代的大小直接決定了系統(tǒng)可以支持多少個(gè)類定義和多少常量。
一般MaxPermSize設(shè)置為64M或128M。
取得堆快照(堆dump)
使用-XX:+HeapDumpOnOutOfMemoryError參數(shù)在程序發(fā)生OOM時(shí),導(dǎo)出應(yīng)用程序的當(dāng)前堆快照。
通過(guò)參數(shù)-XX:HeapDumpPath可以指定堆快照的保存位置。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。