你知道的越多,你不知道的也越多!
该篇主要是自己的一个小总结吧,内容知识点主要来源于各大牛的一些博客。
外婆问我:什么是双亲委派原则?
双亲委派机制
1.前提须知
(1)该知识点主要是和java类加载有关系。
来,那什么又叫做java类加载呢?别急,总结下就是将一个java文件要加载到JVM里。
怎么感觉《运行时的数据区》怎么那么像《JVM的内存模型》啊?
额,,,别闹,简直就是一个好吧。
如果想具体了解,请移步:JVM 运行时数据区详解,写得非常好!
(2)那类加载器到底有哪几种呢?
答案:3种
通过代码来继续验证下,重点看下getParent
由于parent引用,所以是先 启动(启动JVM)类加载器 ,然后再有 拓展类加载器,接着系统类加载器(应用级别)啦。
2.大致的原理
继续来看下具体是怎么个加载法吧~ 先上图吧,加深记忆。
JVM在启动的时候,默认使用 系统类加载器 = AppClassLoader,但是呢,会优先委派给它的第一个亲也就是 ExtClassLoader ,第一个亲发现自己上面还有个亲,再继续传递给上面的一个亲也就是BootStrapClassLoader。第二亲上面已经没有亲了,所以只能自己老实巴交的看自己负责的路径下有没有对应的class文件,如果有则直接加载到JVM,否则,自己没法处理嘛,那就传回给ExtClassLoader呗。接下去就是同样的操作啦。
⇒ 双亲委派存在方向性 <=
啥意思呢?
也就是上面有提到一个“默认是AppClassLoader”。
那如果将启动类放到了ExtClassLoader可加载的路径下,那第一个类加载就是ExtClassLoader! 接下去的加载方向就是 BootStrap -> Ext , 注意,这里不会再使用到 App类加载器了,要不然就不叫做先委派给双亲,然后再自己处理
3. 背后的一些思考
-
双亲委派机制是解决什么问题的?
避免和jdk 系统用到的xxx.class 加载冲突 + 防止被篡改吧。
试想一下,如果将字节码文件都存在同一个地方。万一写了重复类名的java文件,JVM无法确认是要加载哪个文件。
所以采用先让parent处理。(亲爸亲妈能处理掉的问题,咱就别重复劳动,赶紧去解决他们没法解决的问题吧)。 -
回忆下JVM Remote Debug
在公司里有时候local环境无法排查问题的时候,可能就需要远程debug。
还记得debug的时候,要配置jvm scoket 连接嘛?还记得要保证local 和远程代码一致么。
背后原理:jvm scoket 连接传输请求,并转到local的jvm处理,最后将结果返回回去。