JAVA的GC

Garbage Collector of JAVA NOTES

Reference video https://www.bilibili.com/video/BV11Z4y1G7wg?p=11

malloc free (C)

new delete (C++)

new  (Java) 自动内存回收 编程简单 系统不容易出错

垃圾:没有任何引用指向的一个对象或者多个对象(循环引用)

 

如何定位垃圾

1. Reference count 引用计数: 但是不能解决循环引用的问题

2. Root Searching 根可达算法:线程栈变量,静态变量,常量池,JNI指针 除此之外全是垃圾

 

常见的垃圾回收算法

1. 标记清除算法 - 在被标记后直接对对象进行清除 Mark-Sweep 标记后进行清除 位置不连续,产生碎片

2. 拷贝 - 下一步将不用回收的内存复制到新的内存区域,这样旧的内存区域就可以全部回收,而新的内存区域则是连续的。 Copying 没有碎片,但浪费空间。

3. 标记压缩 Mark-Compact 没有碎片,效率偏低

  - 标记-压缩算法首先还是“标记”,标记过后,将不用回收的内存对象压缩到内存一端,此时即可直接清除边界处的内存,这样就能避免复制算法带来的效率问题,同时也能避免内存碎片化的问题。老年代的垃圾回收称为“Major GC”。

 

JVM分代算法

new-young 新生代 存活对象少

old 老年代

(1.7 Permanent 永久代)

1. 部分垃圾回收器使用的模型

2. 新生代 + 老年代 + 永久代 (1.7)/元数据区 Metaspace (1.8)

  1 永久代 元数据 - Class

  2 永久代必须指定大小限制,元数据区无上限(受限于物理内存)

  3  字符串常量 1.7永久代 1.8则在堆里

  4 MethodArea 逻辑概念 - 1.7对应永久代 1.8对应元数据

3. 新生代 = eden + 2个survivor区 

  1 YGC回收之后 大多数会被回收 用拷贝算法 - 存活的对象放到survivor s0区

  2 再次回收之后 存活的对象(eden+s0)放到survivor s1区

  3 再次回收之后 存活的对象(eden+s1)放到survivor s0区

  4 年龄足够 则进入老年代 (Mark Compact)

  5 s区装不下 则进入老年代

  eden:survivor:survivor = 8:1:1

  new:old = 1:3

4. 老年代满了 则Full GC

5. GC Tuning (Generation)

  1 尽量减少Full GC

  2 Minor GC = YGC

  3 Major GC = Full GC

 

常见的垃圾回收器

1. Serial 年轻代串行回收

2. Parallel Scavenge并行回收

3. ParNew 年轻代 配合CMS的并行回收 concurrent mark sweep

4. SerialOld

5. ParallelOld

6. ConcurrentMarkSweep 老年代 并发的 垃圾回收和应用程序同时运行,降低STW的时间

7. G1

8. ZGC

9. Shenandoah

10. Eplison

1.8默认的垃圾回收机 Parallel Scavenge + ParallelOld

 

posted @ 2021-01-12 13:55  YBgnAW  阅读(61)  评论(0编辑  收藏  举报