rt.jar包下的类是会在程序启动的时候都加载吗?

发布于 2022-09-11 21:20:19 字数 339 浏览 23 评论 0

之前一直以为程序启动的时候,会由Bootstrap ClassLoader加载rt.jar包下的所有类(Integer String等)。但在研究jdbc源码的时候,实验了一次 java.sql.DriverManager 类的加载时机:

  1. 如果在测试类中没有使用DriverManager,发现DriverManager类并没有被加载;
  2. 如果测试类中使用了DriverManager,发现DriverManager类被加载了。

我想问的是,程序启动的时候,Bootstrap ClassLoader并不是加载rt.jar包下所有的类?如果不是,那他加载的是哪些?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

是伱的 2022-09-18 21:20:19

Java程序启动时,并不是一次把所有的类全部加载后再运行,它总是先把保证程序运行的基础类一次性加载到jvm中,其它类等到jvm用到的时候再加载。

va中的类大致分为三种:  1.系统类 2.扩展类 3.由程序员自定义的类

java类加载器又分:

1)Bootstrap ClassLoader

负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class,由C++实现,不是ClassLoader子类

2)Extension ClassLoader

负责加载java平台中扩展功能的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

3)App ClassLoader

负责记载classpath中指定的jar包及目录中class

4)Custom ClassLoader

属于应用程序根据自身需要自定义的ClassLoader,如tomcat、jboss都会根据j2ee规范自行实现ClassLoader

加载过程中会先检查类是否被已加载,检查顺序是自底向上,从Custom ClassLoader到BootStrap ClassLoader逐层检查,只要某个classloader已加载就视为已加载此类,保证此类只所有ClassLoader加载一次。而加载的顺序是自顶向下,也就是由上层来逐层尝试加载此类。

由此可见,会首先把保证程序运行的基础类一次性加载到jvm中。而根据资料java最早就是为嵌入式系统而设计的,内存宝贵。所有如果开始就把所有,用的到、用不到的类都加载到jvm中,势必会占用很多宝贵的内存,而且有些class可能压根在整个运行过程中都不会使用。

花开半夏魅人心 2022-09-18 21:20:19

@TiAmo 你好,谢谢你的回答,但私认为你的回答并没有解答我的疑惑。
我知道jvm启动不会一次加载所有的类,网上许多文章帖子也是说会先加载基础的类,像你的回答的部分:
clipboard.png
但是我奇怪的是,我测试的时候发现DriverManager并不会在程序启动的时候就加载,DriverManager类也是在rt.jar包下的。这是我疑惑的地方。
我实验的时候分为两次,并且都在DriverManager类的静态代码块中打了断点。
clipboard.png

第一次运行的代码:

    @Test
    public void testJdbc() throws Exception {
        System.out.println("testJdbc");
    }

第二次运行的代码:

    @Test
    public void testJdbc() throws Exception {
        System.out.println("testJdbc");
        Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test",
         "root", "root");
    }

debug会发现,第一次没有进入断点,而第二次进入了断点,那如果说虚拟机启动的时候就会加载rt.jar包下的所有类的话,在第一次执行的时候,是不是也应该进入DriverManager的静态代码块呢?

毁虫ゝ 2022-09-18 21:20:19

java 是动态加载的, 走一步看一步, 一个类引用了另一个类就会加载.
也可以显示加载,如Class.forName().

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文