JVM總結(jié)

JVM總結(jié)

一、Server和Client啟動(dòng)模式

1.1 serverVM的初始堆空間要大,啟動(dòng)比較緩慢但是運(yùn)行速度快一般用于web開(kāi)發(fā)。

1.2 clientVM分配的初始堆空間要小一點(diǎn),啟動(dòng)快但是運(yùn)行沒(méi)有server的快,一般用于java桌面級(jí)應(yīng)用開(kāi)發(fā)。

(注意:在windows下無(wú)論硬件配置如何,只要是32位的操作系統(tǒng)默認(rèn)的啟動(dòng)都是clientVM的,同時(shí)64位的操作系統(tǒng)無(wú)論是windows還是其他的操作系統(tǒng)只支持server模式的啟動(dòng),其他操作系統(tǒng)則是看硬件配置,一般2G內(nèi)存,且同時(shí)又2個(gè)cpu的話(huà)就是默認(rèn)啟動(dòng)server)

二、java的三種參數(shù)

  1. 標(biāo)準(zhǔn)參數(shù)

    標(biāo)準(zhǔn)的參數(shù),在jvm中穩(wěn)定的,在后續(xù)的版本中也會(huì)保留的參數(shù),一般java -help查看所有的標(biāo)準(zhǔn)參數(shù)

    用法: java [-options] class [args...]
               (執(zhí)行類(lèi))
       或  java [-options] -jar jarfile [args...]
               (執(zhí)行 jar 文件)
    其中選項(xiàng)包括:
        -d32          使用 32 位數(shù)據(jù)模型 (如果可用)
        -d64          使用 64 位數(shù)據(jù)模型 (如果可用)
        -server       選擇 "server" VM
                      默認(rèn) VM 是 server.
    
        -cp <目錄和 zip/jar 文件的類(lèi)搜索路徑>
        -classpath <目錄和 zip/jar 文件的類(lèi)搜索路徑>
                      用 ; 分隔的目錄, JAR 檔案
                      和 ZIP 檔案列表, 用于搜索類(lèi)文件。
        -D<名稱(chēng)>=<值>
                      設(shè)置系統(tǒng)屬性
        -verbose:[class|gc|jni]
                      啟用詳細(xì)輸出
        -version      輸出產(chǎn)品版本并退出
        -version:<值>
                      警告: 此功能已過(guò)時(shí), 將在
                      未來(lái)發(fā)行版中刪除。
                      需要指定的版本才能運(yùn)行
        -showversion  輸出產(chǎn)品版本并繼續(xù)
        -jre-restrict-search | -no-jre-restrict-search
                      警告: 此功能已過(guò)時(shí), 將在
                      未來(lái)發(fā)行版中刪除。
                      在版本搜索中包括/排除用戶(hù)專(zhuān)用 JRE
        -? -help      輸出此幫助消息
        -X            輸出非標(biāo)準(zhǔn)選項(xiàng)的幫助
        -ea[:<packagename>...|:<classname>]
        -enableassertions[:<packagename>...|:<classname>]
                      按指定的粒度啟用斷言
        -da[:<packagename>...|:<classname>]
        -disableassertions[:<packagename>...|:<classname>]
                      禁用具有指定粒度的斷言
        -esa | -enablesystemassertions
                      啟用系統(tǒng)斷言
        -dsa | -disablesystemassertions
                      禁用系統(tǒng)斷言
        -agentlib:<libname>[=<選項(xiàng)>]
                      加載本機(jī)代理庫(kù) <libname>, 例如 -agentlib:hprof
                      另請(qǐng)參閱 -agentlib:jdwp=help 和 -agentlib:hprof=help
        -agentpath:<pathname>[=<選項(xiàng)>]
                      按完整路徑名加載本機(jī)代理庫(kù)
        -javaagent:<jarpath>[=<選項(xiàng)>]
                      加載 Java 編程語(yǔ)言代理, 請(qǐng)參閱 java.lang.instrument
        -splash:<imagepath>
                      使用指定的圖像顯示啟動(dòng)屏幕
    
  1. -X非標(biāo)準(zhǔn)參數(shù)

    不穩(wěn)定的參數(shù),只在這個(gè)版本中使用,在后續(xù)的版本中可能就被棄用了的一般用java -X查看

      -Xmixed           混合模式執(zhí)行 (默認(rèn))
        -Xint             僅解釋模式執(zhí)行
        -Xbootclasspath:<用 ; 分隔的目錄和 zip/jar 文件>
                          設(shè)置搜索路徑以引導(dǎo)類(lèi)和資源
        -Xbootclasspath/a:<用 ; 分隔的目錄和 zip/jar 文件>
                          附加在引導(dǎo)類(lèi)路徑末尾
        -Xbootclasspath/p:<用 ; 分隔的目錄和 zip/jar 文件>
                          置于引導(dǎo)類(lèi)路徑之前
        -Xdiag            顯示附加診斷消息
        -Xnoclassgc       禁用類(lèi)垃圾收集
        -Xincgc           啟用增量垃圾收集
        -Xloggc:<file>    將 GC 狀態(tài)記錄在文件中 (帶時(shí)間戳)
        -Xbatch           禁用后臺(tái)編譯
        -Xms<size>        設(shè)置初始 Java 堆大小
        -Xmx<size>        設(shè)置最大 Java 堆大小
        -Xss<size>        設(shè)置 Java 線(xiàn)程堆棧大小
        -Xprof            輸出 cpu 配置文件數(shù)據(jù)
        -Xfuture          啟用最嚴(yán)格的檢查, 預(yù)期將來(lái)的默認(rèn)值
        -Xrs              減少 Java/VM 對(duì)操作系統(tǒng)信號(hào)的使用 (請(qǐng)參閱文檔)
        -Xcheck:jni       對(duì) JNI 函數(shù)執(zhí)行其他檢查
        -Xshare:off       不嘗試使用共享類(lèi)數(shù)據(jù)
        -Xshare:auto      在可能的情況下使用共享類(lèi)數(shù)據(jù) (默認(rèn))
        -Xshare:on        要求使用共享類(lèi)數(shù)據(jù), 否則將失敗。
        -XshowSettings    顯示所有設(shè)置并繼續(xù)
        -XshowSettings:all
                          顯示所有設(shè)置并繼續(xù)
        -XshowSettings:vm 顯示所有與 vm 相關(guān)的設(shè)置并繼續(xù)
        -XshowSettings:properties
                          顯示所有屬性設(shè)置并繼續(xù)
        -XshowSettings:locale
                          顯示所有與區(qū)域設(shè)置相關(guān)的設(shè)置并繼續(xù)
    
    -X 選項(xiàng)是非標(biāo)準(zhǔn)選項(xiàng), 如有更改, 恕不另行通知。
    

    非標(biāo)準(zhǔn)參數(shù)最常用的三個(gè)參數(shù)(java的執(zhí)行方式

    • -Xint(解釋執(zhí)行)

    • -Xcomp(將所有代碼強(qiáng)制編譯成本地代碼再執(zhí)行比解釋執(zhí)行快十幾倍,但是會(huì)損耗JIT[即時(shí)編譯器]編譯器的功能)

    • -Xmixed(混合執(zhí)行,也是默認(rèn)的執(zhí)行方式)

    PS C:\Users\11063\Desktop\java> java -showversion -Xint Test_JVM
    java version "1.8.0_91"
    Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, interpreted mode)
    
    haizi
    PS C:\Users\11063\Desktop\java> java -showversion -Xcomp Test_JVM
    java version "1.8.0_91"
    Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, compiled mode)
    
    haizi
    PS C:\Users\11063\Desktop\java> java -showversion -Xmixed Test_JVM
    java version "1.8.0_91"
    Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
    Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)
    
    haizi
    PS C:\Users\11063\Desktop\java>
    
  1. -XX(使用率較高的非標(biāo)準(zhǔn)參數(shù))

    而也是不穩(wěn)定的參數(shù),但是使用頻率很高,一般用于jvm的調(diào)優(yōu)。

    • -Xms<size> 設(shè)置初始 Java 堆大小

      eg:-Xms2048m:等價(jià)于-XX:MaxHeapSize

    • -Xmx<size> 設(shè)置最大 Java 堆大小

    • eg:-Xmx512m:等價(jià)于-XX:InitialHeapSize

      這兩個(gè)參數(shù)是用的比較多的,對(duì)于jvm調(diào)優(yōu)來(lái)說(shuō)。

    • jps -l 查看jvm虛擬機(jī)后臺(tái)運(yùn)行的程序

    • jinfo -flag <參數(shù)名><進(jìn)程id>查看具體信息

