深入理解JVM之java代码的执行机制

来源:互联网 发布:java sleep占用cpu 编辑:程序博客网 时间:2024/05/21 10:36

1 JVM把java类文件编译为字节码(.class)文件步骤:

  1)分析和输入到符号表(Parser和Enter)

  2)注释处理(Annotation Processing)

  3)语义分析和生产class文件(采用的方法为后序遍历语法树)(Analyse and Generate)

2 类加载机制(JVM装载class文件)

 1) 装载:JVM通过类的全限定名和类加载器来完成类的加载。备注:数组类型中的元素类型由所在的classLoader加载,数据本身由JVM创建

 2) 链接:对二进制字节码的格式进行校验,初始化装载类中的静态成员变量以及解析类中调用的接口,类

 3) 初始化:执行类中静态初始化代码,构造器代码及静态属性的初始化。在以下情况下被触发执行:1)new   2)反射调用了类中的方法   3)子类调用了初始化   

                            4JVM启动过程中指定的初始化类

                   类加载器:BootstarpClassLoader ExtensionClassLoader(ExtClassLoader) SystemClassLoader(AppClassLoader) userDefinedClassLoader,

                        依次为下 一个的父类。

            BootstarpClassLoader:完成JAVA_HOME中jre/librt.jar中class文件的加载

            ExtClassLoader :完成扩展功能jar包的加载

            AppClassLoader:完成classPath中的jar包及目录的加载

        classLoader 提供的关键方法:loadClass   findLoadedClass   findClass findSystemClass  defineClass  resolveClass

  3 类执行机制

     类文件加载到jvm生产Class对象以后,就可以执行器方法了。JVM采用了invokestatic(静态方法),invokevritual(实例方法),invokeinterface(接口方法),                               invokespecial(私有方法及init方法)四种方法来执行不同方法的调用(通过javap -c xx可以查看)。

常量池存放内容:所有Field名称,方法名称,方法签名,类名称,代码及class文件中的常量值。

     类执行机制常见的有编译执行和解释执行,解释执行相对用的不太多,下面说编译执行:

     编译执行分client编译执行和server编译执行

    client较为轻量级,占用内存少,适用于桌面交互式系统,JDK6以后采用的是线性扫描寄存器分配算法,其他方面的优化:方法内联,去虚拟化,冗余消除。

   server为重量级,占用内存多些,适合服务器端的应用,采用的是图着色寄存器分配算法,其他方面的优化:标量替换,栈上分配(没有逃逸的对象在栈上分配),同步消除。

   

     

0 0
原创粉丝点击