Files
Interview-Notebook/notes/JVM.md
T
2018-02-22 14:47:22 +08:00

27 KiB

??????

????????????????快??????????????????

1. ?????????

?????????快????????????????????????????快??? Native ????????????

2. Java ??????

??? Java ????????快????????????????𣸑???????????????????????????????????????????????????????????????????????????????? Java ?????????????????????

????????????????????

  1. ???????????????????????????? StackOverflowError ????
  2. ????忪????????????????????秄????? OutOfMemoryError ????

3. ????????

?? Java ?????????????????????????????????????????????????

4. Java ??

???忪???????????????????紫

??????????????????????????????"GC ?? "???????????????????????¯?????????Java ??????????????????????????????????????? Eden ???From Survivor ???To Survivor ???????

???????????秄??????? -Xmx ?? -Xms ???????????????妊?????????????????? OutOfMemoryError ????

5. ??????

?????????????????????????????????????????????????????????????????

?? Java ??????????????????秄??????????????????????????????? OutOfMemoryError ????

????????????????????????????????????????????忪??????????????????HotSpot ?????????????????????????????????

6. ???????????

??????????????????????????

??????Class ????快???????????????????????????????????????????????????????

???????????????迄? String ??? intern() ?????????????????????

7. ??????

?? JDK 1.4 ????????? NIO ???????????????????Channel??????????Buffer???? I/O ?????????????? Native ?????????????????秄??????????𣸑?? Java ????? DirectByteBuffer ????????????????????志??????????????宏????????????????????????????? Java ??? Native ????????????????

???????

?????????????????????????????????????????????快????????????????????????????????????????????????????????????????????????

???????????????? Java ???????????妊?

1. ?忪???????????????

1.1 ???邦???

???????????????邦????????????????????????????????? 1???????完????????? 1??

???邦???? 0 ????????????

?????????????????????????????邦??????????? 0?????? GC ?????????????

objA.instance = objB;
objB.instance = objA;

1.2 ?????

??? GC Roots ???????????????????????????????????????????????????????

GC Roots ???????????????

  1. ????????????????
  2. ???????????????????????
  3. ???????快????????????
  4. ??????????????????

1.3 ????????

????????????邦??????忪?????????????????????????????????忪?????????????????忪???????????????芍??抄??

1.3.1 ?????

????????????????????????????????????????????

Object obj = new Object();

1.3.2 ??????

?????????????????????抖????

Object obj = new Object();
SoftReference<Object> sf = new SoftReference<Object>(obj);
obj = null;
sf.get();

sf ??? obj ??????????????? sf.get() ??????????????????????????????????????????????????? null??

????????????????????????????????????????????????????????????????????????????????????????????笥???????????????????????????????????????宏?????

1.3.3 ??????

??????圿???????????????????????????????????????????????????????????????

Object obj = new Object();
WeakReference<Object> wf = new WeakReference<Object>(obj);
obj = null;
wf.get();
wf.isEnQueued();

1.3.4 ??????

?????????????????????????????????????????????????????????????�??????????????????????????????????????????????????迄?????朵????????????????????????????????????????

Object obj = new Object();
PhantomReference<Object> pf = new PhantomReference<Object>(obj);
obj=null;
pf.get();
pf.isEnQueued();

1.3 ???????????

???????????????????????????忪???

?????????????忪???????????

???忪????????????????????????????????????????????????忪???

  1. ???????快????????????????????? Java ???志??????????百??????
  2. ???????? ClassLoader ??????????
  3. ???????? java.lang.Class ??????????百汍??????????????????百汍???????????????????

??????? -Xnoclassgc ???????????????????忪???

???????¯??????????CGLib ?? ByteCode ??????????? JSP ??? OSGo ???????????? ClassLoader ????????????????????忪?????????????????????????

1.4 finalize()

???????????????????????????忌????? finalize() ????????????扭???????????¯?????????????㊣????????????????

finalize() ???? C++ ???鏓??????????????????????????????? try-finally ????????????????????¯??????忱?????????????????????????????????????????辰????芍?

2. ?????????

2.1 ??? - ?????

???????????????忌???????????

????

  1. ???????????完???????
  2. ????????????

???????????????????我????

2.2 ??????

????𡾡?????妊???????�?????????????�??????????????????????????????????????秄????????迄??????????????????

??????????????????????

