JVM說(shuō)明
Java虛擬機(jī)在運(yùn)行Java程序的過(guò)程中干花,會(huì)把它管理的內(nèi)存劃分為幾個(gè)不同的數(shù)據(jù)區(qū)域。
JDK1.6楞黄,1.7的JVM運(yùn)行內(nèi)存
線程私有的:程序計(jì)數(shù)器池凄,虛擬機(jī)棧,本地方法棧
線程共享的:堆鬼廓,方法區(qū)(永久代肿仑,持久代),直接內(nèi)存(非運(yùn)行時(shí)內(nèi)存的一部分)
運(yùn)行時(shí)內(nèi)存
堆(Heap)內(nèi)存 GC 堆(Garbage Collected Heap)。現(xiàn)在收集器基本都采用分代垃圾收集算法尤慰,分為新生代馏锡,老生代。用于存放對(duì)象實(shí)例伟端,幾乎所有的對(duì)象實(shí)例和數(shù)組都在這里分配內(nèi)存
-
新生代 PSYoungGen
- eden space
- from space
- to space
-
老生代 PSOldGen
- object space
方法區(qū) Method Area 杯道,也叫非堆Non-Heap。存儲(chǔ)已被虛擬機(jī)加載的類信息责蝠、常量党巾、靜態(tài)變量、即時(shí)編譯器編譯后的代碼等數(shù)據(jù)
-
永久代 PSPermGen
- object space
棧霜医,線程私有的齿拂。生命周期隨著線程的創(chuàng)建而創(chuàng)建,隨著線程的死亡而死亡肴敛。 在 HotSpot 虛擬機(jī)中和 Java 虛擬機(jī)棧合二為一署海。
程序計(jì)數(shù)器:字節(jié)碼解釋器通過(guò)這個(gè)計(jì)數(shù)器的值來(lái)選取下一條需要執(zhí)行的字節(jié)碼指令,分支医男、循環(huán)叹侄、跳轉(zhuǎn)、異常處理昨登、線程恢復(fù)等趾代。唯一一個(gè)不會(huì)出現(xiàn) OutOfMemoryError 的內(nèi)存區(qū)域
虛擬機(jī)棧:棧內(nèi)存 (Stack),其中棧就是現(xiàn)在說(shuō)的虛擬機(jī)棧。實(shí)際上丰辣,Java 虛擬機(jī)棧是由一個(gè)個(gè)棧幀組成撒强,而每個(gè)棧幀中都擁有:局部變量表、操作數(shù)棧笙什、動(dòng)態(tài)鏈接飘哨、方法出口信息。包括基本類型(boolean琐凭、byte芽隆、char、short统屈、int胚吁、float、long愁憔、double)腕扶、對(duì)象引用(reference 類型)。
本地方法棧吨掌,虛擬機(jī)使用到的 Native 方法服務(wù)半抱。本地方法棧也會(huì)創(chuàng)建一個(gè)棧幀脓恕,用于存放該本地方法的局部變量表、操作數(shù)棧窿侈、動(dòng)態(tài)鏈接炼幔、出口信息。
JDK1.6的VM options配置
Java類:
public static void main(String[] args) {
byte[] allocation1, allocation2,allocation3,allocation4,allocation5;
allocation1 = new byte[32768*1024]; // 32768 = 32M
allocation2 = new byte[1024*1024]; // 1024 = 1M
allocation3 = new byte[1024*1024]; // 1024 = 1M
// allocation4 = new byte[512*1024]; // OOM異常:Java heap space
// allocation5 = new byte[1024*1024];
}
vm options配置
# 堆初始值50m,最大值50m史简,新生代內(nèi)存:15m, 指定永久代內(nèi)存大小:初始16m乃秀,最大64m
-Xms50m -Xmx50m -Xmn15m -XX:PermSize=16m -XX:MaxPermSize=64m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails
輸出信息:
-XX:InitialHeapSize=52428800 -XX:MaxHeapSize=52428800 -XX:MaxNewSize=15728640 -XX:NewSize=15728640 -XX:ParallelGCThreads=4 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Heap
PSYoungGen total 13440K, used 3433K
eden space 11520K, 29% used
from space 1920K, 0% used
to space 1920K, 0% used
PSOldGen total 35840K, used 32768K
object space 35840K, 91% used
PSPermGen total 21248K, used 3813K
object space 21248K, 17% used
如果不指定 -Xmn
輸出默認(rèn)信息:
# 堆內(nèi)存設(shè)置50m,各個(gè)區(qū)域內(nèi)存占內(nèi)存比例
-XX:InitialHeapSize=52428800 -XX:MaxHeapSize=52428800
Heap
PSYoungGen total 14912K, used 3330K 占比 29%
eden space 12800K, 26% used 占比 25%
from space 2112K, 0% used 占比 4%
to space 2112K, 0% used 占比 4%
PSOldGen total 34176K, used 32768K 占比 66.75%
object space 34176K, 95% used
PSPermGen total 21248K, used 3703K 需要指定大谐巳俊:默認(rèn)20.75m
object space 21248K, 17% used
運(yùn)行時(shí)常量池分环形。
Class 文件中除了有類的版本策泣、字段衙傀、方法、接口等描述信息外萨咕,還有常量池信息(用于存放編譯期生成的各種字面量和符號(hào)引用)
既然運(yùn)行時(shí)常量池時(shí)方法區(qū)的一部分统抬,自然受到方法區(qū)內(nèi)存的限制,當(dāng)常量池?zé)o法再申請(qǐng)到內(nèi)存時(shí)會(huì)拋出 OutOfMemoryError 異常危队。
JDK1.7 及之后版本的 JVM 已經(jīng)將運(yùn)行時(shí)常量池從方法區(qū)中移了出來(lái)聪建,在 Java 堆(Heap)中開(kāi)辟了一塊區(qū)域存放運(yùn)行時(shí)常量池。
JDK1.8的JVM運(yùn)行內(nèi)存
JDK1.8移出了方法區(qū)茫陆,改成了元空間(MetaSpace)金麸。整個(gè)永久代有一個(gè) JVM 本身設(shè)置固定大小上線,無(wú)法進(jìn)行調(diào)整簿盅,而元空間使用的是直接內(nèi)存挥下,受本機(jī)可用內(nèi)存的限制,并且永遠(yuǎn)不會(huì)得到 java.lang.OutOfMemoryError桨醋。你可以使用 -XX:MaxMetaspaceSize
標(biāo)志設(shè)置最大元空間大小棚瘟,默認(rèn)值為 unlimited,這意味著它只受系統(tǒng)內(nèi)存的限制喜最。-XX:MetaspaceSize
調(diào)整標(biāo)志定義元空間的初始大小如果未指定此標(biāo)志偎蘸,則 Metaspace 將根據(jù)運(yùn)行時(shí)的應(yīng)用程序需求動(dòng)態(tài)地重新調(diào)整大小。默認(rèn)容量 4496K=4.39m 已提交4864K = 4.75m, 預(yù)留1056768K = 1032m
一般MetaspaceSize默認(rèn)5m瞬内,MaxMetaspaceSize默認(rèn)1024m
JDK1.8的VM options配置
jdk1.8移除了-XX:PermSize=16m -XX:MaxPermSize=64m配置
vm options配置:
# 指定永久代內(nèi)存大小
-Xms50m -Xmx50m -XX:+PrintCommandLineFlags -XX:+PrintGCDetails
堆內(nèi)存分配說(shuō)明:
- 堆內(nèi)存共計(jì)50M = 新生代14.5m +老生代 33.5m +預(yù)留空間2m
- 新生代PSYoungGen:14848K = 14.5m 占比 29%
- eden space 12800K = 12.5m 占比25%
- from space 2048K = 2m 占比4%
- to space 2048K = 2m 占比4%
- 老生代ParOldGen:34304K = 33.5m 占比 67%
GC信息如下:
-XX:InitialHeapSize=52428800 -XX:MaxHeapSize=52428800 -XX:+PrintCommandLineFlags -XX:+PrintGCDetails -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
Heap
PSYoungGen total 14848K, used 4736K
eden space 12800K, 37% used
from space 2048K, 0% used
to space 2048K, 0% used
ParOldGen total 34304K, used 32768K
object space 34304K, 95% used
Metaspace used 3450K, capacity 4496K, committed 4864K, reserved 1056768K
class space used 376K, capacity 388K, committed 512K, reserved 1048576K
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=16m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=64m; support was removed in 8.0