# JVM ä¸ Java ä½ç³»ç»æ
ä½ æ¯å¦ä¹éå°è¿è¿äºé®é¢ï¼
- è¿è¡çº¿ä¸ç³»ç»çªç¶å¡æ»ï¼ç³»ç»æ æ³è®¿é®ï¼çè³ç´æ¥OOM
- æ³è§£å³çº¿ä¸JVM GCé®é¢ï¼ä½å´æ ä»ä¸æ
- æ°é¡¹ç®ä¸çº¿ï¼å¯¹åç§JVMåæ°è®¾ç½®ä¸è¸æµé¼ï¼ç´æ¥é»è®¤ï¼ç¶åå°±JJäº
- æ¯æ¬¡é¢è¯é½è¦éæ°èä¸éJVMçä¸äºåçæ¦å¿µæ§ä¸è¥¿
è¿æ®µå¹¿åè¯åç好ï¼è¶çå¨å®¶åå
¬å¦ä¹ ä¸JVMï¼å
ååºæ´ä½ç¥è¯ç¹

Javaå¼åé½ç¥éJVMæ¯Javaèææºï¼ä¸å¦æ¶è¿ç¨è¿çVMä¹å«èææºï¼å
æ¯è¾ä¸æ³¢
### èææºä¸Javaèææº
æè°èææºï¼Virtual Machineï¼ï¼å°±æ¯ä¸å°èæçè®¡ç®æºã宿¯ä¸æ¬¾è½¯ä»¶ï¼ç¨æ¥æ§è¡ä¸ç³»åèæè®¡ç®æºæä»¤ã大ä½ä¸ï¼èææºå¯ä»¥å为**ç³»ç»èææº**å**ç¨åºèææº**ã
- Visaual Boxï¼VMware å°±å±äºç³»ç»èææºï¼å®ä»¬å®å
¨æ¯å¯¹ç©çè®¡ç®æºç仿çï¼æä¾äºä¸ä¸ªå¯è¿è¡å®æ´æä½ç³»ç»ç软件平å°
- ç¨åºèææºçå
¸åä»£è¡¨å°±æ¯ Java èææºï¼å®ä¸é¨ä¸ºæ§è¡åä¸ªè®¡ç®æºç¨åºè设计ï¼å¨ Java èææºä¸æ§è¡çæä»¤æä»¬ç§°ä¸º Java åèç æä»¤
## JVM æ¯ä»ä¹
`JVM` æ¯ `Java Virtual Machine`ï¼**Javaèææº**)ç缩åï¼`JVM`æ¯ä¸ç§ç¨äºè®¡ç®è®¾å¤ç**è§è**ï¼å®æ¯ä¸ä¸ª**èæ**çè®¡ç®æºï¼æ¯éè¿å¨å®é
çè®¡ç®æºä¸ä»¿ç模æåç§è®¡ç®æºåè½æ¥å®ç°çã
Java èææºæ¯äºè¿å¶åèç çè¿è¡ç¯å¢ï¼è´è´£è£
è½½**åèç **å°å
¶å
é¨ï¼è§£é/ç¼è¯ä¸ºå¯¹åºå¹³å°çæºå¨æä»¤æ§è¡ãæ¯ä¸æ¡ Java æä»¤ï¼Java èææºè§èä¸é½æè¯¦ç»å®ä¹ï¼å¦æä¹åæä½æ°ï¼æä¹å¤çæä½æ°ï¼å¤çç»ææ¾å¨åªéã
### ç¹ç¹
- 䏿¬¡ç¼è¯ï¼å°å¤è¿æ¬¡ï¼è·¨å¹³å°ï¼
- èªå¨å
å管ç
- èªå¨åå¾åæ¶åè½
### åèç
æä»¬å¹³æ¶æè¯´ç java åèç ï¼æçæ¯ç¨ java è¯è¨ç¼åçåèç ï¼åç¡®ç说任ä½è½å¨ jvm å¹³å°ä¸æ§è¡çåèç æ ¼å¼é½æ¯ä¸æ ·çï¼æä»¥åºè¯¥ç»ç§°ä¸º **jvmåèç **ã
ä¸åçç¼è¯å¨å¯ä»¥ç¼è¯åºç¸åçåèç æä»¶ï¼åèç æä»¶ä¹å¯ä»¥å¨ä¸åç jvm ä¸è¿è¡ã
Java èææºä¸ Java è¯è¨æ²¡æå¿
ç¶çèç³»ï¼å®åªä¸ç¹å®çäºè¿å¶æä»¶æ ¼å¼ââClass æä»¶æ ¼å¼å
³èï¼Class æä»¶ä¸å
å«äº Java èææºæä»¤éï¼æè
称为åèç ãBytecodesï¼å符å·éï¼è¿æä¸äºå
¶ä»è¾
å©ä¿¡æ¯ã
### Java ä»£ç æ§è¡è¿ç¨

