java GC泛指java的垃圾回收机制,我们在日常写java代码的时候,一般都不需要编写内存回收或者垃圾清理的代码,也不需要像C/C++那样做类似delete/free的操作。JVM已经自动帮我们完成GC;但是写代码难免会遇到一些特殊情况,比如OOM,所以需要我们了解JVM是如何完成GC的;
接下来,我们需要了解如下问题:哪些内存要回收,什么时候回收,怎么回收.
首先,我们要明白,JVM中GC帮我们自动管理内存的同时,GC是一种高开销的动作,所以我们应该尽量避免频繁的GC;
一,哪些内存要回收
java内存模型中分为五大区域已经有所了解。我们知道程序计数器
、虚拟机栈
、本地方法栈
,由线程而生,随线程而灭,当方法或线程执行完毕后,内存就随着回收,因此无需关心。
而Java堆
、方法区
则不一样。方法区存放着类加载信息,但是一个接口中多个实现类需要的内存可能不太一样,一个方法中多个分支需要的内存也可能不一样【只有在运行期间才可知道这个方法创建了哪些对象没需要多少内存】,这部分内存的分配和回收都是动态的,gc关注的也正是这部分的内存。
为了高效的回收,jvm将堆分为三个区域:
1 | 1.新生代(Young Generation)NewSize和MaxNewSize分别可以控制年轻代的初始大小和最大的大小 |
二,什么时候回收
简单的讲,就是GC算法区域满了或者将满了;
1 | minor GC(young GC):当年轻代中eden区分配满的时候触发[值得一提的是因为young GC后部分存活的对象会已到老年代(比如对象熬过15轮),所以过后old gen的占用量通常会变高] |
三,如何找到”垃圾”
1 | 1.引用计数算法 |
注:即使可达性算法中不可达的对象,也不是一定要马上被回收;
1 | 要真正宣告对象死亡需经过两个过程。 |
四,如何进行垃圾回收
1 | 1.标记/清除算法【最基础】 |
五,GC分类
1.MinorGC(年轻代GC)
年轻代:尽可能的快速收集那些生命周期短的对象
2.FullGC(老年代GC)
FullGC一般也会触发年轻代的GC,FullGC比MinorGC慢,但是执行频率低
注:程序中调用System.gc();可能会触发FullGC,但是不是一定的;慎用
****更多GC详情,参考博文https://www.jianshu.com/p/76959115d486
- 本文作者: Kiven
- 本文链接: http://hzxstudio.com/2018/10/01/java2-4/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!