java程序启动的时候,是不是一次性加载所有类

我们知道java程序运行的时候,所有类必须被加载到jvm虚拟机中才可以正常使用


那么问题来了,是不是所有的class文件都在启动的时候全部加载呢?

java中的类大致分为三种:  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可能压根在整个运行过程中都不会使用。


所有得出结论:

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



  • 7
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在Java中,通常在程序启动时就被加载,而且在运行过程中一般不重新加载。但是,有些情况下可能需要重新加载,比如在开发过程中修改了的源代码后需要重新加载以测试修改是否生效。 为了重新加载,可以使用Java的热部署(HotSwap)技术,该技术可以在不停止程序的情况下重新加载已经被加载。在Java中,可以通过使用一些工具或框架来实现热部署,比如JRebel和Spring Loaded等。 除了热部署之外,还可以通过使用Java加载器来重新加载Java中有多个加载器,可以通过调用加载器的reload方法来重新加载已经被加载。但是,这种方法比较复杂,需要程序员自己实现。因此,在实际开发中,一般更倾向于使用热部署技术来重新加载。 ### 回答2: 在Java中,的重新加载是指在运行时动态地改变或重新加载一个已经加载过的Java虚拟机的加载机制规定,每个在内存中只能被加载一次,即使重新加载一个,也不替换掉原来已经加载。 尽管如此,我们可以通过一些技术来实现的重新加载。一种常见的方式是通过自定义加载器实现的重新加载。我们可以自定义一个加载器,在加载之前,检查的更新时间。如果的源文件或字节码文件发生了改变,就重新载入这个。 另一种实现的重新加载的方式是使用Java的热部署技术,如JRebel。JRebel工具可以在不重新启动应用程序的情况下,动态地替换的字节码,从而实现的重新加载。 无论使用哪种方式,的重新加载都需要注意以下几点: 1. 确保重新加载与原始具有相同的名和包名,否则导致运行时异常。 2. 在重新加载之前,需要确保原始已经被卸载,否则重新加载生效。 3. 对于正在运行的实例,需要注意处理好的版本兼容性,避免出现运行时错误。 4. 考虑到性能问题,的重新加载应该谨慎使用,尽量避免频繁地重新加载。 总之,Java中的重新加载可以通过自定义加载器或使用热部署工具实现。但需要注意一些细节问题,确保重新加载能够正确地被使用。 ### 回答3: 在Java中,的重新加载是指在程序运行时对进行更新或替换。Java虚拟机(JVM)默认情况下不支持的重新加载,但可以通过一些特定的技术实现的重新加载。 一种常用的实现重新加载的技术是利用Java加载器机制。Java加载器可以动态加载文件,因此可以通过自定义加载器来实现的重新加载功能。首先,需要编写一个自定义的加载器,该加载器负责从指定的路径或URL加载文件。然后,在程序中使用这个自定义的加载加载需要重新加载文件,可以通过修改文件的路径或URL来实现的更新。在客户端代码中,可以通过调用自定义加载器的reload方法来重新加载。 另一种实现重新加载的技术是使用热部署框架,例如JRebel。这些框架通过在运行时动态地替换的字节码实现的重新加载。通过在IDE中安装和配置这些框架,可以在开发过程中实现代码的即时更新,节省了重新编译和启动的时间。 需要注意的是,的重新加载也可能引发一些问题,例如由于之间的依赖关系导致的加载顺序问题,或者由于状态的改变导致的运行时错误。因此,在进行的重新加载时,需要谨慎对待,并进行充分的测试和验证。 总而言之,Java中可以通过自定义加载器或使用热部署框架来实现的重新加载。这些技术可以加快开发过程中的代码更新和调试,提高开发效率。同时,在实际应用中需注意之间的依赖和测试工作,以确保重新加载能够正确地运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值