Java GC(Garbage Collection,垃圾收集,垃圾回收)机制,作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题,在Java的虚拟机中存在自动内存管理和垃圾清扫机制。
Java GC机制主要完成3件事:确定哪些内存需要回收,确定什么时候需要执行GC,如何执行GC。
Java垃圾回收的根节点包括:
- 局部变量
- 静态变量
- Native 方法所引用的对象
- 活动线程
Java垃圾回收朴素算法
- Mark and sweep(标记清除) 缺点:回收后碎片化会比较严重
- Compact(压缩) 缺点:本身做起来会比较复杂
- opy(复制) 缺点:内存被切成两半,每次只能用一半。
Java分代回收算法内容
-
基础假设:大部分对象只存在很短的时间
-
新内存分为新生代、老生代
-
将新生代分为Eden,Survivor1、Survivor2
Java垃圾回收机制图
在新生代中,使用“停止-复制”算法进行清理,将新生代内存分为2部分,1部分 Eden区较大,1部分Survivor比较小,并被划分为两个等量的部分。每次进行清理时,将Eden区和一个Survivor中仍然存活的对象拷贝到 另一个Survivor中,然后清理掉Eden和刚才的Survivor。
在新生代中 存活Survivor一定次数会被转入老生代。老生代可以保留很长时间,在老生代中也有它自己的GC。
除了新生代和老生代,还有个持久代,下面来看看持久代用了存什么
持久代
- 放置ClassLoader读进来的Class,除了Class外
- 放置String.intern后的结构
- 易出现OutOfMemoryError:PermGen Space
垃圾回收在什么时候运行?
- 内存分配失败时运行
- 使用System.gc()
垃圾回收对于什么对象回收?
对于看得见的对象保留,对于看不见的对象回收
这是我对Java垃圾回收机制的一些总结,想要了解更多的可以再查找些资料学习。