JVM使用記錄

JVM說明

Java虛擬機在運行Java程序的過程中,會把它管理的內存劃分為幾個不同的數(shù)據(jù)區(qū)域。

JDK1.6,1.7的JVM運行內存

線程私有的:程序計數(shù)器,虛擬機棧,本地方法棧

線程共享的:堆,方法區(qū)(永久代,持久代),直接內存(非運行時內存的一部分)

運行時內存

堆(Heap)內存 GC 堆(Garbage Collected Heap)。現(xiàn)在收集器基本都采用分代垃圾收集算法,分為新生代,老生代。用于存放對象實例,幾乎所有的對象實例和數(shù)組都在這里分配內存

  • 新生代 PSYoungGen

    • eden space
    • from space
    • to space
  • 老生代 PSOldGen

    • object space

方法區(qū) Method Area ,也叫非堆Non-Heap。存儲已被虛擬機加載的類信息、常量、靜態(tài)變量、即時編譯器編譯后的代碼等數(shù)據(jù)

  • 永久代 PSPermGen

    • object space

,線程私有的。生命周期隨著線程的創(chuàng)建而創(chuàng)建,隨著線程的死亡而死亡。 在 HotSpot 虛擬機中和 Java 虛擬機棧合二為一。

  • 程序計數(shù)器:字節(jié)碼解釋器通過這個計數(shù)器的值來選取下一條需要執(zhí)行的字節(jié)碼指令,分支、循環(huán)、跳轉、異常處理、線程恢復等。唯一一個不會出現(xiàn) OutOfMemoryError 的內存區(qū)域

  • 虛擬機棧棧內存 (Stack),其中棧就是現(xiàn)在說的虛擬機棧。實際上,Java 虛擬機棧是由一個個棧幀組成,而每個棧幀中都擁有:局部變量表、操作數(shù)棧、動態(tài)鏈接、方法出口信息。包括基本類型(boolean、byte、char、short、int、float、long、double)、對象引用(reference 類型)。

  • 本地方法棧,虛擬機使用到的 Native 方法服務。本地方法棧也會創(chuàng)建一個棧幀,用于存放該本地方法的局部變量表、操作數(shù)棧、動態(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,新生代內存:15m, 指定永久代內存大小:初始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 輸出默認信息:

# 堆內存設置50m,各個區(qū)域內存占內存比例
-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   需要指定大小:默認20.75m 
  object space 21248K, 17% used 

運行時常量池分。

Class 文件中除了有類的版本、字段、方法、接口等描述信息外,還有常量池信息(用于存放編譯期生成的各種字面量和符號引用)

既然運行時常量池時方法區(qū)的一部分,自然受到方法區(qū)內存的限制,當常量池無法再申請到內存時會拋出 OutOfMemoryError 異常。

JDK1.7 及之后版本的 JVM 已經(jīng)將運行時常量池從方法區(qū)中移了出來,在 Java 堆(Heap)中開辟了一塊區(qū)域存放運行時常量池。

JDK1.8的JVM運行內存

JDK1.8移出了方法區(qū),改成了元空間(MetaSpace)。整個永久代有一個 JVM 本身設置固定大小上線,無法進行調整,而元空間使用的是直接內存,受本機可用內存的限制,并且永遠不會得到 java.lang.OutOfMemoryError。你可以使用 -XX:MaxMetaspaceSize 標志設置最大元空間大小,默認值為 unlimited,這意味著它只受系統(tǒng)內存的限制。-XX:MetaspaceSize 調整標志定義元空間的初始大小如果未指定此標志,則 Metaspace 將根據(jù)運行時的應用程序需求動態(tài)地重新調整大小。默認容量 4496K=4.39m 已提交4864K = 4.75m, 預留1056768K = 1032m

一般MetaspaceSize默認5m,MaxMetaspaceSize默認1024m

JDK1.8的VM options配置

jdk1.8移除了-XX:PermSize=16m -XX:MaxPermSize=64m配置

vm options配置:

# 指定永久代內存大小
-Xms50m -Xmx50m  -XX:+PrintCommandLineFlags -XX:+PrintGCDetails

堆內存分配說明:

  • 堆內存共計50M = 新生代14.5m +老生代 33.5m +預留空間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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 第二部分 自動內存管理機制 第二章 java內存異常與內存溢出異常 運行數(shù)據(jù)區(qū)域 程序計數(shù)器:當前線程所執(zhí)行的字節(jié)...
    小明oh閱讀 1,278評論 0 2
  • 這篇文章是我之前翻閱了不少的書籍以及從網(wǎng)絡上收集的一些資料的整理,因此不免有一些不準確的地方,同時不同JDK版本的...
    高廣超閱讀 16,049評論 3 83
  • 內存溢出和內存泄漏的區(qū)別 內存溢出:out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,...
    Aimerwhy閱讀 805評論 0 1
  • 1991年4月,由James Gosling主導的團隊創(chuàng)造了Oak語言,java的前身,1995年5月23號,Oa...
    Java架構閱讀 1,660評論 1 37
  • Java8張圖 11、字符串不變性 12、equals()方法、hashCode()方法的區(qū)別 13、...
    Miley_MOJIE閱讀 3,896評論 0 11

友情鏈接更多精彩內容