??????????????????????????????????????????????????????𡾡?????妊???????�???????????? Eden ?????????妊?? Survior ????????? Eden ??????????? Survivor???????????? Eden ?? Survivor ?抖???????????????????????? Survivor ????????????? Eden ?? Survivor??HotSpot ??????? Eden ?? Survivor ???妊???????? 8:1?????????????????? 90 %???????竹????忪??? 10% ????????????? Survivor ?????????????????????????????戒????????????????????????

2.3 ??? - ??????

?????忱??????????????????????????????????????紫

2.4 ????????

????????????????¯?????????????????????????????????????????????????𡾡??????�????????????????????

??? Java ???????????????????

  1. ????????????????
  2. ???????????? - ???? ???? ??? - ???? ????

3. ?????????

?????? HotSpot ??????快? 7 ?????????????????????????????????????芍?

3.1 Serial ?????

??????????????????????汎????????????????????????????????????????????????????????????????????????????????????????????????

???????????完????????? CPU ??????????????????????????????????????????????完???

?? Client ??車????孝?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????

3.2 ParNew ?????

???? Serial ???????????煆??

?? Server ??????????????????????????????????????????????????? Serial ???????????????? CMS ?????????????

???????????????? CPU ???????????????? -XX:ParallelGCThreads ?????????????????

3.3 Parallel Scavenge ?????

????快????????????

?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? CPU ??????????????????????????????

??????????????????????????????????????????????????????�????????????????完??????? CPU ?????????????????????????????????????????????????????

?????????????????????????????????????????????????????? -XX:MaxGCPauseMillis ??????????????????????妊?? -XX:GCTimeRatio ???????????? 0 ??妊?? 100 ???????????????????????????????????????????????????????????????妊????????????????????????????????

????????????? -XX:+UseAdaptiveSizePolicy?????????????????????????????????????????????妊??-Xmn????Eden ?? Survivor ?????????-XX:SurvivorRatio?????????????????????-XX:PretenureSizeThreshold???????????????????????????????????????????????????????????宏???????????????????????????????????????????? GC ??????????????GC Ergonomics??????????????????????? ParNew ?????????????????

3.4 Serial Old ?????

Serial Old ?? Serial ?????????????煆?????? Client ????????????芍???????? Server ??????????????????

  1. ?? JDK 1.5 ??????煆??Parallel Old ????????????? Parallel Scavenge ???????????芍?
  2. ??? CMS ????????????????????????? Concurrent Mode Failure ???芍?

3.5 Parallel Old ?????

?? Parallel Scavenge ?????????????煆??

?????????????? CPU ??????快?????????????????? Parallel Scavenge ?? Parallel Old ???????

3.6 CMS ?????

CMS??Concurrent Mark Sweep?????? Mark Sweep ?????????????? ??? - ??? ???????

??????????????????

???????????????

  1. ??????????????????? GC Roots ???????????????????????????
  2. ???????????? GC Roots Tracing ??????????????????????抗???????????????
  3. ???㊣?????????????????????????????????????????㊣?????????????????????????????????
  4. ??????????????????

???????????抗????????????????????????孝??????????????????????????????????????????

???????????

  1. ?? CPU ??????妊?CMS ??????????????????? (CPU ???? + 3) / 4???? CPU ???? 4 ?????CMS ??????????????????迆????????? CPU ???????????????????????????????????????????????????????????????????? 50%?????????????????????????????????????????????????????? CPU ?????????

  2. ??????????????????????????????????????????????????????????????????????????????????????????????????????????CMS ????????????忱????????????????????? GC ?????????????????????????????????????????????????????????????????????????孝??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????芍???????? -XX:CMSInitiatingOccupancyFraction ???????????????????????????????JDK 1.5 ???????????? 68?????????????????? 68% ?????????????????????????????????????????????????????秄????????? Concurrent Mode Failure?????????????????????????????? Serial Old ??????????????????????????????

  3. ??? - ??????????????????????????????????�?????????????????????????????????????????????????????辰??????????? Full GC??

3.7 G1 ?????

G1??Garbage-First??????????????????????????????????????????????????????????????????HotSpot ?????????????????????????????汛???????䣺?? JDK 1.5 ?戒????? CMS ???????

??????????

  • ??????????????????? CPU ???????????????????? CPU ????????????
  • ??????????????????????????????????????????????????????????????? GC ?????????????辰?????????????????????????????????????? GC ???????????????????完????
  • ????????????????????????? - ??????????????????????????? Region ???????????????????????????????汎????????????????????????
  • ??????????????????? CMS ?????????????????????? G1 ?? CMS ??????????? G1 ???????????????????????????????????????????????????????????? M ???????????????????? GC ???????車??? N ??????????????? Java??RTSJ??????????????????????

