类的加载/卸载
符号地址与引用地址的区别是什么?
在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替。比如org.simple.People类引用org.simple.Tool类,在编译时People类并不知道Tool类的实际内存地址,因此只能使用符号org.simple.Tool(假设)来表示Tool类的地址。而在类装载器装载People类时,此时可以通过虚拟机获取Tool类 的实际内存地址,因此便可以既将符号org.simple.Tool替换为Tool类的实际内存地址,及直接引用地址。
加载:
将二进制字节码转化成读到JVM中,映射成JVM能加载的数据结构(Class)
连接:
连接又分为三个步骤,
首先是验证字节码是否符合JVM规范
其次是给静态变量赋值默认值,侧重点在于分配所需要的内存空间
最后是将符号引用转换成直接引用地址
初始化:
给静态变量赋正确的初始值。
执行构造器,成员变量初始化和代码块的执行
怎么判断一个类可以卸载了?
1.加载这个类的加载器已经被回收了
2.堆中没有这个类的实例
3.该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
什么是双亲委派模型
先由自己的父加载器加载,如果不能加载再轮到自己

TOMCAT为什么破坏双亲加载模型?
1.为了复用公共的类库,
每个webapp有自己的目录和类库,比如一个webapp使用类库A1.0版本,一个webapp使用类库A2.0版本,父类加载器加载类库A1.0版本,如果使用双亲委派,会由commonClassLoader去加载类库A1.0版本,这样第二个webapp会有问题
2.热加载jsp
而JasperLoader的加载范围仅仅是这个JSP文件所编译出来的那一个.Class文件,它出现的目的就是为了被丢弃:当Web容器检测到JSP文件被修改时,会替换掉目前的JasperLoader的实例,并通过再建立一个新的Jsp类加载器来实现JSP文件的HotSwap功能
重写loadClass和findClass的区别?
实现自己的类加载时,重写方法loadClass与findClass的区别
重写findClass
首先会通过父类加载器进行加载,如果所有父类加载器都无法加载,再通过用户自定义的findClass方法进行加载。
重写loadClass
此时首先是通过用户自定义的类加载器来判断该类是否可加载,如果可以加载就由自定义的类加载器进行加载,如果不能够加载才交给父类加载器去加载。