java基础---JVM:类文件结构和类加载机制

6.2无关性
 
===?java虚拟机如何保证平台无关,语言无关?java虚拟机只能够运行java程序吗?
因为java虚拟机只识别.class文件字节码。用不同语言编写的代码最后转存成.class文件就能够被java虚拟机识别和运行。
 
 
 
===?类加载器用来做什么呢?
1.加载一个类
2.确定一个类的唯一性
两个类的Class文件相同,但是使用不同的类加载器加载的时候就是不同的类。
 
===类加载器是什么?是java类吗?有几个重要的类加载器,请给出类加载器的层次结构?
类加载器也是类,所以本身也需要被加载器加载。所以有一个不是类的加载器
bootstrap,在hotspot里面是由c/c++代码写的,被封装到了jvm内核中了,将/lib目录下的文件加载到虚拟机中进行使用,但是本身无法被java程序直接引用。
extclassloader:用来加载/lib/ext目录下的类库
appclassloader:用来加载用户类路径上Classpath指定的类库。
bootstrap加载java运行时候需要的类。包括util包,concurrent包。
===类加载机制,双亲委派模型,为什么使用双亲委派模型进行加载?
双亲委派模型要求除了顶层的启动类加载器外,其余的类加载器都要有自己的父类加载器。当类加载器收到了类加载的请求,不会尝试自己去加载这个类,而是把请求委派给父类加载器。每个层次的加载器都是这样,所以每个类加载请求都会传送到顶层启动加载器上,只有当父加载器反馈自己无法完成这个加载请求的时候,子加载器就会自己去尝试加载。
为了保证安全,为了保证所有的基础类都是同一个类加载器加载的,避免系统混乱。因为如果不使用双亲委派机制,自己手写个类加载器就能加载基础类比如String类就会造成系统安全问题。
 
原文地址:https://www.cnblogs.com/buptyuhanwen/p/9412136.html