## JVM çä½ç½®
JVM æ¯è¿è¡å¨æä½ç³»ç»ä¹ä¸çï¼å®ä¸ç¡¬ä»¶æ²¡æç´æ¥ç交äºã
`JDK`(Java Development Kit) æ¯ `Java` è¯è¨ç软件å¼åå·¥å
·å
ï¼`SDK`ï¼ã`JDK` ç©çåå¨ï¼æ¯ ` Java Language`ã`Tools`ã`JRE` å `JVM` çä¸ä¸ªéåã


## JVM æ´ä½ç»æ

## JVM çæ¶ææ¨¡å
Java ç¼è¯å¨è¾å
¥çæä»¤æµåºæ¬ä¸æ¯ä¸ç§åºäº**æ çæä»¤éæ¶æ**ï¼å¦å¤ä¸ç§æä»¤éæ¶æåæ¯åºäº**å¯åå¨çæä»¤éæ¶æ**ã
ä¸¤ç§æ¶æä¹é´çåºå«ï¼
- åºäºæ 弿¶æçç¹ç¹
- 设计åå®ç°æ´ç®åï¼éç¨äºèµæºåéçç³»ç»ï¼
- é¿å¼äºå¯åå¨çåé
é¾é¢ï¼ä½¿ç¨é¶å°åæä»¤æ¹å¼åé
ï¼
- æä»¤æµä¸çæä»¤å¤§é¨åæ¯é¶å°åæä»¤ï¼å
¶æ§è¡è¿ç¨ä¾èµäºæä½æ ãæä»¤éæ´å°ï¼ç¼è¯å¨å®¹æå®ç°ï¼
- ä¸éè¦ç¡¬ä»¶æ¯æï¼å¯ç§»æ¤æ§æ´å¥½ï¼æ´å¥½å®ç°è·¨å¹³å°
- åºäºå¯å卿¶æçç¹ç¹
- å
¸åçåºç¨æ¯X86çäºè¿å¶æä»¤éï¼æ¯å¦ä¼ ç»ç PC 以å Android ç Davlik èææºï¼
- æä»¤éæ¶æåå®å
¨ä¾èµç¡¬ä»¶ï¼å¯ç§»æ¤æ§å·®ï¼
- æ§è½ä¼ç§åæ§è¡æ´é«æï¼
- è±è´¹æ´å°çæä»¤å»å®æä¸é¡¹æä½ï¼
- 大é¨åæ
åµä¸ï¼åºäºå¯å卿¶æçæä»¤éå¾å¾é½ä»¥ä¸å°åæä»¤ãäºå°åæä»¤åä¸å°åæä»¤ä¸ºä¸»ï¼èåºäºæ 弿¶æçæä»¤éå´æ¯ä»¥é¶å°åæä»¤ä¸ºä¸»
ç±äºè·¨å¹³å°æ§ç设计ï¼Java çæä»¤é½æ¯æ ¹æ®æ æ¥è®¾è®¡çãä¸åå¹³å° CPU æ¶æä¸åï¼æä»¥ä¸è½è®¾è®¡ä¸ºåºäºå¯åå¨çï¼ä¼ç¹æ¯è·¨å¹³å°ï¼æä»¤éå°ï¼ç¼è¯å¨å®¹æå®ç°ï¼ç¼ºç¹æ¯æ§è½ä¸éï¼å®ç°åæ ·çåè½éè¦æ´å¤çæä»¤ã
##### åæåºäºæ 弿¶æçJVMä»£ç æ§è¡è¿ç¨
è¿å
¥ class æä»¶æå¨ç®å½ï¼æ§è¡`javap -v xx.class`åè§£æï¼æè
éè¿IDEAæä»¶`Jclasslib`ç´æ¥æ¥çï¼ï¼å¯ä»¥çå°å½å类对åºç code åºï¼æ±ç¼æä»¤ï¼ãæ¬å°åé表ãå¼å¸¸è¡¨å代ç è¡åç§»éæ å°è¡¨ã叏鿱 çä¿¡æ¯ã

