1. 程式人生 > >JVM概念以及常用設置

JVM概念以及常用設置

線程創建 高性能 重要 輸出 bsp 劃分 角色 技術分享 分代

DAY 1

Jvm- java虛擬機

  1. 類加載子系統
    1. 加載class文件到方法區
  2. 方法區
    1. 存放類信息
    2. 常量信息
    3. 常量池信息
    4. 輔助堆棧的永久區,解決堆棧信息的產生,是先決條件

  3. Java堆(重要)

    1. 虛擬機啟動的時候建立
    2. 最主要的內存工作區域
    3. 幾乎所有的對象實例都存放到Java堆中,堆內存是所有的線程共享的
    4. 解決數據存儲的問題

  4. 直接內存

    1. Java的NIO庫允許java程序使用直接內存,從而提高性能,速度優於JAVA堆
    2. 讀寫頻繁可考慮使用

  5. Java棧

    1. 線程創建的時候被創建
    2. 保存局部變量、方法參數、引用、java方法的調用、返回值等
    3. 解決數據運行問題

  6. 本地方法棧(不重要)

  7. 垃圾回收系統(重要)

    1. GC垃圾回收系統

  8. PC寄存器(不重要)

    1. 保存一些指針

  9. 執行引擎

    1. 負責執行虛擬機的字節碼

堆棧方法區詳細

Java堆(核心)

Java堆完全自動化管理,通過垃圾回收機制自動清理,不需要顯示的釋放。

Java堆如何劃分?(面試)

通常分為新生代和老生代,其中新生代存放新生的對象,老的存放老的對象。

新生代:eden區(對象剛實例化的狀態)、S0(from)區、S1(TO)區(s0\s1大小相等、可相互轉換的角色)

對象通常先分配到eden區,在一次GC後,如果對象還在,那麽進去s0或者s1區,後面沒經歷一次GC年齡加1,到達一定的年齡後,進入老年代。

新生代中GC的頻率會比老年代高很多。

Java棧(不是特別重要)

線程私有的內存空間。

局部變量表:報錯信息

操作數棧:計算過程中的臨時變量

幀數據區:報錯信息

方法區:

如果系統定義太多的類,可能會導致方法區溢出。

虛擬機參數:

堆分配參數(一)(+啟用,-禁用)

(1) -XX 對於系統級別的(JVM)配置,配置日誌信息或者說配置JVM使用什麽樣的垃圾回收器。

(2)非-XX的基本上都是對應用層面上的配置。

+啟用 -禁用

-XX:+PrintGC使用這個參數,虛擬機啟動後,只要遇到GC就會打印日誌。

-XX: +UseSerialGC配置串行回收器

-XX:+PrintGCDetails可以查看詳細信息,包括各個區的情況

-Xms:設置java程序啟動時初始化堆大小

-Xmx: 設置java程序能獲得的最大堆大小。

-XX:+PrintCommandLineFlags:可以將隱式或者顯示傳給虛擬機的參數輸出

初始值與最大值配置的一樣可減少GC的回收次數。

新生代配置:

Xmn:設置新生代的大小,這個參數對GC行為有很大的影響,占整個堆空間的1/3到1/4左右。

-XX:用來設置新生代中eden空間和from/to空間的比例,含義-XX:SurvivorRatioe=eden/from=eden/to

實例2:

不同的堆分布情況,對系統執行會產生一定的影響,在實際工作中,應該根據系統的特點做出合理的配置,基本策略:盡可能將對象預留在新生代,減少老年代的GC次數。除了可以設置新生代的絕對大小(-Xmn),還可以使用(-XX:NewRatio)設置新生代和老年代的比例:-XX:NewRatio=老年代/新生代

堆溢出處理:

如下的配置可將溢出的信息打印到路徑下,可copy文件到eclipse下的memory analyer插件查看

技術分享圖片

-Xss指定線程的最大棧空間,參數決定了函數可調用的最大深度

方法區:

和java堆一樣,是所有線程共享的內存區域,它用於保存系統的類信息,可以保存多少信息可以對其進行配置,在默認情況下,-XX:MaxPremSize為64MB,如果系統運行時生產大量的類就需要設置一個相對合適的方法區,以避免永久區內存溢出。

直接內存配置:

廣泛用在NIO中,直接跳過java堆。

垃圾回收概念和其算法:

垃圾回收有很多算法:如引用計數法、標記壓縮法、

引用計數:被引用+1 失去引用 -1 遇到循環或者遞歸浪費性能。

標記清除法:被標記的時候由於JVM不會清除完全,會有碎片的問題。比如1M需要標誌清除,但是可能JVM只能清除0.999M。

復制算法(新生代) from區to區相互轉換角色。

標記壓縮法(老年代):在標記清除的基礎下進行壓縮,壓縮到內存的一端進行清除防止碎片的問題。

分代算法:根據對象的特點把內存分為N塊,而後根據每個內存的特點使用不同的算法。

分區算法:oracle新的概念,主要講整個內存分為N多個小的獨立空間,每個小空間都可以獨立使用。減少GC停頓。

GC停頓:GC回收的時候會讓所有應用的線程進入停頓狀態,回收完成後再繼續。

對象如何進入老年代:

-XX:MaxThnuringThreshold, 默認15次。

-XX:PretenureSizeThreshold指定進入老年代的對象大小。要註意TLAB區域優先分配空間。

TLAB:每一個線程都會產生一個TLAB區,為了加速對象分配而生的。每一個TLAB區來避免多線程沖突的問題,提高對象分配的效率。一般不會太大。

-XX:+UseTLAB使用TLAB區。默認使用。

技術分享圖片

JVM概念以及常用設置