JVM
2019-06-20 本文已影响0人
wzhixin
首先会把java编译成为字节码。然后通过类加载器加载字节码。
JVM加载 双亲委任模型:
java在加载一个类的时候,会首先判断是否这个类已经被加载了,如果被加载了就会直接返回,如果没有被加载,则会使用一个互斥锁,开始对类进行加载,在加载的时候,会递归的调用parent.loadclass 就是一直到最后上层(boostraploader)看最上层能不能够加载该类,如果最上层能够加载,那么这一层的加载器就不会加载类,如果上层加载器不能加载,上层会抛出异常,这样这一层才会使用自己的加载方法,这样的一个好处就是,例如我们在如果写了一个本地list类,就不会被成功加载,因为上层加载器已经加载了一个同样名称的类,这样就会报错,这样的好处就是,我们可以实现类加载的安全性隔离。(类加载器只会加载指定路径下的类,所以如果我们想加载一个和系统类同名的类,我们可以自己写一个类加载器,并且把需要加载的类放到别的路径当中)
image.png
JVM的组成
虚拟机栈:
本地方法栈:包含八大基础类型和一个引用类型
堆:用于存放new出来的对象
方法区:类信息(一个类的名字及类中包含的方法) 常量(final) 静态变量(static) JIT编译后的代码(经常使用的代码,类似于缓存热点代码)
程序计数器:
image.png
image.png
image.png