JVM基本原理:Java虚拟机是如何加载Java类的?

69 阅读1分钟

深入拆解JVM.jpg

public class Singleton {
    private Singleton() {
    }
​
    public static class LazyHolder {
        static final Singleton INSTANCE = new Singleton();
​
        static {
            System.out.println("LazyHolder.<clinit>");
        }
    }
​
    public static Object getInstance(boolean flag) {
        if (flag) {
            return new LazyHolder[2];
        }
        return LazyHolder.INSTANCE;
    }
​
    public static void main(String[] args) {
        getInstance(true);
        System.out.println("------");
        getInstance(false);
    }
}
​
$ java -cp /path/to/asmtools.jar org.openjdk.asmtools.jdis.Main Singleton$LazyHolder.class > Singleton$LazyHolder.jasm.1
$ awk 'NR==1,/stack 1/{sub(/stack 1/, "stack 0")} 1' Singleton$LazyHolder.jasm.1 > Singleton$LazyHolder.jasm
$ java -cp /path/to/asmtools.jar org.openjdk.asmtools.jasm.Main Singleton$LazyHolder.jasm
$ java -verbose:class Singleton
  1. if(flag)会导致LazyHolder的加载吗?会导致它的初始化吗?

不会加载LazyHolder,不会初始化

  1. 新建数组会导致LazyHoler的链接吗?

新建数组不会链接LazyHolder,在getIncetance(false)时才是真正链接和初始化

\