GC的基础知识
1.什么是垃圾
有一个对象,没有任何的引用指向它,这个对象所占用的内存就是垃圾
从栈空间没有任何的引用指向循环的对象 || 循环引用 (一堆垃圾)
C语言申请内存:malloc free
C++: new delete
Java : new
自动内存回收,编程上简单,系统不容易出错。手动释放内存容易出两种错误
- 忘记回收
- 多次回收
2.如何定位垃圾
- 引用计数 (无法解决循环引用的问题,容易导致内存泄漏)
- Root Searching (根可达算法 // 根搜索)
3.常见的垃圾回收算法
-
标记清除 - 位置不连续,产生碎片
-
拷贝算法 - 没有碎片,浪费空间
-
标记压缩 - 没有碎片,效率偏低
效率低的原因:
找垃圾,所有的算法效率都是一样的。
重点是找到垃圾后进行整理的过程:
1.对于拷贝来说,内存的拷贝速度是非常快的,就是一个线性地址的拷贝
2.对压缩来说,任何一块内存的移动,对于多线程来说,都需要进行线程同步;如果是单线程,单线程效率本来就低。
一个对象从出生到消亡
4.JVM内存分代模型(用于分代垃圾回收算法)
-
部分垃圾回收器使用的模型
-
新生代 + 老年代 + 永久代 (1.7) / 元数据区(1.8) Metaspace
- 永久代 元数据 - Class
- 永久代必须指定大小限制,元数据可以设置,也可以不设置,无上限(受限于物理内存)
- 字符串常量 1.7 - 永久代, 1.8 - 堆
- MethodArea逻辑概念 - 永久代 , 元数据
-
新生代 = Eden + 2个suyivor区
-
YGC回收之后,大多数对象会被回收,活着的进入s0
-
再次YGC,或者的对象eden + s0 -> s1
-
再次YGC,eden + s1 -> s0
-
年龄足够 - > 老年代 (15 CMS 6)
-
s区装不下了(装不下的过去) -> 老年代
PS + PO --> 15次
CMS --> 6次
新生代大小默认8:1:1,可以调整
-
-
老年代
- 顽固分子
- 老年代满了 FGC Full GC
-
GC Tuning(Generation)
- 尽量减少FGC
- MinorGC = YGC
- MajorGC = FGC
5.常见的垃圾回收器(到JDK13,常见的有10种)
-
Serial 年轻代 串行回收 (单线程垃圾回收)
-
ParNeW 年轻代 配合CMS并行回收(2的衍生,用于配合CMS)
-
Parallel Scavenge 年轻代 并行回收 (多线程垃圾回收)
-
SerialOld
-
ParallelOld
-
CMS(垃圾回收和应用程序同时进行,降低STW的时间【200ms】) 老年代 并行回收
-
G1(10ms)
-
ZGC(1ms) PK C++
-
Shenandoah
-
Eplison
1.8默认的垃圾回收【大多数调优:1,2,4,5】: PS + ParallelOld
6.JVM调优第一步,了解生产环境下的垃圾回收器组合
-
JVM的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
-
JVM参数分类
标准:- 开头,所有的HotSpot都支持
非标准:- X 开头, 特定版本HotSpot支持特定命令
不稳定: - XX 开头, 下个版本可能取消
-XX:+PrintCommaandLineFlags
查询 -XX开头的参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRhsSMVu-1624845013278)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221162734551.png)]
7.三色标记法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-J5WbqRHx-1624845013278)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221225038939.png)]
并发标记的两种情况
- 一个对象被GC认为不是垃圾,但是随着业务进行,变成垃圾
- 浮动垃圾 floating garbage
- 下次清除
- 一个对象被GC认为是垃圾,随着业务进行,又变成不是垃圾了
- 缓存
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XhgJ2EOx-1624845013279)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221232811974.png)]
漏标
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SNasOKKa-1624845013280)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221232844852.png)]
解决方案
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-keqgAzzz-1624845013280)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221232928876.png)]
并发标记:产生漏标
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w1qOEefr-1624845013281)(C:%5CUsers%5Cadmin%5CAppData%5CRoaming%5CTypora%5Ctypora-user-images%5Cimage-20210221233017921.png)]
解决方案
- 在重新标记阶段,从头来一遍标记(从新开始一遍),解决漏标