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
程序的编译与优化
重点关注即时编译
前端编译与优化了解一下即可
回边计数器(了解)