什么是jvm
学习jvm干什么
常见jvm
这节课以hotshop为准
学习路线
内存结构--------------------
程序计数器
虚拟机栈
安全:私有
共享 不安全
栈内存溢出
栈帧过多导致栈内存溢出
栈帧过大导致栈内存溢出
线程运行诊断
本地方法栈
堆
堆内存溢出
堆内存诊断
案例1
jvisualvm 用可视化的方法展示虚拟机
方法区
定义
方法区的内测溢出
方法区 常量池
常量池的作用 给指令提供常量符号
方法区 运行时常量池
运行中常量池中的 串池 StringTable
StringTable 数据结构上为hash表
遇到串池中没有的字符 创建并放入串池中
StringTable 字符串变量拼接
StringTable 编译期优化
StringTable 字符串延迟加载
遇到才加载
StringTable intern_1.8
StringTable intern_1.6
StringTable 的位置
1.6
1.8
StringTable 垃圾回收
StringTable也会被垃圾回收,当内存满了 没被引用的字符串会被回收
StringTable 调优
桶个数 比较多 就可以直接放入桶中 而不是连接到桶的链表中 可以减少时间
面对大量有重复的字符串创建,使用intern 去重,进而减轻堆内存的压力
直接内存
内存溢出
直接内存的释放原理
直接内存释放 使用了java中虚引用的机制
禁用显式回收对直接内存的影响
因为不能显示的调用垃圾回收了 所以直接内存可能会堆积 可以手动调用unsafe
jvm垃圾回收
如何判断对象可以回收
引用计数法
有人引用就不回收
可达性分析算法
GC Root
活动线程中局部对象引用的对象可以作为根对象
五种引用
强引用 软引用 弱引用
弱引用:只要发生垃圾回收就会被回收
软引用:内存不够 就会被回收
因为 软,弱自身也会占有内存 到时候有可能把他们也释放掉 放入队列里好找
虚引用和终结器引用
必须配合引用队列使用
虚引用
当ByteBuffer创建直接内存时 需要虚引用将直接内存释放
终结器引用
当没有强引用指向对象时 而且finallize方法被重写 终结器引用找到指向的内容调用finallize回收垃圾 效率很低
总结
软引用的应用
当内存不足 强引用会导致内存溢出
软引用——引用队列 用于清空软引用本身
弱引用
回收算法---标记清除算法
容易产生内存碎片
回收算法---标记整理算法
效率较低
回收算法---复制算法
没有内存碎片 但是需要双倍内存
分代回收
实际的垃圾回收
相关VM参数 GC相关参数
GC分析 GC是垃圾收集的意思
GC 大对象 onn
垃圾回收器
串行垃圾回收器
吞吐量优先
响应时间优化
垃圾回收器 G1
取代了CMS垃圾回收器
G1_垃圾回收阶段 新生代
G1_新生代回收+CM
G1_混合收集
fullGC概念辨析
新生代_跨代引用
G1_重新标记阶段
G1_字符串去重
G1_类卸载
巨型对象
越早回收越好
动态调整阈值
G1 小结
GC 调优
调优领域
内存调优前 要先看是不是自己代码的问题
新生代调优
new 的对象放入伊甸园
如何对新生代调优
新生代越大越好吗
空间大了 回收的时间也会变大 所以不是越大越好。
总的原则:给新生代一个较大的大小。
新生代垃圾回收的方法是复制算法,复制算法两个阶段:标记和复制,复制需要的时间较大,新生代大部分对象朝生西死。
新生代调优——幸存区
生存时间短的尽量留在新生代,尽快被回收
生存时间长的对象尽快晋升 不要再幸存区被复制来复制去
老年代调优
GC调优案例
- 案例1 :有可能新生代 过小:需要增加新生代大小,提高幸存区大小,晋升阈值。
- 案例2:查看cms哪个阶段时间较长,发现是重新标记阶段,cms做重新标记时,会扫描整个堆内存,如果业务高峰的时候新生代对象比较多,就会很慢,所以再重新标记之前先进行一次新生代垃圾回收
- 案例3:发现使用了jdk1.7之前的版本,1.7之前的版本采取了永久代,永久代空间不足也会导致full GC,1.8之后使用元空间,他的垃圾回收由操作系统控制,
类加载
类文件结构
常量池
记录java类中的各种信息 类信息 方法信息 等等
访问标识和继承信息
field 成员变量的信息
方法信息
附加属性
字节码指令
init
main
javap 自己分析类结构文件太麻烦
图解方法内字节码的执行流程
a赋值
分析a++
条件判断
循环控制指令
while循环
do while循环
for循环
小练习 判断结果
构造方法的原理
整个类的构造方法
每个对象的构造方法
方法调用
多态的原理
使用HSDB
vtable 类在多态的方法存在一张虚发放表中
vtbale与class的偏移地址是1b8
异常 Catch
Exception table 含头不含尾
多个catch
multi-catch
finally
面试题1
面试题2
答案为10
return 之前会进行暂存
synchromized
语法糖
默认构造
自动拆装箱
泛型擦除
泛型反射
可变参数
foreach
数组的循环
集合的循环
只有实现了Iterable接口,才可以进行迭代优化