以ä¸å¾ä¸ç 1+2 为ä¾è¯´æ:
```
Classfile /Users/starfish/workspace/myCode/starfish-learning/starfish-learn/target/classes/priv/starfish/jvm/JVM1.class
Last modified 2020-2-7; size 487 bytes
MD5 checksum 1a9653128b55585b2745270d13b17aaf
Compiled from "JVM1.java"
public class priv.starfish.jvm.JVM1
SourceFile: "JVM1.java"
minor version: 0
major version: 52
flags: ACC_PUBLIC, ACC_SUPER
Constant pool:
#1 = Methodref #3.#22 // java/lang/Object."":()V
#2 = Class #23 // priv/starfish/jvm/JVM1
#3 = Class #24 // java/lang/Object
#4 = Utf8
#5 = Utf8 ()V
#6 = Utf8 Code
#7 = Utf8 LineNumberTable
#8 = Utf8 LocalVariableTable
#9 = Utf8 this
#10 = Utf8 Lpriv/starfish/jvm/JVM1;
#11 = Utf8 main
#12 = Utf8 ([Ljava/lang/String;)V
#13 = Utf8 args
#14 = Utf8 [Ljava/lang/String;
#15 = Utf8 i
#16 = Utf8 I
#17 = Utf8 j
#18 = Utf8 k
#19 = Utf8 MethodParameters
#20 = Utf8 SourceFile
#21 = Utf8 JVM1.java
#22 = NameAndType #4:#5 // "":()V
#23 = Utf8 priv/starfish/jvm/JVM1
#24 = Utf8 java/lang/Object
{
public priv.starfish.jvm.JVM1();
flags: ACC_PUBLIC
Code:
stack=1, locals=1, args_size=1
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: return
LineNumberTable:
line 3: 0
LocalVariableTable:
Start Length Slot Name Signature
0 5 0 this Lpriv/starfish/jvm/JVM1;
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=2, locals=4, args_size=1
0: iconst_1 //åå·åçæ°å表示ç¨åºè®¡æ°å¨çæ°ï¼å¸¸é1å
¥æ
1: istore_1 //ä¿åå°1çæä½æ°æ ä¸,è¿éç1表示æä½æ°æ çç´¢å¼ä½ç½®
2: iconst_2
3: istore_2
4: iload_1 //å è½½
5: iload_2
6: iadd //常éåºæ ï¼æ±å
7: istore_3 //åå¨å°ç´¢å¼ä¸º3çæä½æ°æ
8: return
LineNumberTable:
line 6: 0
line 7: 2
line 8: 4
line 9: 8
LocalVariableTable:
Start Length Slot Name Signature
0 9 0 args [Ljava/lang/String;
2 7 1 i I
4 5 2 j I
8 1 3 k I
MethodParameters: length = 0x5
01 00 0D 00 00
}
```
## JVM çå½å¨æ
#### èææºçå¯å¨
Java èææºçå¯å¨æ¯éè¿å¼å¯¼ç±»å è½½å¨ï¼Bootstrap Class Loaderï¼å建ä¸ä¸ªåå§ç±»ï¼initial classï¼æ¥å®æçï¼è¿ä¸ªç±»æ¯ç±èææºçå
·ä½å®ç°æå®çã
#### èææºçæ§è¡
- ä¸ä¸ªè¿è¡ä¸ç Java èææºæçä¸ä¸ªæ¸
æ°çä»»å¡ï¼æ§è¡ Java ç¨åº
- ç¨åºå¼å§æ§è¡æ¶å®æè¿è¡ï¼ç¨åºç»ææ¶å®å°±åæ¢
- æ§è¡ä¸ä¸ªæè°ç Java ç¨åºçæ¶åï¼çæ£æ§è¡çæ¯ä¸ä¸ªå«å Java èææºçè¿ç¨
- ä½ å¨åä¸å°æºå¨ä¸è¿è¡ä¸ä¸ªç¨åºï¼å°±ä¼æä¸ä¸ªè¿è¡ä¸ç Java èææºã Java èææºæ»æ¯å¼å§äºä¸ä¸ª**main()**æ¹æ³ï¼è¿ä¸ªæ¹æ³å¿
é¡»æ¯å
¬æãè¿å voidãåªæ¥åä¸ä¸ªå符串æ°ç»ãå¨ç¨åºæ§è¡æ¶ï¼ä½ å¿
é¡»ç» Java èææºææè¿ä¸ªå
å« main() æ¹æ³çç±»åã
#### èææºçéåº
æä»¥ä¸å ç§æ
åµï¼
- ç¨åºæ£å¸¸æ§è¡ç»æ
- ç¨åºå¨æ§è¡è¿ç¨ä¸éå°äºå¼å¸¸æé误èå¼å¸¸ç»æ¢
- ç±äºæä½ç³»ç»åºç°é误èå¯¼è´ Java èææºè¿ç¨ç»æ¢
- æçº¿ç¨è°ç¨ Runtime ç±»æ System ç±»ç exit æ¹æ³ï¼æ Runtime ç±»ç halt æ¹æ³ï¼å¹¶ä¸ Java å®å
¨ç®¡çå¨ä¹å
è®¸è¿æ¬¡ exit æ halt æä½
- 餿¤ä¹å¤ï¼JNI(Java Native Interface)è§èæè¿°äºç¨`JNI Invocation API`æ¥å è½½æå¸è½½ Java èææºæ¶ï¼Java èææºçéåºæ
åµ
## Java å JVM è§è
[Java Language and Virtual Machine Specifications](https://docs.oracle.com/javase/specs/index.html)
## JVM åå±åç¨
JDK çæ¬å级ä¸ä»
ä»
ä½ç°å¨è¯è¨ååè½ç¹æ§ä¸ï¼è¿å
æ¬äºå
¶ç¼è¯åæ§è¡ç Java èææºçå级ã
- 1990å¹´ï¼å¨ Sun è®¡ç®æºå
¬å¸ä¸ï¼ç± Patrick NaughtonãMikeSheridan å James Gosling é¢å¯¼çå°ç» Green Teamï¼å¼ååºçæ°çç¨åºè¯è¨ï¼å½å为 Oakï¼åæå½å为 Java
- 1995å¹´ï¼Sun æ£å¼åå¸ Java å HotJava 产åï¼Java 馿¬¡å
¬å¼äº®ç¸
- 1996 å¹´ï¼JDK 1.0 å叿¶ï¼æä¾äºçº¯è§£éæ§è¡ç Java èææºå®ç°ï¼Sun Classic VMã
- 1997 å¹´ï¼JDK 1.1 å叿¶ï¼èææºæ²¡æååæ´ï¼ä¾ç¶ä½¿ç¨ Sun Classic VM ä½ä¸ºé»è®¤çèææº
- 1998 å¹´ï¼JDK 1.2 å叿¶ï¼æä¾äºè¿è¡å¨ Solaris å¹³å°ç Exact VM èææºï¼ä½æ¤æ¶è¿æ¯ç¨ Sun Classic VM ä½ä¸ºé»è®¤ç Java èææºï¼åæ¶åå¸äºJSP/ServletãEJBè§èï¼ä»¥åå°JavaåæJ2EEãJ2SEãJ2ME
- 2000 å¹´ï¼JDK1.3 åå¸ï¼é»è®¤ç Java èææºç± Sun Classic VM æ¹ä¸º Sun HotSopt VMï¼è Sun Classic VM åä½ä¸ºå¤ç¨èææº
- 2002 å¹´ï¼JDK 1.4 åå¸ï¼Sun Classic VM éåºåç¨èææºèå°ï¼ç´æ¥ä½¿ç¨ Sun HotSpot VM ä½ä¸ºé»è®¤èææºä¸ç´å°ç°å¨
- 2003å¹´ï¼Java å¹³å°ç Scala æ£å¼åå¸ï¼åå¹´ Groovy ä¹å å
¥äº Java éµè¥
- 2004å¹´ï¼JDK1.5 åå¸ï¼åæ¶ JDK1.5 æ¹å为 JDK5.0
- 2006å¹´ï¼JDK6 åå¸ï¼åå¹´ï¼Java 弿ºå¹¶å»ºç«äº OpenJDKã顺çæç« ï¼Hotspot èææºä¹æä¸ºäº OpenJDK é»è®¤èææº
- 2008å¹´ï¼Oracle æ¶è´ BEAï¼å¾å°äº JRockit èææº
- 2010å¹´ï¼Oracle æ¶è´äº Sunï¼è·å¾ Java åæ å HotSpot èææº
- 2011å¹´ï¼JDK7 åå¸ï¼å¨ JDK1.7u4 ä¸ï¼æ£å¼å¯ç¨äºæ°çåå¾åæ¶å¨ G1
- 2014å¹´ï¼JDK8 åå¸ï¼ç¨å
ç©ºé´ MetaSpace åä»£äº PermGen
- 2017å¹´ï¼JDK9 åå¸ï¼å° G1设置为é»è®¤GCï¼æ¿ä»£CMS
### Sun Classic VM
- ä¸çä¸ç¬¬ä¸æ¬¾åç¨ Java èææºã1996å¹´éçJava1.0çåå¸èåå¸ï¼JDK1.4æ¶å®å
¨è¢«æ·æ±°ï¼
- è¿æ¬¾èææºå
é¨åªæä¾è§£éå¨ï¼
- å¦æä½¿ç¨JITç¼è¯å¨ï¼å°±éè¦è¿è¡å¤æã使¯ä¸æ¦ä½¿ç¨äºJITç¼è¯å¨ï¼JIT就伿¥ç®¡èææºçæ§è¡ç³»ç»ï¼è§£éå¨å°±ä¸åå·¥ä½ï¼è§£éå¨åç¼è¯å¨ä¸è½é
åå·¥ä½ï¼
- ç°å¨hotspotå
ç½®äºæ¤èææº
### Exact VM
- å®çæ§è¡ç³»ç»å·²ç»å
·å¤äºç°ä»£é«æ§è½èææºçéå½¢ï¼å¦çç¹æ¢æµãä¸¤çº§å³æ¶ç¼è¯å¨ãç¼è¯å¨ä¸è§£æå¨æ··å工使¨¡å¼çï¼
- 使ç¨åç¡®å¼å
å管çï¼èææºå¯ä»¥ç¥éå
åä¸æä¸ªä½ç½®çæ°æ®å
·ä½æ¯ä»ä¹ç±»åï¼
- å¨åä¸åºç¨ä¸åªåå¨äºå¾çæçæ¶é´å°±è¢«æ´ä¼ç§ç HotSpot VM æå代
### Sun HotSpot VM
- 宿¯ Sun JDK å OpenJDK 䏿另çèææºï¼ä¹æ¯ç®å使ç¨èå´æå¹¿ç Java èææºï¼
- ç»§æ¿äº Sun ä¹å两款åç¨èææºçä¼ç¹ï¼å¦åç¡®å¼å
å管çï¼ï¼ä¹ä½¿ç¨äºè®¸å¤èªå·±æ°çææ¯ä¼å¿ï¼å¦çç¹ä»£ç æ¢æµææ¯ï¼éè¿æ§è¡è®¡æ°å¨æ¾åºæå
·æç¼è¯ä»·å¼ç代ç ï¼ç¶åéç¥ JIT ç¼è¯å¨ä»¥æ¹æ³ä¸ºåä½è¿è¡ç¼è¯ï¼
- Oracle å
¬å¸å嫿¶è´äº BEA å Sunï¼å¹¶å¨ JDK8 çæ¶åï¼æ´åäº JRokit VM å HotSpot VMï¼å¦ä½¿ç¨äº JRokit çåå¾åæ¶å¨ä¸ MissionControl æå¡ï¼ä½¿ç¨äº HotSpot ç JIT ç¼è¯å¨ä¸æ··åçè¿è¡æ¶ç³»ç»ã
### BEA JRockit VM
- 䏿³¨äºæå¡å¨ç«¯åºç¨ï¼å
é¨ä¸å
å«è§£æå¨å®ç°ï¼
- å·ç§°æ¯ä¸çä¸æå¿«çJVM
### IBM J9 VM
- å
¨ç§°ï¼IBM Technology for Java Virtual Machineï¼ç®ç§°IT4Jï¼å
é¨ä»£å·ï¼J9
- å¸åºå®ä½äºHotSpotæ¥è¿ï¼æå¡å¨ç«¯ãæ¡é¢åºç¨ãåµå
¥å¼çå¤ç¨éVM
- ç®åæ¯æå½±ååçä¸å¤§åç¨èææºä¹ä¸
èææºæå¾å¤ï¼æ¤å¤è¿æAzul VMãLiquid VMãApache HarmonyãTaobaoJVMãGraal VMç
## åè
ãæ·±å
¥çè§£Javaèææºã
ãå°ç¡
è°·JVMã