1.java的类加载器有哪些
类加载器工作图
AppClassloader
应用类加载器,又称系统类加载器。它负责在 JVM 启动时,加载来自在命令 java 中的-classpath 或者 java.class.path 系统属性或者 CLASSPATH 操作系统属性所指定的 JAR 类包和类路径。
ExtClassloader
扩展类加载器,主要负责加载 Java 的扩展类库,默认加载 JAVA_HOME/jre/lib/ext/ 目录下的所有 Jar 包或者由 java.ext.dirs 系统属性指定的 Jar 包。
BootstrapClassloader
引导类加载器,又称启动类加载器,是最顶层的类加载器,主要用来加载 Java 核心类,如 rt.jar、resources.jar、charsets.jar 等。 custom class loader 自定义类加载器,除了系统提供的类加载器,开发人员可以继承java.lang..ClassLoader 来满足一些特殊的需求. Ps:AppClassloader是ExtClassloader的子类,而bootstrapClassloader是用c++来写的类加载器
2.java的类加载机制,说一下双亲委派
JVM在加载类时默认采用的是双亲委派机制。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父类加载器,依次递归,如果父类加载器可以完成类加载任务,就成功返回;只有父类加载器无法完成此加载任务时,才自己去加载。
3.jvm的内存分布模型
- (1)jvm是一种用于计算设备的规范,它是一个虚构出来的机器,是通过在实际的计算机上仿真模拟各种功能实现的。
- (2)jvm包含一套字节码指令集,一组寄存器,一个栈,一个垃圾回收堆和一个存储方法域。
- (3)JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。
java语言到机器语言的转换图
Jvm内存结构图
4.堆和栈的区别,堆和栈是线程共享的吗?
java的内存分为两个类,一类是栈内存,一类是堆内存.栈内存是指程序进入一个方法的时候,会为这个方法单独分配一块私属存储空间,用于存储这个方法内部的局部变量,当这个方法结束的时候,分配给这个方法的栈会释放,这个栈的变量也将随之释放. 堆是与栈作用不用的内存,一般用于存放不放在当前方法栈中的数据,例如,使用new创建的对象都放在堆中,所以,他不会随方法的消失而消失,方法中的局部变量使用final修饰,放在堆中,而不是栈中. 栈中的变量指向堆内存中的变量,这就是 Java 中的指针!