类加载器以及常见面试题

目录

1.什么是ClassLoader?

2.类加载器有哪几种以及加载对应的包有哪些?

3.类的生命过程是什么样的?

4.ClassLoader是线程安全的吗?

5.类加载的过程是什么样子的?

6.类加载有几种方式?

7.参考


1.什么是ClassLoader?

        ClassLoader是类加载,把类的.class文件从磁盘加载进内存,放在运行时数据区的方法内,在堆中创建一个java.lang.class对象,方法区存放类相关的数据结构。

2.类加载器有哪几种以及加载对应的包有哪些?

        类的加载器从上到下依次是Bootstrap ClassLoader,Ext ClassLoader,App ClassLoader,Customer ClassLoader

        各个类加载对应的类加载目录如下:

        Boostrap ClassLoader /JAVA_HOME/jre/lib目录下的jar包

        Ext ClassLoader /JAV_HOME/jre/ext/lib目录下的jar包

        App ClassLoader 加载CLASSPATH下所指定的类库,获得要加载的文件的路径 System.getProperty("java.class.path")

        Customer ClassLoader 自定义类加载器需要继承ClassLoader,重写FindClass方法

3.类的生命过程是什么样的?

        加载--->连接(验证,准备,解析)-->初始化-->使用--->卸载

4.ClassLoader是线程安全的吗?

        ClassLoader类加载器是线程安全的,类加载是调用ClassLoader类的loadclass方法,loadClass方法是使用synchronize关键词修饰的。所以是线程安全的。

testClass = classLoader.loadClass("com.mashibing.my.Cpu_001");

        classLoader.loadClass源码

protected Class<?> loadClass(String name, boolean resolve)
        throws ClassNotFoundException
    {
        synchronized (getClassLoadingLock(name)) {
            // First, check if the class has already been loaded
            Class<?> c = findLoadedClass(name);
            if (c == null) {
                long t0 = System.nanoTime();
                try {
                    if (parent != null) {
                        c = parent.loadClass(name, false);
                    } else {
                        c = findBootstrapClassOrNull(name);
                    }
                } catch (ClassNotFoundException e) {
                    // ClassNotFoundException thrown if class not found
                    // from the non-null parent class loader
                }

                if (c == null) {
                    // If still not found, then invoke findClass in order
                    // to find the class.
                    long t1 = System.nanoTime();
                    c = findClass(name);

                    // this is the defining class loader; record the stats
                    sun.misc.PerfCounter.getParentDelegationTime().addTime(t1 - t0);
                    sun.misc.PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);
                    sun.misc.PerfCounter.getFindClasses().increment();
                }
            }
            if (resolve) {
                resolveClass(c);
            }
            return c;
        }
    }

5.类加载的过程是什么样子的?

        类加载过程如下:

        1.先查询缓存,看缓存中是否存在,缓存中存在,直接返回

        2.缓存不存在,会查询父类加载器,使用双亲委派机制,如果父类加载器不存在,继续查找父类的父类的加载器,如果父类的父类的加载器还是找不到,再查找子类的加载器,当最后子类都无法加载这个类的时候,才会报java.lang.ClassNotFoundException

6.类加载有几种方式?

        三种方式

        1.命令行启动程序,由JVM进行初始化

        2.通过class.forname()方法动态加载

        3.通过ClassLoader.classLoader()方法动态加载

7.参考

1.https://www.zhihu.com/question/46719811

2.https://www.cnblogs.com/duanxz/p/6108343.html

3.http://www.ityouknow.com/jvm/2017/08/19/class-loading-principle.html--类的加载机制 大佬的文章建议看n遍

我是厚积薄发,欢迎大家一键三连,欢迎大家留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值