一、类加载机制:
JVM的类加载机制主要有如下3种:
1、全盘负责:所谓全盘负责,就是当一个类加载器负责加载某个Class时,该Class所依赖和引用其他Class也将由该类加载器负责载入,除非显示使用另外一个类加载器来载入
2、双亲委派:所谓的双亲委派,则是先让父类加载器试图加载该Class,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类。通俗的讲,就是某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成类加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载
3、缓存机制:缓存机制将会保证所有加载过的Class都会被缓存,当程序中需要使用某个Class时,类加载器先从缓存区中搜寻该Class,只有当缓存区中不存在该Class对象时,系统才会读取该类对应的二进制数据,并将其转换成Class对象,存入缓冲区中。这就是为很么修改了Class后,必须重新启动JVM,程序所做的修改才会生效的原因
特别说明双亲委派机制:
1、当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成
2、当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成
3、如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载
4、若ExtClassLoader也加载失败,则会使用AppClassLoader来加载,如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException
二、字节码执行机制:
https://blog.csdn.net/lemon89/article/details/70198058
三、JVM内存模型:
1、程序计数器:
2、虚拟机栈:
3、本地方法栈:
4、堆:
5、方法区:
运行时常量池:
Object object=new Object( ) ;
四、GC垃圾回收:
1、如何判断对象已死:
2、垃圾收集算法:
堆内存分为年轻代和老年代。年轻代又分为Eden和Survivor区。默认情况下,老年代占整个堆内存的2/3;年轻代占1/3。Eden占年轻代的80%;from区(S0区)占10%,to区(S1区)占10%。
new出来的对象存储在Eden,当Eden满的时候,就会做一次minorGC。清理无效对象,剩下的有效对象进入from区。当from区满的时候,又会触发一次minorGC,剩余有效对象进入to区。当to区满的时候,同样触发一次minorGC,剩余有效对象进入from区,from区和to区的GC是一个循环过程,没触发一次GC年龄值增加1,年龄达到15次的对象会进入老年区。当老年区满的时候,会触发一次fullGC。
五、JVM性能调优:
https://blog.csdn.net/weixin_42447959/article/details/81637909