2018/1/13 20:01:47当前位置推荐好文程序员浏览文章

谈谈jvm的classloader

jvm classloader
classloader是jvm实现的一部分,只用于实现类的加载动作,但是他的作用远远不限于加载阶段比如确定一个类的唯一性,需要类本身和类加载器共同确定。相同的类,但加载器不同就不能说两个类相等比如同样一块泥土。你把放到砖窑里,他就变成了砖,放到瓷器窑就是瓷器。从java虚拟机角度讲只有两种类加载器。一种bootstrap classloader(启动类加载器)另一种叫其他的类加载器再细化一点是bootstrap classloader(启动类加载器) extension classloader(扩展类类加载器),appplication classloader(应用程序类加载器)a. Bootstrap ClassLoader/启动类加载器主要负责jdk_home/lib目录下的核心 api 或 -Xbootclasspath 选项指定的jar包装入工作. b. Extension ClassLoader/扩展类加载器主要负责jdk_home/lib/ext目录下的jar包或 -Djava.ext.dirs 指定目录下的jar包装入工作 c. application ClassLoader/系统类加载器主要负责java -classpath/-Djava.class.path所指的目录下的类与jar包装入工作.    一般默认的这个类加载器   
双亲委派模型
三个类加载器相互协助,存在层次关系。这种关系叫做双亲委派模型
image
如图:工作流程如下,如果收到一个类加载器收到一个类的加载请求。 首先他不会自己做。而是交给自己的父亲类加载器简直是坑爹啊。如果父类类加载器能加载。就不需要自己加载。只有当父类不能加载才自己加载虽然这种方式,在人理上很不公平,但是却解决了一个很重要的问题。如果不使用双亲委派模型,那么创建一个Object的类,放在程序的classpath下,这样系统中将会出现多个不同的object类
网友评论