JVM(类加载机制字节码的执行机制程序的编译与优化)

Posted Zephyr丶J

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM(类加载机制字节码的执行机制程序的编译与优化)相关的知识,希望对你有一定的参考价值。

JVM

类加载机制

类加载过程

加载

全限定名:全限定名 = 包名 + 类型
第二步:磁盘上的字节流存储到内存里
第三步:生成对象代表这个类

class文件来源,了解一下:
Web Applet过时了,JSP过时了
动态代理技术?

可访问性,就是public,private…这种

验证

字节码文件不一定是java编译器编译而来的

准备

这个阶段只给类变量,即静态变量分配内存
设置初始值是设置0值,而赋具体值是在初始化阶段进行的

解析

将符号引用变成直接引用

初始化

静态代码块只能引用它前面定义的静态内容,因为clinit()方法是按顺序收集的

类加载器

双亲委派模型

重点

先找这个类是否被加载过,如果被加载过,直接返回
如果没有被加载过,c==null,那就看有没有父加载器,如果父加载器无法加载,会抛出异常,跳出;如果没有父加载器了,就说明到达顶层了,看看顶层启动类加载器能不能加载
如果父加载器加载失败,那么就自己加载

被破坏的场景1:在1.2之前已经有人自己写了类加载器,为了兼容这些代码,加了一个方法findClass(),自定义的类加载器可以在findClass()中完成加载
这样原来自定义的类加载器就不需要废弃,且也能保证使用双亲委派模型

如果基础类要加载子类代码,所以子类加载器应该在基础类加载器之前加载
这里引入了一个线程上下文加载器,如果出现这种情况,就用这个加载器加载,打破了双亲委派模型

字节码的执行机制



栈帧和常量池中栈帧所属方法的符号引用进行连接



重载是以静态类型为判定依据的


0-15行是创建两个对象的过程,并分配内存,astore_1放在局部变量表的变量槽1的位置
16-21 aload是将两个sayHello方法压入栈顶,invokevirtual 是实际执行方法的地方


JAVA是基于栈的

b可以理解为是单字节bollean,s可以理解为short


程序的编译与优化

重点关注即时编译

前端编译与优化了解一下即可




回边计数器(了解)





以上是关于JVM(类加载机制字节码的执行机制程序的编译与优化)的主要内容,如果未能解决你的问题,请参考以下文章

Java 代码编译和执行的整个过程

JVM系列第7讲:JVM 类加载机制

深入JVM--探索Java虚拟机的类加载机制

从实战角度解读JVM:类加载机制+JVM调优实战+代码优化

JVM学习笔记------Java代码编译和执行的整个过程

JVM理论:(三/5)类加载机制