“我这初级程序员,别人都会的JVM调优,到我这啥也不懂慢慢学。”
01
—
类加载器(classLoader)
一.什么是类的加载?
类的加载就是把.class文件中的二进制数据读取到内存中,将其放入方法区内,然后在堆中创建class对象,用来封装类在方法区里的数据结构。二.类加载器有哪些?
启动类加载器
扩展类加载器
应用类加载器
自定义加载器
三.你清楚类加载机制吗?
全盘负责,该一个类加载器负责加载某一个class时,该class所依赖的和引用的其他class类也有该加载器负责载入,除非显式的使用另一个加载器载入
父类委托,先让父类加载器试图加载该类,只有在父类加载器无法加载该类时才尝试从自己的类路径中加载该类
缓存机制,缓存机制将会保证所有加载过的class都会被缓存,当程序中需要使用某个class时,类加载器会先从缓存区中寻找该class,只有缓存区不存在,系统才会去读取该类对应的二进制数据,并将其转换成class对象,存入缓存区。
四.你清楚类加载过程吗?
加载查找并加载类的二进制数据
连接
验证元数据验证,文件格式验证,字节码验证,符号引用验证
准备为类的静态变量分配内存,并将其初始化为默认值
解析将符号引用转换为直接引用
初始化为类的静态变量赋予正确的初始值
使用new出对象程序中使用
卸载执行垃圾回收
02
—
GC垃圾处理器
一.如何判断类可以被回收
引用计数,每个对象都有个引用计数的属性,当对象被引用加一,释放减一,计数为0时可以被回收。这个方法无法解决对象循环利用的问题。
可达性分析,从gcroots开始搜索,没有与gcroots直接关联或间接关联的对象,被称为不可达对象,可以被回收。
二.如何判断类应该被回收
1.该对象没有与gcroots相连
2.没有重写finalize()方法或finalize()方法已经被执行过的则直接回收。如果重写了finalize()方法但是finalize()没有被执行,则把对象加入到F-Queue队列中去,在这里执行finalize()方法,如果finalize()方法里没有给对象重新赋值引用,则应该被回收。(不建议使用finalize()函数,因为finalize()函数不确定性大,开销大,无法保证各个对象的调用顺序)
三.java创建对象的过程
newstudent()
首先检查这个指令的参数能否在常量池中定义到类的符号引用
然后执行类的加载过程
然后为类分配内存
然后存入eden区
四.引用的分类
强引用弱引用软引用虚引用
五.垃圾回收算法
标记清除标记整理标记复制分代收集算法
六.垃圾回收器
serial收集器
parNew收集器
parallel收集器
parallelold收集器
CMS收集器
G1收集器
七.jvm如何调优
首先用jvisualvm,jdk自带全能工具,分析内存,线程快照,监控内存变化,gc变化
然后根据情况设置
堆内存大小-Xmx
设置新生代大小-XX:NewSize
新生代老生代占比:-XX:NewRatio
伊甸园空间和幸存者占比:-XX:SurvivorRatio
设置垃圾回收器
以上图片部分来自网络,如有侵权,请联系删除。