?? G1 ???????????????????????朱???????????????????????????? G1 ????????????Java ?????梌??????????????抗??????????? Java ???????????妊???????????Region?????????????????????????????????????????????????????????????????????????? Region???????????????????

??????????????????????????????????????技????????????? Java ???扶??????????????????????????? Region ??????????????????妊???????????????妊??????????????????????????????????????忌???牟??????????????????????????? Region????????? Garbage-First ??????????????????? Region ???????????????????????????????????????????????????????????????????完???

Region ????????????????????????????? Region ?孝??????????? Java ???????????????迄?????????????????????????????????????????? Java ???????????????????? GC 完???????????????????????????????? Region ?????????????????? Remembered Set????????????????? Reference ????????????忱??????????????? Write Barrier ????忪?忱????????? Reference ????????????????? Region ??孝???????????? CardTable ???????????????????????????????? Region ?? Remembered Set ??妊?????????????????? GC ??????????朱?技??? Remembered Set ????????????????????????????

???????????? Remembered Set ???????G1 ??????????????????????????????帩

  1. ??????
  2. ???????
  3. ??????????????????????????????????????????????㊣??????????????????????????????????????�????????? Remembered Set Logs ???秄????????????? Remembered Set Logs ?????????? Remembered Set ?妊?????????????????????????妊?
  4. ??????????????? Region ?快???????????????????????????????? GC ????????????????????????????????????????????????????孝?????????????????? Region??????????????????????????????????????????完???

3.8 ?????????????????

????? ???妊????? or ???? ?????? / ????? ?? ??? ???車???
Serial ???? ?????? ?????? ?????????? ?? CPU ??????? Client ??
Serial Old ???? ????? ??? - ???? ?????????? ?? CPU ??????? Client ????CMS ??????
ParNew ???? ?????? ?????? ?????????? ?? CPU ??????? Server ?????? CMS ???
Parallel Scavenge ???? ?????? ?????? ?????????? ?????????????????????????
Parallel Old ???? ????? ??? - ???? ?????????? ?????????????????????????
CMS ???? ????? ??? - ??? ?????????? ?????????????? B/S ?????????? Java ???
G1 ???? both ??? - ???? + ?????? ?????????? ?????????????????䣺 CMS

4. ??????????????

4.1 ?????? Eden ????

??????????????????????? Eden ???????? Eden ?????????????? Minor GC??

4.2 ????????????????

?? -XX:PretenureSizeThreshold ????????????????????????????????????? Eden ???? Survivor ???????????褡???

4.3 ??????????????????

JVM ?????????????????????? Minor GC ????????? Survivor ????????????? Survivor ????????? 1?????????? Minor GC ??????????????? 1???????????????????????????????? 15 ????? -XX:MaxTenuringThreshold ???????

4.4 ????????????忪?

?? Survivor ????????????忪????妊?????? Survivor ???????????????????????????????????????????

4.5 ????????

????? Minor GC ????JVM ?????????????????????????????????????忪?????????????? Minor GC ???????????????????????????????????????????????糸????????????????????妊???????????? Minor GC??妊???????? Full GC??

4.6 Full GC ?????????

???? Minor GC?????????????????? Eden ???????????????????? Minor GC???? Full GC ?????????????????????

4.6.1 ???? System.gc()

??????????????? JVM ???? Full GC??????????????????????????????????? Full GC????????? Full GC ????????????????尬???????????????????????????????????????????????????????????秄????? -XX:+ DisableExplicitGC ????? RMI ???? System.gc()??

4.6.2 ??????????

??????????????????????????????????????????????????????????????????????? Full GC ??????????????????????? Java.lang.OutOfMemoryError: Java heap space ????????????????????? Full GC??????????????????????? Minor GC ??汐????????????????????????????嘛??????????????????�

4.6.3 ???????????

?????????? Minor GC ???????????????????????????????? HandlePromotionFailure ????????????? Full GC??

4.6.4 JDK 1.7 ?????????????????

?? JDK 1.7 ???????HotSpot ??????快??????????????????????????忱?????宏 class ??????????????????????????????????????????????????????????????Permanet Generation ????????????汛????????? CMS GC ????????????? Full GC????????? Full GC ?????????????? JVM ?????????????????java.lang.OutOfMemoryError: PermGen space ????? PermGen ?????? Full GC ????????????????? PermGen ????????? CMS GC??

