一.GC详解
1.概念
GC就是“垃圾回收”,是Java的特性。
2.怎么执行的?是手动?还是自动?
垃圾回收是自动执行的。
而手动的方式只能进行提醒操作,而不能进行垃圾回收。
3.该动作发生在JVM的哪片区域?只发生在堆
GC只发生在堆。(注意:方法区也属于堆的范畴)
原因:为什么栈不需要垃圾回收,堆需要垃圾回收?一文详解-CSDN博客
①堆分为哪些区?
- 新生区(Young Generation)
一句话描述:它是新对象的“出生地”,绝大多数刚
new出来的对象都会首先被分配到这里(注:它内部其实还包含 Eden 区和幸存区)。
- 幸存区(Survivor Space)
一句话描述:它是新生区里的“缓冲带”,专门用来暂时存放那些经过垃圾回收后依然存活、但还没资格变老的对象。
- 老年区(Old Generation)
一句话描述:它是长期存活对象的“归宿”,存放那些在幸存区熬过了多次回收依然没被清理掉的“长寿”对象。
②GC具体发生在堆的哪个区?
这三个区都会发生GC,但是频率不同。
- 平时:GC 主要发生在新生区和幸存区(此时进行的是轻GC(也叫普通GC)),快速清理垃圾,说白了就是没事勤快点简单打扫打扫,所以频率比较高。
- 实在扛不住了:当对象太多,幸存区装不下,或者老年区满了,才会触发特别针对老年区的全面大扫除(此时进行的是重GC(全局GC))。注意:全局GC时的绝大部分都给了老年区,而新生区和幸存区也会打扫,但是占比比较少。所以才说“针对”老年区。
4.GC分为哪两种类型?
①轻GC(普通GC/Minor GC)
指仅针对新生区和幸存区进行的快速回收,专门负责清理那些生命周期极短的“朝生暮死”对象。
②重GC(全局GC/Major or Full GC)
指针对老年区(或包含新生区在内的整个堆内存)进行的全面回收,通常因老年代空间不足而触发,耗时较长且会导致程序暂停。
二.GC的算法有哪些?
1.引用计数法
①定义
这是一种非常直观的内存管理算法,它的核心思想是为每个对象维护一个“计数器”,用来实时记录当前有多少个引用正在指向该对象;每当有一个新引用指向它时,计数就加1,引用失效时计数就减1,一旦计数器归零,就意味着该对象不再被使用,可以立即被回收。
②举例
③使用频率
几乎不用
④优缺点
- 优点:回收非常及时且没有长时间的停顿
- 缺点:无法处理对象之间相互引用的“循环引用”问题(即两个对象互相引用但外部已不再访问),这会导致内存泄漏,因此主流的 Java 虚拟机并没有采用这种算法。
以上就是本篇文章的全部内容,喜欢的话可以留个免费的关注呦~~~