C:\Users\11063>jps -l
12452
15796 org.jetbrains.jps.cmdline.Launcher
13192 edu.haizi.demo.DemoApplication
6552 sun.tools.jps.Jps
2636 org.jetbrains.idea.maven.server.RemoteMavenServer

C:\Users\11063>jinfo flag 13192
Attaching to core 13192 from executable flag, please wait...
Error attaching to core file: Windbg Error: OpenDumpFile failed!
sun.jvm.hotspot.debugger.DebuggerException: Windbg Error: OpenDumpFile failed!
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach0(Native Method)
        at sun.jvm.hotspot.debugger.windbg.WindbgDebuggerLocal.attach(WindbgDebuggerLocal.java:160)
        at sun.jvm.hotspot.HotSpotAgent.attachDebugger(HotSpotAgent.java:673)
        at sun.jvm.hotspot.HotSpotAgent.setupDebuggerWin32(HotSpotAgent.java:569)
        at sun.jvm.hotspot.HotSpotAgent.setupDebugger(HotSpotAgent.java:335)
        at sun.jvm.hotspot.HotSpotAgent.go(HotSpotAgent.java:304)
        at sun.jvm.hotspot.HotSpotAgent.attach(HotSpotAgent.java:156)
        at sun.jvm.hotspot.tools.Tool.start(Tool.java:191)
        at sun.jvm.hotspot.tools.Tool.execute(Tool.java:118)
        at sun.jvm.hotspot.tools.JInfo.main(JInfo.java:138)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at sun.tools.jinfo.JInfo.runTool(JInfo.java:108)
        at sun.tools.jinfo.JInfo.main(JInfo.java:76)

