GC和GC Tuning 垃圾回收

GC基础知识

1、什么是垃圾

没有任何引用指向的一个对象或者多个对象
C语言中申请内存:malloc free
c++:new delete

java:new
自动内存回收,编程上简单,系统不容易出错,手动释放内存,容易出现两种类型问题:
1、忘记回收
2、多次回收

2、如何找到垃圾

1、引用计数(有缺陷,不能解决循环引用)
2、根可达算法
哪些对象是根对象呢?
根线程变量、静态变量、常量池、JNI指针
从根找不到的 都是垃圾,和根有联系的就不是垃圾

3、常见的垃圾处理方法

1、标记清除 Mark-Sweep
碎片化,位置不连续

2、拷贝算法
没有碎片,浪费空间,位置连续

3、标记压缩 Mark-Compact
效率低

JVM内存分代模型

1、在部分垃圾回收器使用的模型
2、新生代 new + 老年代 old + 永久代(1.7)/元数据区(1.8)

  • 永久代:元数据-Class
  • 永久代必须指定大小限制,元数据可以设置,无上限
  • 字符串常量 jdk1.8版本存在 堆里面
    3、新生代 = Eden + 2个survivor区:
    YGC回收之后,大多数的对象都会被回收,或者的进入s0
    再次TGC,活着的对象Eden+ s0 —> s1
    再次TGC,Eden + s1 ----> s0
    年龄足够–>老年代(15 或者 16 )
    s区装不下 就 扔给老年代
    堆内存逻辑分区

GC和GC Tuning 垃圾回收
4、老年代

  • 1.包含 顽固分子
  • 2.老年代满了FGC
    5、GC Tuning
  • 尽量减少FGC
  • MinorGC = YGC
  • MajorGC = FGC

垃圾回收器

GC和GC Tuning 垃圾回收

Serial(串行)单线程

  1. Serial 年轻代 串行回收,一个线程进行垃圾回收

java程序运行会产生卡顿现象就是因为 STW
GC和GC Tuning 垃圾回收

Eden区的对象满了,STW(stop the world),让singleGC上场,指向垃圾回收,执行完之后,你再继续运行

PS 年轻代 并行回收

  1. 并行回收,多个线程同时进行垃圾回收,效率比单线程要高
    GC和GC Tuning 垃圾回收

parnew :配合CMS的并行回收

GC和GC Tuning 垃圾回收

ConcurentMarkSweep

CMS:并发的

非常复杂
在垃圾回收的时候也同时进行应用程序,降低STW的时间(200ms)

GC和GC Tuning 垃圾回收

在CMS之后诞生了

G1 (STW:10ms)

ZGC(STW :1ms)

我们就只对下面几个垃圾回收器进行调优,因为这是默认的垃圾回收器

1.8 默认的垃圾回收: PS + ParallelOld
GC和GC Tuning 垃圾回收

-XX :+ PrintCommandLineFlags

-XX:+PrintFlagsFinal 最终参数值
GC和GC Tuning 垃圾回收