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ù)
-
標(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)屏幕
-
-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>
-
-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)存模型

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)存模型

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