JVM种类
首先,JVM不止一种,不过目前最流行的是HotSpot,我们要讲的也都是这种。
参考链接
参考链接
为什么需要JVM垃圾回收
对于从事C、C++程序开发的开发人员来说,他们担负着每一个对象生命开始到终结的维护责任,即需要为每一个new操作去写配对的delete/free。对于Java程序员来说,则不需要,因为这一切(内存动态分配和垃圾回收的问题)都交给了JVM来处理。
什么是”垃圾”
在java中是通过引用来和对象进行关联的,也就是说如果要操作对象,必须通过引用来进行。如果一个对象没有任何引用与之关联,则说明该对象基本不太可能在其他地方被使用到,那么这个对象就成为可被回收的对象了,也就是所谓的”垃圾”。
如何确定某个对象是”垃圾”
引用计数法
定义:给每个对象分配一个计算器,当有引用指向这个对象时,计数器加1,当指向该对象的引用失效时,计数器减一。最后如果该对象的计算器为0时,java垃圾回收器会认为该对象是可回收的。
优点:实现简单,而且效率较高
缺点:无法解决循环引用的问题,所以Java未采用此方法
参考链接可达性分析法
定义:通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,不过要注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。
垃圾收集算法
- Mark-Sweep(标记-清除)算法
- Copying(复制)算法
- Mark-Compact(标记-整理)算法
- Generational Collection(分代收集)算法
垃圾收集器种类
- 串行垃圾回收器(Serial Garbage Collector)
- 并行垃圾回收器(Parallel Garbage Collector)
- 并发标记扫描垃圾回收器(CMS Garbage Collector)
- G1垃圾回收器(G1 Garbage Collector)
垃圾收集触发条件
- Minor GC触发条件
当Eden区满时,触发Minor GC - Full GC触发条件
1)调用System.gc时,系统建议执行Full GC,但是不必然执行
2)老年代空间不足
3)方法去空间不足
4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
5)由Eden区、From Space区向To Space区复制时,对象大小大于To Space可用内存,则把该对象转存到老年代,且老年代的可用内存小于该对象大小
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接
参考链接