首先JVM中有三种类加载器
Bootstrap启动类加载器
Extension扩展类加载器(ExtClassLoader)
System系统类加载器(AppClassLoader)
某个特定的类接到加载类的请求时候,首先将加载任务委托给父类加载器,依次递归,若是父类加载器可以完成加载,则直接返回成功;若是父类加载器无法完成加载时,才交由自己进行加载。
双亲委派的意义:
- 防止内存中出现重复的字节码,避免类的重复加载:A和B均需要加载System类,如果采用双亲委派机制,A类加载了以后,B通过bootstrap去加载的时候,找到了已经被加载过的system类,直接返回成功,不会再次加载
- 防止黑客恶意篡改:如果你自己写了一个java.lang.String的类,没有双亲委派的情况下,自己加载了你自己写的这个string类,但是有双亲委派的前提下,会通过bootstrap加载到顶级父类的java核心api里的String类,你写的东西根本没有机会被加载