GC优化:https://tech.meituan.com/2017/12/29/jvm-optimize.html
jvm内存模型
程序计数器
是当前线程所执行的字节码的行号指示器,每条线程都要有一个独立的 程序计数器,这类内存也称为“线程私有”的内存。
虚拟机栈
是描述java方法执行的内存模型,每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
每一个方法从调用直至执行完成 的过程,就对应着一个栈帧在虚拟机栈中入栈到出栈的过程。
本地方法栈
本地方法栈为Native方法服务
堆
创建的对象和数组都保存在Java堆内存中,也是垃圾收集器进行垃圾收集的最重要的内存区域。
由于现代JVM采用分代收集算法, 因此Java堆从GC的角度还可以 细分为: 新生代( Eden From Survivor 和 To Survivor)和老年代。
方法区
存放已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
运行时常量池和元空间是方法区的一部分
java垃圾回收
https://yq.aliyun.com/articles/708634?utm_content=g_1000067014
判断对象是否为垃圾的算法
1)引用计数算法(一般不用)
优点 执行效率高,程序执行受影响小
缺点 无法检测出循环引用的情况,导致内存泄漏
2)可达性分析法:通过判断对象的引用链是否可达来决定对象是否可以被回收
垃圾回收算法
1)标记-清除算法
2)复制算法
解决了碎片化问题
顺序分配内存,简单高效
适用于对象存活率低的场景
3)标记-整理
4)分代收集算法(常用)
按照对象生命周期的不同划分区域以采用不同的垃圾回收算法
新生代:采用复制算法
老年代:采用用"标记-清除"或者"标记-整理"算法
永久代(方法区):同老年区 (1.8以后已经没有)
四种引用类型
引用类型 | 被垃圾回收时间 | 用途 | 生存时间 |
---|---|---|---|
强引用 | 从来不会 | 对象的一般状态 | JVM停止时终止 |
软引用 | 在内存不足时 | 对象缓存 | 内存不足时终止 |
弱引用 | 垃圾回收时 | 对象缓存 | Gc运行后终止 |
虚引用 | 不确定 | 标记、哨兵 | 不确定 |