java進階五(jvm)

一、JVM
    1、定義
       (1)、概念
            是運行在你係統上的另一個進程,也需要內存來完成它的運 行時操作。
        
        JVM本身是硬件的一層軟件抽象,在這之上才能夠運行Java程序,也纔有了我們所說的平臺獨立性以及WORA(一次編寫,處處運 行)

       (2)、種類
            Oralce-Sun Hotspot

            Oralce JRockit

            IBM J9

            Taobao JVM(淘寶)
        
            注: 正常使用oracle的jdk,所以就是 Hotspot Jvm, 以下內容 只講 Hotspot Jvm

       (3)、組成(一種說法)
            堆

            方法區(非堆)

            JVM棧

            本地棧

            PC寄存器

    2、堆                            --->            jvm參數:-Xms和-Xmx
       (1)、作用
            a、堆是實例化的對象所存儲地方

            b、由所有線程共享

            c、當堆耗盡的時候,JVM會拋出java.lang.OutOfMemoryError 異常

       (2)、組成
        a、Eden區                        --->            jvm參數:-XX:NewSize和-XX:MaxNewSize
           主要是用來存放新生的對象,由新生代GC(垃圾回收器)進行清理

        b、兩個Survivor區                    --->            jvm參數:-XX:SurvivorRatio
           歷經了Eden區的垃圾回收仍能存活下來的依舊存在引用的對象

        c、老年代(old)
           歷經了Eden區和Survivor區的多次GC後仍然存活下來的對象( 一直存在引用),由老年代GC(major GC)進行清理

    3、方法區(又稱 非堆區域)
       (1)、作用
            a、用於存儲已被虛擬機加載的類型信息、常量、靜態變量、即時編譯後的代碼等信息
        
            b、由所有線程共享

       (2)、組成
        a、持久代(permgen)                    --->            jvm參數:-XX:PermSize及 -XX:MaxPermSize
           存儲包括類定義,結構,字段,方法(數據及代碼)以及常量在內的類相關數據。

           注: 在很多虛擬機相關文檔中,也將其稱之爲"永久域"(permanent heap),作爲堆空間的一部分存在。(個人定位: 此說法不夠精準)
           
               JDK8 HotSpot JVM 移除永久域,使用本地內存來存儲類元數據信息並稱之爲:元空間(Metaspace),由參數 -XX:MetaspaceSize和-XX:MaxMetaspaceSize 指定,如無指定則動態調整。
        
        b、代碼緩存(code cache)
           用來存儲編譯後的代碼,編譯後的代碼就是本地代碼(硬件相關的),它是由JIT(Just In Time)編譯器生成的。

       注: 永久域其實是一個獨立域並且不認爲是堆的一部分。

    4、JVM棧                            --->            jvm參數:-Xss
       (1)、作用
            a、和Java類中的方法密切相關

            b、存儲局部變量以及方法調用的中間結果及返回值

            c、Java中的每個線程都有自己專屬的棧,這個棧是別的線程無法訪問的。

    5、本地棧
       (1)、作用
            a、用於本地方法(非Java代碼)

            b、按線程分配

    6、PC寄存器
       (1)、作用
            a、特定線程的程序計數器

            b、包含JVM正在執行的指令的地址(如果是本地方法的話它的值則未定義)

二、Jvm垃圾收集器
    1、基礎概念
       (1)、串行 (Sequential)
            指兩個或者多個事件順序執行

       (2)、併發 (Concurrent)
            指兩個或多個事件在同一時間間隔內發生

        a、在操作系統中
           指一個時間段中有幾個程序都處於已啓動運行到運行完畢之間,且這幾個程序都是在同一個處理機上運行,但任一個時刻點上只有一個程序在處理機上運行。
           ①程序與計算不再一一對應,一個程序副本可以有多個計算

           ②併發程序之間有相互制約關係,直接制約體現爲一個程序需要另一個程序的計算結果,間接制約體現爲多個程序競爭某一資源,如處理機、緩衝區等。

           ③併發程序在執行中是走走停停,斷續推進的。

        b、在網絡服務器上
           併發是指同一時刻能處理的連接數

       (3)、並行 (parallel)
            指兩個或者多個事件在同一時刻發生

       (4)、分佈式(distributed)
            分佈式在並行處理的基礎上,強調任務正在執行的物理設備,如處理器、內存等等硬件,在物理上是分開的。

       (5)、區別
        併發和並行從宏觀上來講都是同時處理多路請求的概念,更加強調多個任務同時在運行。

        併發>並行>分佈式

        併發在單核和多核都可存在,就是同一時間有多個可以執行的進程

        並行是指同一時間多個進程在微觀上都在真正的執行,這就只有在多核的情況下了。

    2、分類
       (1)、串行
            處理小型數據,jdk1.4之前默認使用

       (2)、併發

       (3)、並行
            1.5和1.5之後使用

