JVM

84 阅读5分钟

什么是jvm

图片.png

图片.png

学习jvm干什么

常见jvm

这节课以hotshop为准 图片.png

学习路线

图片.png

内存结构--------------------

程序计数器

图片.png

图片.png 图片.png

虚拟机栈

图片.png 图片.png

图片.png 安全:私有 图片.png 共享 不安全 图片.png

图片.png

图片.png

栈内存溢出

图片.png 栈帧过多导致栈内存溢出

图片.png 栈帧过大导致栈内存溢出

图片.png

线程运行诊断

图片.png 图片.png 图片.png 图片.png 图片.png

本地方法栈

图片.png

图片.png

堆内存溢出

图片.png

堆内存诊断

图片.png

图片.png 案例1

图片.png

jvisualvm 用可视化的方法展示虚拟机

图片.png

图片.png

图片.png

图片.png

方法区

定义

图片.png

图片.png

图片.png

方法区的内测溢出

图片.png 图片.png

图片.png

方法区 常量池

常量池的作用 给指令提供常量符号

图片.png

图片.png

图片.png

方法区 运行时常量池

图片.png

图片.png

运行中常量池中的 串池 StringTable

图片.png StringTable 数据结构上为hash表 图片.png 遇到串池中没有的字符 创建并放入串池中 图片.png

StringTable 字符串变量拼接

图片.png

图片.png

图片.png

StringTable 编译期优化

图片.png

StringTable 字符串延迟加载

遇到才加载 图片.png

StringTable intern_1.8

图片.png 图片.png 图片.png

StringTable intern_1.6

图片.png

图片.png

StringTable 的位置

图片.png

1.6 图片.png 1.8

图片.png

StringTable 垃圾回收

StringTable也会被垃圾回收,当内存满了 没被引用的字符串会被回收

图片.png

StringTable 调优

图片.png 图片.png 桶个数 比较多 就可以直接放入桶中 而不是连接到桶的链表中 可以减少时间

图片.png 面对大量有重复的字符串创建,使用intern 去重,进而减轻堆内存的压力

直接内存

图片.png

图片.png

图片.png

内存溢出

图片.png

直接内存的释放原理

图片.png 图片.png

图片.png

图片.png 直接内存释放 使用了java中虚引用的机制

图片.png 图片.png

图片.png

禁用显式回收对直接内存的影响

图片.png 因为不能显示的调用垃圾回收了 所以直接内存可能会堆积 可以手动调用unsafe

图片.png

jvm垃圾回收

图片.png

如何判断对象可以回收

引用计数法

有人引用就不回收 图片.png

可达性分析算法

图片.png GC Root 图片.png 活动线程中局部对象引用的对象可以作为根对象

图片.png

五种引用

图片.png

强引用 软引用 弱引用

图片.png

图片.png 弱引用:只要发生垃圾回收就会被回收 软引用:内存不够 就会被回收 图片.png 因为 软,弱自身也会占有内存 到时候有可能把他们也释放掉 放入队列里好找 图片.png

虚引用和终结器引用

必须配合引用队列使用

虚引用 当ByteBuffer创建直接内存时 需要虚引用将直接内存释放 图片.png

终结器引用 当没有强引用指向对象时 而且finallize方法被重写 终结器引用找到指向的内容调用finallize回收垃圾 效率很低 图片.png

总结

图片.png

软引用的应用

当内存不足 强引用会导致内存溢出 图片.png

图片.png

图片.png

软引用——引用队列 用于清空软引用本身

图片.png

图片.png

弱引用

图片.png

回收算法---标记清除算法

图片.png 容易产生内存碎片

回收算法---标记整理算法

效率较低 图片.png

回收算法---复制算法

没有内存碎片 但是需要双倍内存 图片.png

分代回收

实际的垃圾回收

图片.png

图片.png

图片.png

图片.png

图片.png

相关VM参数 GC相关参数

图片.png

GC分析 GC是垃圾收集的意思

图片.png

GC 大对象 onn

图片.png

垃圾回收器

图片.png

串行垃圾回收器

图片.png

吞吐量优先

图片.png

响应时间优化

图片.png

垃圾回收器 G1

