依赖说明
项目依赖于A.jar和B.jar。A依赖C的1.0版本,B依赖C的2.0版本。
双亲委派
用户程序中默认使用Appclassloader加载,只能加载一个C。所以AB必有一个不能正常使用,使用自定义classloader解决该问题。
逃逸分析(JDK默认开启)
逃逸分析是:分析了对象只在当前函数范围内使用,对象分配将会在栈上申请空间。对于栈而言,函数运行完立即清理,不需要等到GC,大大缓解了GC压力。
在Java代码运行时,通过JVM参数可指定是否开启逃逸分析。
-XX:+DoEscapeAnalysis : 表示开启逃逸分析
-XX:-DoEscapeAnalysis : 表示关闭逃逸分析 从jdk 1.7开始已经默认开始逃逸分析,如需关闭,需要指定-XX:-DoEscapeAnalysis
应该是开始还是在堆上创建,即时编译器发现改对象为热点代码,然后才转到栈上分配的。
逃逸分析是JIT中的一个重要优化。
Boolean、Byte的所有对象,都是预先创建好的(类加载的时候)
Character、Short、Integer、Long是-128~127的对象是预先创建好的(Character没有负数)
现象:如果Integer a = 1,则是从创建好的缓存中,直接拿出。
原因:为了节省内存,这些数字使用概率很高,早就创建好,之后都用同一个,是提高效率的做法。
如果是 new 对象则全为false;
Integer a1 = new Integer(1);
Integer a2 = new Integer(1);
Integer a3 = new Integer(1);
System.out.println(a1 == a2);
System.out.println(a1 == a3);
System.out.println(a3 == a2);
下面这段代码输出全为true;
Integer a1 = 1;
Integer a2 = 1;
Integer a3 = 1;
System.out.println(a1 == a2);
System.out.println(a1 == a3);
System.out.println(a3 == a2);