三、Jvm的內(nèi)存模型

? 這里拿jdk1.7和1.8做比較

jdk1.7的內(nèi)存模型

jdk1.7內(nèi)存模型.png
  • Young年輕代:其中Eden區(qū)用于存放生成的活動(dòng)對(duì)象,當(dāng)Eden區(qū)滿(mǎn)了就會(huì)將對(duì)象移動(dòng)到Survivor區(qū),另外一個(gè)Survivor區(qū)則留作垃圾回收時(shí)復(fù)制對(duì)象使用,當(dāng)Survivor中的對(duì)象還沒(méi)有被來(lái)及回收就會(huì)將該對(duì)象移動(dòng)到老年區(qū)。

  • Tenured老年區(qū):一般保存一些生命周期比較長(zhǎng)的對(duì)象,當(dāng)系統(tǒng)中才采用appliaction級(jí)別的緩存時(shí)該對(duì)象就會(huì)被放入老年區(qū)。

  • Perm永久代:主要用于保存class,method,filed對(duì)象,這部分空間不會(huì)溢出,除非一次性加載了很多類(lèi),不過(guò)涉及到熱部署得時(shí)候,會(huì)遇到OutOfMemoryErro:Germ space的錯(cuò)誤。

  • Virtual區(qū),最大內(nèi)存和初始內(nèi)存的差值就是Virtual區(qū)。

    jdk1.8內(nèi)存模型

jdk1.8內(nèi)存模型.png

特別說(shuō)明這里的Metaspace不是占用的虛擬機(jī)的內(nèi)存空間,而是占用的本地的內(nèi)存空間。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Java 虛擬機(jī)(Java virtual machine,JVM)是運(yùn)行 Java 程序必不可少的機(jī)制。JVM實(shí)...
    Rick617閱讀 976評(píng)論 0 0
  • 內(nèi)存區(qū)域 Java虛擬機(jī)在執(zhí)行Java程序的過(guò)程中會(huì)把它所管理的內(nèi)存劃分為若干個(gè)不同的數(shù)據(jù)區(qū)域。這些區(qū)域都有各自的...
    wustor閱讀 446評(píng)論 0 2
  • 有些內(nèi)存區(qū)域因?yàn)榉椒ńY(jié)束或者線(xiàn)程結(jié)束時(shí)就自動(dòng)回收了,所以并不需要考慮它們的回收。主要關(guān)注的是對(duì)java堆和方法區(qū)的...
    pluss閱讀 281評(píng)論 1 1
  • JVM (Java Virtual Machine),在java生態(tài)圈中具有重要地位,不僅支持Java還支持Kot...
    Lcap閱讀 264評(píng)論 0 2
  • 11月24日 星期六 晴 今天中午和大寶去買(mǎi)了床墊子,答應(yīng)了大寶已經(jīng)好幾天了一直沒(méi)有抽出空來(lái)去給他買(mǎi),...
    開(kāi)心鎖吧閱讀 178評(píng)論 0 0

友情鏈接更多精彩內(nèi)容