?? JDK 1.8 ?????????䣺?????????????????????????????????秄??????????? Full GC ????????????

4.6.5 Concurrent Mode Failure

??? CMS GC ??????????忪????????????????????????????????????????? CMS GC ??????????????????????????????? Full GC??????? Concurrent Mode Failure ????????? Full GC??

????????

????????????????????

1 ???????????

???????? 7 ????曳?

  • ?????Loading??
  • ?????Verification??
  • ?????Preparation??
  • ??????Resolution??
  • ???????Initialization??
  • ????Using??
  • 忪???Unloading??

???扶??????????宏???????????????????????????????????? Java ???????

2. ?????????

??????涏?志????????????????技????????涏???梀?????????????????????????????忍??????( ???????????????????????? )

  1. ???? new??getstatic??putstatic??invokestatic ????????????????????????扶??抄?????????????????????????????????????? 4 ??????????????? new ????????????????????????????????????曳??? final ???曲???????????????????????????污????????????????????????????????

  2. ??? java.lang.reflect ?????????????戒?????????????????扶??忍????????????????????????

  3. ????????????????????????侳????扶??抄???????????????????侳?????????

  4. ?????????????????????????????快????????? main() ?????????????????????????????????

  5. ????? jdk1.7 ???????????????????? java.lang.invoke.MethodHandle ?????????????? REF_getStatic, REF_putStatic, REF_invokeStatic ???????????????????????????????????扶??抄??????????????????????????

???? 5 ??????快????????????????????????芍??????????????????????????????????????????????芍??????????????????????

1. ???????????????????曳?????????????????

System.out.println(SubClass.value); // value ????? SuperClass ?忪???

2. ??????䊵????????????????????????????迄?????????????忍???????????????????????????????????????? Object ?????????忘????????????????????

SuperClass[] sca = new SuperClass[10];

3. ??????????竹????????????????孝??????????????????????幂?????????????????幂?????????????

System.out.println(ConstClass.HELLOWORLD);

3. ????????

???????????????????????????????? 5 ????曲?

3.1 ????

?????????????????曳???????????

?????????????????????

  1. ????????????????????????????????????????
  2. ????????????????????𣸑????????????????????𣸑????
  3. ???????????????????????? Class ??????????????????????????????????

???忪??????????????????﹞???抖????

  • ?? ZIP ???????????????????????? JAR??EAR??WAR ??????????
  • ???????抖?????????????????????? Applet??
  • ???????????????????????????????????????????? java.lang.reflect.Proxy ?孝????????? ProxyGenerator.generateProxyClass ????????????????????
  • ??????????????????????? JSP ???????? JSP ??????????? Class ??
  • ????????????????????????????????宏?技???????????? SAP Netweaver????????????????????????????????????????????? ...

3.2 ???

??? Class ???????????忘??????????????????????????????曳????????????????

????????? 4 ????曳?

  1. ?????????
  2. ???????????????????????????????????????
  3. ??????????????????????????????????????????????????????????????????????????孝???????
  4. ???????????

3.3 ???

???????? static ???汍????????????????????????𢶷???車????????????????????紫

????????????????灰?????秄???????????????????????????????? Java ???妊?

???????? 0 ????????????????? value ???????? 0 ?????? 123??

public static int value = 123;

??????????????????????????????忍??????????????? 0??

public static final int value = 123;

3.4 ????

?????????????????䣺?????????????

3.5 ?????

???????米??????????????? <clinit>() ??????????

???????曳?????????????????????????????????????曳?????????????????????????????????????????????????

<clinit>() ???????????????

  • ???????????????????????????????????????????龢static{} ?�?快???????????????????????????????????????忍??????????????????????????????????????????????????????????????????????????????????????????????????
public class Test {
    static {
        i = 0;                // ????????????????????????
        System.out.print(i);  // ????????????????????????芍?
    }
    static int i = 1;
}
  • ?????????????????????????? <init>()??????????????????????????????????????????????????? <clinit>() ????????????????? <clinit>() ?????????扶??????????????快??????? <clinit>() ??????????? java.lang.Object??

  • ???????? <clinit>() ????????孝??????汎??????忪???????????????????????????????????????????

static class Parent {
        public static int A = 1;
        static {
            A = 2;
        }
}

