Java:Java JVM常见面试题及答案:类加载器篇
文章图片
1、Class.forName 和 ClassLoader.loadClass 都能加载类 , 这两者在加载类时的区别?
- Class.forName有重载方法可以指定是否需要初始化 , 而默认的方法初始化设置为true这会初始化类执行链接和初始化操作
- 【Java:Java JVM常见面试题及答案:类加载器篇】ClasaLoader是有类加载器的loadClass方法加载 , 传入的是false , 只会执行连接操作 , 不会初始化操作
3、类的生命周期
- 加载过程:通过一个类的全限定名来获取定义此类的二进制字节流 , 将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构 。 在内存中(方法区)生成一个代表这个类的java.lang.Class对象 , 作为方法区这个类的各种数据的访问入口;
- 验证过程:为了确保Class文件的字节流中包含的信息符合当前虚拟机的要求 , 文件格式验证、元数据验证、字节码验证、符号引用验证
- 准备过程:正式为类属性分配内存并设置类属性初始值的阶段 , 这些内存都将在方法区中进行分配
- 解析阶段:虚拟机将常量池内的符号引用替换为直接引用的过程
- 初始化阶段:类初始化阶段是类加载过程的最后一步 。 初始化阶段就是执行类构造器<clint>()方法的过程
- 使用阶段:
- 卸载阶段:
- Bootstrap ClassLoader:根类加载器 , 负责加载java的核心类 , 它不是java.lang.ClassLoader的子类 , 而是由JVM自身实现
- Extension ClassLoader:扩展类加载器 , 扩展类加载器的加载路径是JDK目录下jre/lib/ext扩展类的getParent()方法返回null实际上扩展类加载器的父类加载器是根加载器 , 只是根加载器并不是Java实现的
- Application ClassLoader:应用程序类加载器 , 它负责在JVM启动时加载来自java命令的-classpath选项、java.class.path系统属性或CLASSPATH环境变量所指定的jar包和类路径 。 程序可以通过getSystemClassLoader()来获取系统类加载器 。 系统加载器的加载路径是程序运行的当前路径 。
- 先查找当前ClassLoader是否加载过此类 , 有就返回;
- 如果没有 , 查询父ClassLoader是否已经加载过此类 , 如果已经加载过就直接返回Parent加载的类;
- 如果整个类加载器体系上的ClassLoader都没有加载过 , 才由当前ClassLoader加载(调用findClass) , 整个过程类似循环链表一样 。
- 『Java』java数据结构系列——什么是数据结构
- 『Java』马云:成功人跟普通人差不多,但这三点我一定要分享给所有年轻人
- #Java#java线程到底有多少种状态?
- #智能手表#1、初识java-1
- [华为]有朋友问我“JAVA全栈”、“互联网架构师”和“JAVAEE”到底是什么?
- 「javascript」这边走Javascript了解一下
- 「华为」一篇有趣的Java class
- struts@Java面试之项目面试问题——不看面试会后悔的
- 「Java」六面蚂蚁金服,唬住了面试官要了30K;其实Java面试也没那么难
- Java@23种java设计模式之:建造者模式、工厂方法模式、抽象工厂模式!