三、JVM主要參數的作用
    1、堆設置
       -Xms                    --->            設置jvm內存的初始大小                        --->        -Xms512m (代表jvm最少用 512m內存)

       -Xmx                    --->            設置jvm內存(初始堆)的最大值                    --->        一般爲服務器的3/4內存量,不應該超過物理內存的90%。

       -Xmn                    --->            設置年輕代的大小(只針對 jdk1.4,後被廢棄)            --->        Sun官方推薦配置爲整個堆的3/8。

       -Xss                    --->            設置每個線程的堆棧大小                        --->        在相同物理內存下,減小這個值能生成更多的線程(默認512k)

       -XX:NewSize                --->            設置年輕代的初始值

       -XX:MaxNewSize                --->            設置年輕代的最大值

       -XX:PermSize                --->            設置永久域的初始值

       -XX:MaxPermSize                --->            設置永久域的最大值

       -XX:NewRatio                --->            設置年輕代與老年代之比                        --->        -XX:NewRatio = 4就表示年輕代與老年代之比爲1:4

       -XX:SurvivorRatio            --->            設置年輕代中Eden區與兩個Survivor區的比值。

    2、收集器設置
       -XX:+UseSerialGC                --->            設置串行收集器

       -XX:+UseParallelGC            --->            設置並行收集器(僅對年輕代有效)

       -XX:+UseParallelOldGC            --->            設置並行老年代收集器(JDK6.0起支持)

       -XX:+UseConcMarkSweepGC            --->            設置併發收集器

    3、垃圾回收統計信息
       -XX:+PrintGC

       -XX:+PrintGCDetails

       -XX:+PrintGCTimeStamps

       -Xloggc:filename

    4、併發收集器設置
       -XX:+CMSIncrementalMode            --->            設置爲增量模式。適用於單CPU情況。

       -XX:+UseCMSCompactAtFullCollection     --->            設置運行多少次GC以後對內存空間進行壓縮、整理。
                                        注: 併發收集器不對內存空間進行壓縮、整理,所以運行一段時間以後會產生“碎片”,使得運行效率降低。

       -XX:+UseCMSCompactAtFullCollection     --->            打開對老年代的壓縮。可能會影響性能,但是可以消除碎片

       -XX:ParallelGCThreads             --->            設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數

    5、並行收集器設置
       -XX:ParallelGCThreads            --->            設置並行收集器收集時使用的CPU數。並行收集線程數。

       -XX:MaxGCPauseMillis            --->            設置並行收集最大暫停時間

       -XX:GCTimeRatio                --->            設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)

    6、jboss配置示例
       (1)、生產環境8G內存
            if [ "x$JAVA_OPTS" = "x" ]; then   
               JAVA_OPTS="-Xss128k -Xms6000m -Xmx6000m -XX:MaxNewSize=512m -XX:MaxPermSize=512M -XX:+UseParallelGC -XX:ParallelGCThreads=16
              -XX:+UseParallelOldGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"   
            fi   
       
       (2)、生產環境4G內存
            if [ "x$JAVA_OPTS" = "x" ]; then   
               JAVA_OPTS="-Xss128k -Xms3000m -Xmx3000m -XX:MaxNewSize=256m -XX:MaxPermSize=256m -XX:+UseParallelGC -XX:ParallelGCThreads=16
              -XX:+UseParallelOldGC -Dsun.rmi.dgc.client.gcInterval=3600000 -Dsun.rmi.dgc.server.gcInterval=3600000"   
            fi   

三、JVM常見錯誤
    1、java.lang.OutOfMemoryError
       (1)、原因
            這個主要就是JVM參數沒有配好引起的

       (2)、錯誤類型
        a、java.lang.OutOfMemoryError: Java heap space
           是有關堆內存的內存溢出,可以同過配置-Xms和-Xmx參數來設置。

        b、java.lang.OutOfMemoryError: PermGen space
           是有關永久域的內存溢出,可以通過配置-XX:MaxPermSize來設置。

    2、示例
        JAVA_OPTS="-Xms256m -Xmx2048m -XX:NewSize=256m -XX:MaxNewSize=512m -XX:PermSize=128m -XX:MaxPermSize=256m
    -XX:+UseConcMarkSweepGC -XX:+CMSPermGenSweepingEnabled -XX:+CMSClassUnloadingEnabled -Djboss.platform.mbeanserver"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章