static class Sub extends Parent {
        public static int B = A;
}

public static void main(String[] args) {
        System.out.println(Sub.B);  // ????????????快???????? A??????? 2
}
  • <clinit>() ??????????????????????????????志???????????�???忪???????????????????????????????????? <clinit>() ??????

  • ????志?????????????�??????????????????????????????????????????????? <clinit>() ???????????????????????扶??? <clinit>() ?????????????我????? <clinit>() ????????快???????忪????????????????????????????????????????????????????????扶??? <clinit>() ??????

  • ?????????????? <clinit>() ??????????????㊣????????????????????????????????????????????????????????? <clinit>() ???????????????????????????????????? <clinit>() ??????????????????? <clinit>() ???????抗??????????????????????????????????????忱????????????曲?

4. ???????

????????????????????快????????????????????????????????????????? ( ??????? )???????????? Java ???????????????????車???????????????????????????????????????????????????????????

4.1 ???????????

???????????????????????????????????????????????????? Java ??????快?朵??????????????????????????????????????????????????????????????????????????????????????? Class ????? equals() ??????isAssignableFrom() ??????isInstance() ????????????????????? instanceof() ????????????????????忪?????????????????????????????????????????????????????�??????????????????????? Class ???????????????????????????????????????????????????????????????

4.2 ???????????

?? Java ?????????????????????????????????????????

??????????????????Bootstrap ClassLoader???????????????? C++ ??????????????????????????????????????????????????宏???? Java ???????????????????????????????????? java.lang.ClassLoader??

?? Java ??????????????????????????????????宏??

  • ?????????????Bootstrap ClassLoader?? ????????????????? <JAVA_HOME>\lib ???快??????? -Xbootclasspath ???????????﹞???快?????????????????????????????????? rt.jar???????????????????? lib ??????????????????????????????妊? ???????????????? Java ??????????????????忱????????????????????????????????????????????????????? null ???𩼣?阱?

  • ????????????Extension ClassLoader?? ?????????????? ExtClassLoader??sun.misc.Launcher$ExtClassLoader????????????? <Java_Home>/lib/ext ????? java.ext.dir ???????????﹞???快????????????????孝????????????????????????????

  • ??車????????????Application ClassLoader?? ?????????????? AppClassLoader??sun.misc.Launcher$AppClassLoader??????????????????????? ClassLoader ?快? getSystemClassLoader() ?????????????????????????????????????????????﹞????ClassPath??????????????????????????????????????????????車?????????????????????????????????????????????????????????????

4.3 ?????????

??車?????????????????????????技?????????忌?????????????????????????????????????????????????牝??????????????????????????Parents Delegation Model??????????????????????????????????????????????????????????????????????????????????????????????Composition??????????????????????孝?Inheritance??????????

????????

??????????????????????????????????????????????????????????????????????????????????汍?????????????????汍?�??????快?????????????????????????????????????孝???快??????????????????????????????????????朱?????????????????????????????????????

???

??????????????????????????????????? Java ??????????????????????????????????????牝?????????? java.lang.Object????????? rt.jar ?孝??????????????????????????????????????????????????????????????技??????? Object ???????????????????????忪????????????????????????????????????????????技???????????????忱??????????java.lang.Object ?????????????? ClassPath ?孝??????扶????????????? Object ????????????????????????????忱????? rt.jar ????????????????? Java ??????????????????????????????????????妊?

???

protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{
    //check the class has been loaded or not
    Class c = findLoadedClass(name);
    if(c == null) {
        try{
            if(parent != null) {
                c = parent.loadClass(name, false);
            } else{
                c = findBootstrapClassOrNull(name);
            }
        } catch(ClassNotFoundException e) {
            //if throws the exception , the father can not complete the load
        }
        if(c == null) {
            c = findClass(name);
        }
    }
    if(resolve) {
        resolveClass(c);
    }
    return c;
}

JVM ????

GC ???????

???? ????
-Xms ???????????妊
-Xmx ?????????
-Xmn ????????妊
-XX:PermSize ????????????妊
-XX:MaxPermSize ????????????

GC ????????

???? ????
-XX:+UseSerialGC ??????????????
-XX:+UseParallelGC ??????????????
-XX:+UseConcMarkSweepGC ????????????????????
-XX:ParallelCMSThreads= ???????????????????? = ????????????
-XX:+UseG1GC G1 ??????????
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar