java程序启动的时候,是不是一次性加载所有类
2017-05-17 15:06
253 查看
我们知道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用到的时候再加载
那么问题来了,是不是所有的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用到的时候再加载
相关文章推荐
- 在eclipse中启动java程序的时候,每次都会在一个未设置断点的源码里面,卡断点
- Java中如何让web服务器启动的时候自动运行web程序中某个类的某个方法
- Java中如何让web服务器启动的时候自动运行web程序中某个类的某个方法
- Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)
- linux下通过.sh文件启动java程序
- 启动android程序和虚拟机时候出现如下错误的解决方法
- window JNI_CreateJavaVM启动java程序
- Linux下启动java程序的通用脚本sh
- Linux下启动java程序的通用脚本sh
- linux上Java Application程序启动脚本
- 当程序用ado的jet4.0方式连接的时候,对于设有access数据库密码的mdb的访问居然报错“无法启动应用程序,工作组信息文件丢失,或是已被其他用户已独占方式打开”,而用odbc方式不报错,小阴沟里翻船,郁闷中然后查文档解决之
- Android程序如何判断是不是第一次启动
- MyEclipse 6.5 启动后出现“initializing java tooling(0%)” 后程序未响应解决
- Android设置开机的时候某一个程序自动启动实例
- 不错的linux下通用的java程序启动脚本(转载)
- 启动 webLogic的时候有错误 此时不应有 \Java\jdk\lib\dt.jar
- .NET及JAVA 中如何使用代码启动程序
- linux 自启动遇到的java 程序启动不起来的大坑
- centos7下设置成开机启动的java程序没有跑起来
- [IE技巧] 如何让IE 启动的时候不加载任何插件