取代了CMS垃圾回收器 图片.png

G1_垃圾回收阶段 新生代

图片.png

图片.png 图片.png

G1_新生代回收+CM

图片.png

G1_混合收集

图片.png

fullGC概念辨析

图片.png

新生代_跨代引用

图片.png

G1_重新标记阶段

图片.png

图片.png

图片.png

G1_字符串去重

图片.png

G1_类卸载

图片.png

巨型对象

越早回收越好 图片.png

图片.png

动态调整阈值

图片.png

G1 小结

GC 调优

图片.png 图片.png

调优领域

图片.png

图片.png 内存调优前 要先看是不是自己代码的问题 图片.png

新生代调优

new 的对象放入伊甸园 图片.png 如何对新生代调优
新生代越大越好吗
空间大了 回收的时间也会变大 所以不是越大越好。 图片.png 总的原则:给新生代一个较大的大小。
新生代垃圾回收的方法是复制算法,复制算法两个阶段:标记和复制,复制需要的时间较大,新生代大部分对象朝生西死。

图片.png

新生代调优——幸存区

生存时间短的尽量留在新生代,尽快被回收 图片.png 生存时间长的对象尽快晋升 不要再幸存区被复制来复制去 图片.png

图片.png

老年代调优

图片.png

GC调优案例

图片.png

  • 案例1 :有可能新生代 过小:需要增加新生代大小,提高幸存区大小,晋升阈值。
  • 案例2:查看cms哪个阶段时间较长,发现是重新标记阶段,cms做重新标记时,会扫描整个堆内存,如果业务高峰的时候新生代对象比较多,就会很慢,所以再重新标记之前先进行一次新生代垃圾回收

图片.png

  • 案例3:发现使用了jdk1.7之前的版本,1.7之前的版本采取了永久代,永久代空间不足也会导致full GC,1.8之后使用元空间,他的垃圾回收由操作系统控制,

类加载

图片.png

类文件结构

图片.png

图片.png

图片.png

图片.png

常量池

记录java类中的各种信息 类信息 方法信息 等等 图片.png

图片.png

图片.png

访问标识和继承信息

图片.png

图片.png

field 成员变量的信息

图片.png

方法信息

图片.png

图片.png

图片.png

附加属性

图片.png

字节码指令

init

图片.png

main

图片.png

javap 自己分析类结构文件太麻烦

图片.png

图片.png

图解方法内字节码的执行流程

图片.png

图片.png

图片.png

图片.png

图片.png

a赋值

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

分析a++

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

条件判断

图片.png

图片.png

图片.png

图片.png

循环控制指令

while循环 图片.png

图片.png do while循环 图片.png for循环

图片.png

小练习 判断结果

图片.png

图片.png

构造方法的原理

整个类的构造方法 图片.png

图片.png

图片.png 每个对象的构造方法

图片.png

图片.png

图片.png

图片.png

方法调用

图片.png

图片.png

多态的原理

使用HSDB 图片.png 图片.png

图片.png

图片.png vtable 类在多态的方法存在一张虚发放表中 vtbale与class的偏移地址是1b8 图片.png

异常 Catch

Exception table 含头不含尾 图片.png

多个catch

图片.png

图片.png

图片.png

multi-catch

图片.png

finally

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png 面试题1

图片.png

图片.png 面试题2
答案为10 图片.png return 之前会进行暂存 图片.png

图片.png

synchromized

图片.png

图片.png

图片.png

图片.png

语法糖

图片.png

默认构造

图片.png

自动拆装箱

图片.png

泛型擦除

图片.png

图片.png

泛型反射

图片.png

图片.png

图片.png 图片.png

可变参数

图片.png

图片.png

foreach

数组的循环 图片.png 集合的循环
只有实现了Iterable接口,才可以进行迭代优化 图片.png

图片.png

switch 字符串

图片.png

图片.png

图片.png

图片.png

switch 枚举

图片.png

图片.png

枚举

图片.png

图片.png

try-with-resources

图片.png

图片.png

图片.png

图片.png

图片.png

图片.png

重写桥接

图片.png

图片.png

图片.png

匿名内部类

图片.png

图片.png

图片.png

图片.png

图片.png