一、JVM是什么?
回答技巧和要求:
我们学异常的时候,都学过RuntimeException吧,就是在jVM内存区域运行时内存区Runtime Data Area抛出来的。
方法区(Method Area):并不是放方法的地方,而是放类的描述的信息。方法区是放模板的地方。
java.lang.Class
Class.forName("..");
/**
*通过这个类的模板,按照模板生成一个实例
*然后这个类的模板 XXX Class是存放在Method Area的
*/
通过这个类的模板,按照模板生成一个实例
然后这个类的模板 XXX Class是存放在Method Area的
java Hello.java ==>得到Hello.class
java Hello ==>虚拟机不是靠检查Hello的后缀名是不是.class验证它是不是字节码文件的。真的class文件,在文件开头有特定的文件标识(cafe babe)
一装完Java,你为什么能用String这个类,为什么能用ArrayList这个类,是因为:rt.jar包被bootStrap加载器(启动类加载器)一启动的时候就加载进JVM里面了
二、类加载时机
·创建类的实例,也就是new一个对象
·访问某个类或接口的静态变量,或者对该静态变量赋值
·调用类的静态方法
·反射(Class.forName("com.lyj.load"))
·初始化一个类的子类(会首先初始化子类的父类)
·JVM启动时标明的启动类,即文件名和类名相同的那个类
三、类加载器类型
①C++写的根加载器
②Java写的扩展类加载器
③自己写的类的加载器
④自己写的加载器
VM预定义有三种类加载器,当一个 JVM启动的时候,Java开始使用如下三种类加载器:
1)根类加载器(bootstrap class loader):它用来加载 Java 的核心类,是用原生代码来实现的,并不继承自 java.lang.ClassLoader(负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类)。由于引导
自定义加载器?:就是我,不满意 你 Java类的加载顺序,要自己造,继承abstract的ClassLoader