1.JVM中常见的类加载器有哪些?
1)、启动类加载器(Bootstrap ClassLoader):负责加载JVM自身需要的核心类,如java.lang包中的类。
2)、扩展类加载器(Extension ClassLoader):负责加载JVM扩展目录下的JAR包中的类。
3)、应用程序类加载器(Application ClassLoader):也称为系统类加载器,负责加载应用程序类路径(classpath)上的类,在大多数情况下是开发者编写的类。
4)、自定义类加载器:开发者可以根据自己的需求实现自定义的类加载器,以满足一些特殊的加载需求,例如从网络或数据库中加载类。
2.什么是类加载器的双亲委派策略
1)、类加载器的双亲委派策略是Java虚拟机中用于确定哪个类加载器负责加载某个类的一种机制。根据这个策略,当一个类加载器需要加载一个类时,它会首先将这个任务委托给其父类加载器去完成。只有在父类加载器无法加载该类的情况下,才由当前类加载器自己来加载。
2)、假如User.java 文件,需要运行,会先编译为User.class ,会让应用程序类加载器(Application ClassLoader)加载,先判断一下,以前的双亲是否加载过,先问扩展类加载器(Ext ClassLoader), 扩展类加载器 问 启动类加载器(BootStrap ClassLoader)是否加载过,如果加载过,直接使用已经存在的类,不会加载了,如果都没有加载过,应用程序类加载器才会加载,这个策略就是双亲委派策略。
3.JVM虚拟机有哪些部分组成,每一部分的作用是什么?
1)、程序计数器
程序计数器就是用来记录代码执行到那句话了,后面继续从这个位置开始执行。
比如多线程A, 多线程B, A执行到35行,被B给夺走了,下一次A从第35行开始继续运行,这个数据就是程序计数器帮助A记忆的。
2)、堆(堆管存储)
堆是用来管理存储的。
3)、栈(栈管调用)
栈是管运行的,只有被调用了的方法才会进入栈里面,如果没有调用,所有的方法都不会在这个里面。
4)、本地方法栈
专门执行native 修饰的方法的,将来根据执行引擎,去执行native方法。专门运行native方法的东西,都压入这个本地方法栈。
5)、(静态)方法区
是一块用于存储类信息、常量、静态变量和编译器编译后的代码等数据的内存区域。独一份的东西都放入这个里面。
①.存储类信息:方法区存储了每个类的结构信息,包括类的名称、父类、实现的接口、字段和方法等。这些类信息在程序运行时被加载到方法区,并被JVM用于动态解析和链接。
②.存储常量池:方法区还包含了一个运行时常量池,用于存储编译期生成的各种字面量和符号引用。常量池中保存了类、方法和字段的符号引用,以及字符串、数字和其他字面量常量的值。
③.存储静态变量:静态变量是属于类而不是对象的,它们在类加载的时候被初始化并存储在方法区中。静态变量可以被所有实例对象共享,因此它们的值会在整个程序执行过程中保持一致。