1 jvm位置
JVM是运行在操作系统之上的,它与硬件没有直接的交互
2 jvm 体系结构概述
# 3 类加载器 ## 3.1 负责加载class文件,class文件在文件开头有特定的文件标示,将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定外卖小哥把餐送到你手上,他就不管了。饭的质量什么有他无关,他只负责送到你手上。
ClassLoader和外卖小哥一样,把class文件加载到内存就不管了。之后就是jvm内部的事了。
。把class文件读到内存中,通过类加载器,变成Class文件,为原数据模版。不能直接用,要想要用的话,需要new出来一个个实例。
3.2类加载器有几种
4种
。启动类加载器:
打印出来是null
jdk自带的走的都是 启动类加载器
。如果是自己编写的是AppClassLoader
。拓展类加载器
。。为什么能直接使用object,set。list等类?
因为rt.jar包被Bootstrap和加载器在一启动的时候,就加载到了jvm当中,所以可以直接使用(rt.jar位于 Java—》jre—>lib —>rt.jar.)。
3.3双亲委派机制
概念:
当一个类收到了类加载请求,他首先不会尝试自己去加载这个类,而是把这个请求委派给父类去完成,每一个层次类加载器都是如此,因此所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候(在它的加载路径下没有找到所需加载的Class),子类加载器才会尝试自己去加载。
采用双亲委派的一个好处是比如加载位于 rt.jar 包中的类 java.lang.Object,不管是哪个加载器加载这个类,最终都是委托给顶层的启动类加载器进行加载,这样就保证了使用不同的类加载器最终得到的都是同样一个 Object对象。
解释
我爸是李刚,有事找我爹
要用a.class.先去顶部(启动类加载器)找,找的到你就用,找不到就往下一层(拓展类加载器)去找。找的到你用,找不到就去AppClassLoader找,再找不到会报错。
rt.jar里边的string.class没有main方法。所以程序报错。他先去启动类加载器去找。如果启动类加载器没有才往下边找。