美文网首页
java程序启动,类的加载情况

java程序启动,类的加载情况

作者: 羞涩的二黄 | 来源:发表于2019-04-13 12:19 被阅读0次

    一、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用到的时候再加载

    二、java程序启动参数 -D是用来做什么的呢?

    官方解释:

    Set a system property value. If value is a string that contains spaces, you must enclose the string in double quotes:

    java -Dfoo="some string" SomeClass

    也就是说-D是用来在启动一个java程序时设置系统属性值的。如果该值是一个字符串且包含空格,那么需要包在一对双引号中。

    下面我们来写个测试方法就知道了!

    public class TestSystem {

        public static void main(String args[]) {

            System.out.println(System.getProperty("fuck.abc"));

        }

    }

    在运行改程序时加上JVM参数-Dfuck.abc="1234",那么运行之后你可以看到控制台输出了1234!

    一点值得注意的是,需要设置的是JVM参数而不是program参数,注意看下图

    这里的program arguments指的是什么呢?这个指的是main方法中的args数组~

    三、1. Java类的编译过程

    这是由.java源码文件转为 .class二进制字节码文件的过程。

    我们编写好的源代码,就是*.java文件。使用“javac test.java”就可以编译test.java文件。

    编译过程主要有三步:

    1.词法分析和输入到符号表

    2..注解处理

    3.语义分析和生成字节码

    详细过程:

    源代码文件*.java -> 词法分析器 -> tokens流 -> 语法分析器 -> 语法树/抽象语法树 -> 语义分析器 -> 注解抽象语法树 -> 字节码生成器 ->JVM字节码文件*.class

    最后剩成的JVM字节码文件,使用命令“javap -c test”可以查看test.class的字节码信息,主要包含三项内容:

    1.结构信息:class文件相关信息。

    2.元数据:Java源码中的声明和常量信息。

    3.方法信息:Java源码语句和表达式对应的字节码。

    其他参考:https://www.cnblogs.com/fefjay/p/6305499.html

    相关文章

      网友评论

          本文标题:java程序启动,类的加载情况

          本文链接:https://www.haomeiwen.com/subject/itylwqtx.html