GC的基础知识
1. 什么是垃圾
C语言中申请内存: malloc free
C++: new delete
Java: new ?
自动内存回收,编程上简单,系统不容易出错
手动释放内存,容易出现两种类型的问题
- 忘记回收
- 多次回收
没有任何引用执行的一个对象或者多个对象(循环引用)
2. 如何定位垃圾
引用计数
根可达
3 常见的垃圾回收算法
Mark-Sweep 标记清除
位置不连续,产生碎片
Copying 拷贝
没有碎片,浪费空间
Mark Compact 标记压缩
没有碎片,效率偏低
4 JVM的分代模型
部分垃圾回收器使用的模型
新生代+老年代+永久代(1.7)/ 元数据区(1.8) Metaspace
永久代 元数据 -Class
永久代必须指定大小限制,元数据可以设置,可以不设置,无上限(受限于物理内存)
字符串常量1.7-永久代 1.8-堆内存
MethodArea逻辑概念-永久代、元数据
新生代=1个eden+2个survivor区,
- YGC回收之后,大多数的对象回被回收,或者对象会进入s0
- 再次YGC回收之后,活着的对象eden+s0->s1
- 再次YGC,eden+s1->s0
- 年龄足够->老年代(15 CMS 6)
- s区装不下-> 老年代
老年代
- 顽固分子
- 老年代满了FGC Full GC
GC Tuning
- 尽量减少FGC
- MinorGC=YGC
- MajorGC=FGC
5 常见的垃圾回收器
- Serial 年轻代 串行回收
Parallel Scavenge 年轻代 并行回收
ParNew 年轻代 配合CMS的并行回收
SerialOld
ParallelOld
Concurrent Mark Sweep 老年代 并发 垃圾回收和应用程序同时运行,降低STW的时间(200ms)
G1(10ms停顿)
ZGC(1ms)PK C++
Shenandoah
Eplison
JDK1.8默认的垃圾回收:PS+ParallelOld
6 JVM调用第一步,了解生产环境下的垃圾回收器组合
JVM的命令行参数参考:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html
JVM命令参数分类:
标准:-开头,所有的HotSpot都支持
非标准 -X开头,特定版本HostSport支持特定命令
不稳定:-XX开头,下个版本可能取消
java -XX:+PrintFlagsFinal 最终参数值
java -XX:+PrintFlagsInitial 默认参数值
java -XX:+PrintCommandLineFlags