JVM位置
JVM体系结构
类装载器ClassLoader
类被装载后的存放位置
- 方法区并不是存放方法的区域,其是存放类的描述信息(模板)的地方
- Class loader只是负责class文件的加载,Class loader有多种
- 加载之前是“小class”,加载之后就变成了“大Class”,这是安装java.lang.Class模板生成了一个实例。“大Class”就装载在方法区,模板实例化之后就得到n个相同的对象
- JVM并不是通过检查文件后缀是不是
.class
来判断是否需要加载的,而是通过文件开头的特定文件标志
类装载器ClassLoader2
注意:
- Class loader有多种,可以说三个,也可以说是四个(第四个为自己定义的加载器,继承 ClassLoader),系统自带的三个分别为:
- 启动类加载器(Bootstrap) ,C++所写
- 扩展类加载器(Extension) ,Java所写
- 应用程序类加载器(AppClassLoader)。
我们自己new的时候创建的是应用程序类加载器(AppClassLoader)。
public class Test{
//Test:查看类加载器
public static void main(String[] args) {
Object object = new Object();
//查看是那个“ClassLoader”(快递员把Object加载进来的)
System.out.println(object.getClass().getClassLoader());
//查看Object的加载器的上一层
// error Exception in thread "main" java.lang.NullPointerException(已经是祖先了)
//System.out.println(object.getClass().getClassLoader().getParent());
System.out.println();
Test t = new Test();
System.out.println(t.getClass().getClassLoader().getParent().getParent());
System.out.println(t.getClass().getClassLoader().getParent());
System.out.println(t.getClass().getClassLoader());
}
}
/*
*output:
* null
*
* null
* sun.misc.Launcher$ExtClassLoader@4554617c
* sun.misc.Launcher$AppClassLoader@18b4aac2
* */
注意:
- 如果是JDK自带的类(Object、String、ArrayList等),其使用的加载器是Bootstrap加载器;如果自己写的类,使用的是AppClassLoader加载器;Extension加载器是负责将把java更新的程序包的类加载进行
- 输出中,sun.misc.Launcher是JVM相关调用的入口程序
- Java加载器个数为3+1。前三个是系统自带的,用户可以定制类的加载方式,通过继承Java. lang. ClassLoader
双亲委派机制
注意:
- 双亲委派机制:
例如:需要用一个A.java这个类,首先去顶部Bootstrap根加载器去找,找得到你就用,找不到再下降一层,去Extension加载器去找,找得到就用,找不到再将一层,去AppClassLoader加载器去找,找得到就用,找不到就会报"CLASS NOT FOUND EXCEPTION"。
//测试加载器的加载顺序
package java.lang;
public class String {
public static void main(String[] args) {
System.out.println("hello world!");
}
}
/*
* output:
* 错误: 在类 java.lang.String 中找不到 main 方法
* */
上面代码是为了测试加载器的顺序:首先加载的是Bootstrap加载器,由于JVM中有java.lang.String这个类,所以会首先加载这个类,而不是自己写的类,而这个类中并无main方法,所以会报“在类 java.lang.String 中找不到 main 方法”。
这个问题就涉及到,如果有两个相同的类,那么java到底会用哪一个?如果使用用户自己定义的java.lang.String,那么别使用这个类的程序会去全部出错,所以,为了保证用户写的源代码不污染java出厂自带的源代码,而提供了一种“双亲委派”机制,保证“沙箱安全”。即先找到先使用。
执行引擎