先上圖
1.程序計數(shù)器
較小的一塊內(nèi)存短纵,可以看作當(dāng)前線程執(zhí)行的字節(jié)碼的行號指示器带污,字節(jié)碼解釋器通過這個計數(shù)器的值選擇下一條需要執(zhí)行的字節(jié)碼指令,分支香到,循環(huán)鱼冀,異常處理,線程恢復(fù)都依賴此悠就。屬于線程私有千绪。
2.虛擬機(jī)棧
屬于線程私有,與線程生命周期相同梗脾,每個方法執(zhí)行同時會創(chuàng)建一個棧幀荸型,存儲局部變量表,操作數(shù)棧炸茧,動態(tài)鏈接瑞妇,方法出口等信息。每個方法調(diào)用對應(yīng)一個棧幀的入棧和出棧梭冠。
3.本地方法棧
和虛擬機(jī)棧類似辕狰,不同之處在于本地方法棧為使用到的Native方法本地調(diào)用服務(wù)。對本地方法沒有強制規(guī)定妈嘹,語言柳琢,方式,數(shù)據(jù)結(jié)構(gòu)。有的虛擬機(jī)將它和虛擬機(jī)棧合二為一柬脸,可能拋出StackOverflowError和OutOfMemoryError他去。
4.堆
是被所有線程共享的一塊內(nèi)存,用于分配對象實例倒堕,可以細(xì)分為新生代灾测,老年代,Eden區(qū)垦巴,F(xiàn)ro mSurvivor 和 ToSurvivor等媳搪。可以通過JVM啟動參數(shù)配置初始大小骤宣,即-Xmx -Xms -Xmn等參數(shù)設(shè)置秦爆。
5.方法區(qū)
用于存儲已經(jīng)被虛擬機(jī)加載的類信息,常量憔披,靜態(tài)變量等限,編譯后的代碼等。一般來說芬膝,在常用的HotSpot上望门,可以把方法區(qū)叫做永久代,Permanent Generation
5.1 運行時常量池
屬于方法區(qū)的一部分锰霜,在Class文件中的常量池筹误,存放編譯期生成的各種字面量和符號引用。當(dāng)然運行時常量也可能計入方法區(qū)常量池癣缅。典型例子為String.intern()厨剪。
可能的問題:
1.基礎(chǔ)的內(nèi)存分配
2.對內(nèi)存配置參數(shù)
3.永久代配置
4.配置堆內(nèi)存超過實際物理內(nèi)存
5.NIO(New Input/Output)基于通道和緩沖區(qū)可以使用Native方法直接分配堆外內(nèi)存,通過一個directByteBuffer對象作為引用來操作友存,某些場景下可以提高性能丽惶,減少頻繁在java堆和Native堆之間復(fù)制數(shù)據(jù)。