java虛擬機 jvmjava
jvm是jre的一部分算法
當數據被放入JVM的時候,數據會被分解到不一樣的位置多線程
java運行時內存劃分併發
線程共享區:jvm
堆區和方法區性能
線程私有區:優化
虛擬機棧、本地方法棧和程序計數器spa
堆區放真實對象線程
虛擬機棧放java方法3d
本地方法棧放 native方法
方法區放 類的信息、常量、靜態變量
程序計數器 線程執行到第幾行
堆中分
新生、老年、永久代
新生區分爲 eden s0 s1 8:1:1
常見的垃圾回收器
Serial收集器:單線程 它只會使用一個 CPU 或一條收集線程去完成收集工做,而且在進行垃圾回收時必須暫停其它全部的工做線程直到收集結束。
parNew收集器:多線程 能夠認爲是serial的多線程版本
CMS收集器: 是一種以獲取最短回收停頓時間爲目標的收集器 基於標記清除算法實現
G1收集器: 面向服務端的垃圾回收器,是Oracle JDK 9之後的默認GC選項
優勢:並行與併發、分代收集、空間整合、可預測停頓
垃圾回收算法:
複製算法
標記-清除算法
標記整理-算法
JVM調優
類的生命週期:
加載 鏈接(驗證 準備 解析) 初始化 使用 卸載
加載:將.class文件從磁盤讀取到內存
驗證:驗證字節碼的正確性
準備:給類的靜態變量分配內存並賦予默認值
解析:裝載器裝入類所引用的其餘全部類
類加載器的種類
啓動類加載器
負責加載JRE的核心類庫,如JRE目標下的rt.jar,charsets.jar等。
擴展類加載器
負責加載jre擴展目錄ext中的jar
系統類加載器
負責加載classpath路徑下的類包
用戶自定義加載器
負責加載用戶自定義路徑下的類包
類加載器的關係:向上委託的關係
全盤負責委託機制
當一個ClassLoader加載一個類的時候,除非顯示的使用另外一個ClassLoader,該類所依賴和引用的類也由這個ClassLoader載入。
雙親委派機制(模型)
指先委託父加載器尋找目標類,在找不到的狀況下在本身的路徑中查找並載入目標類
JVM性能調優監控命令
垃圾回收對堆空間作回收,棧空間內存隨着線程的消亡而消亡,並不受jvm垃圾回收的管轄!
jps:經過jps查詢進程的id pid
jinfo:查看正在運行的java程序的擴展參數
查看JVM的參數
jinfo -flags 11740
.調優
JVM調優主要就是調整下面兩個指標
停頓時間:垃圾收集器作垃圾回收中斷應用執行的時間。-XX:MaxGCPauseMillis
吞吐量:垃圾收集的時間和總時間的佔比:1/(1+n),吞吐量爲1-1/(1+n)。-XX:GCTimeRatio=n
GC調優步驟
1.打印GC日誌
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:c:/log/gc.log
Tomcat能夠直接加載JAVA_OPTS變量
2.分析日誌獲得關鍵性指標
3.分析GC緣由,優化JVM參數
Parallel Scavenge收集器(默認)
分析日誌:
第一次調優,設置Metaspace大小:增大元空間大小 ()-XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M
第二次調優,增大年輕代動態擴容增量(默認是20%),能夠減小YGC: -XX:YoungGenerationSizeIncrement=30
合併調優
-XX:+PrintGCDetails -XX:MetaspaceSize=64M -XX:MaxMetaspaceSize=64M -XX:YoungGenerationSizeIncrement=30 -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:c:/log/gc-2.log
使用G1收集器收集日誌
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -XX:+UseG1GC -Xloggc:./log/gc-g1.log