JAVA GC算法详解
生存还是死亡
对象是否需要被垃圾收集器回收主要有两种方式:引用计数法和可达性分析算法
引用计数法
给对象添加一个引用计数器,每当有一个地方引用他的时候,计数器的数值就+1,当引用失效时,计数器就-1;任何时候计数器的数值都为0的对象时不可能再被使用的。
客观的来说,引用计数法实现简单,判定效率高,但是无法解决对象的循环引用的问题。所以现在的虚拟机很少使用这种算法辣判断对象是否存活。
可达性分析算法
基本思路就是:通过一系列称为GC Roots的对象作为起始点,从这些起始点开始向下搜索,搜索所搜过的路径称为引用链Reference Chain,当一个对象到GC Roots没有任何引用链相连接时,则证明此对象时不可用的。如下图所示:4,5就被判定为需要回收的对象

GC Roots
在虚拟机中可作为GC Roots的对象包括以下几种:
- 虚拟机栈中引用的对象
- 方法区中类静态属性引用的对象
- 方法区常量引用的对象
本地方法栈引用的对象
GC算法
在被
可达性分析算法判定为需要被回收的对象时,需要进行垃圾回收操作,垃圾回收算法有以下几种:
标记清除(mark-sweep)
最基础的收集算法,如同 它的名字一样,算法分为标记和清除两个阶段:首先标记出需要被回收的对象,在标记完成后统一回收所有被标记的对象,它的标记过程其实就是上面所讲的可达性分析算法被标记为没有GC roots的引用链。过程如下:

不足
- 效率问题,标记和清除两个过程的效率都不高
空间问题,标记清除和产生大量不连续的内存碎片,内存碎片过多容易导致以后在程序运行的过程中需要分配大对象时,无法找到足够的连续内存而不得不提前触发一次垃圾收集动作。
适用场景
适用于老年代。因为老年代回收的几率小且不频繁能减少内存碎片
复制 (coping)
为了解决标记-清除得到效率问题,
复制算法就出现了;它的原理是将可用内存容量划分为两个大小相等的内存块,每次只使用其中的一个,当这个的容量用完了。就将还存活的对象复制到另外一块上面去,然后再把已使用过的内存空间全部清理掉。这样使得每次都是对整个半区进行内存回收,内存分配就不用考考虑碎片等复杂情况
研究表明,新生代中的对象98%都是朝生夕死的,所以按照并不需要1:1来划分空间。而是将内存分为一块较大的Eden空间和两个较小的Survivor空间,每次使用Eden和其中一款Survivor。一般比例是Eden : Survivor = 8:1不足
- 空间利用率只有50%,但是经过适当的调整Eden和Survivor的比例能达到70%
复制收集算法在对象存活率较高时就要进行较多的复制操作,效率将会变低
适用场景
使用了对象存活率较低的内存空间,如Eden区。
标记整理
是标记-清除算法的升级版本。标记过程任然与标记-清除算法一样,但是后续的处理步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界意外的内存、标记-整理算法示意图如下:

JAVA GC算法详解的更多相关文章
- Java GC机制详解
垃圾收集 Garbage Collection 通常被称为“GC”,本文详细讲述Java垃圾回收机制. 导读: 1.什么是GC 2.GC常用算法 3.垃圾收集器 4.finalize()方法详解 5. ...
- Java GC 日志详解(转)
Java GC日志可以通过 +PrintGCDetails开启 以ParallelGC为例 YoungGC日志解释如下(图片源地址:这里) : FullGC(图片源地址:这里): http://blo ...
- Java GC 日志详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt105 java GC日志可以通过 +PrintGCDetails开启 以Pa ...
- JVM内存管理--GC算法详解
标记/清除算法 首先,我们回想一下上一章提到的根搜索算法,它可以解决我们应该回收哪些对象的问题,但是它显然还不能承担垃圾搜集的重任,因为我们在程序(程序也就是指我们运行在JVM上的JAVA程序)运行期 ...
- java gc日志详解
从 Full GC 信息可知,新生代可用的内存大小约为 18M,则新生代实际分配得到的内存空间约为 20M(为什么是 20M? 请继续看下面...).老年代分得的内存大小约为 42M,堆的可用内存的大 ...
- 八大排序算法详解(动图演示 思路分析 实例代码java 复杂度分析 适用场景)
一.分类 1.内部排序和外部排序 内部排序:待排序记录存放在计算机随机存储器中(说简单点,就是内存)进行的排序过程. 外部排序:待排序记录的数量很大,以致于内存不能一次容纳全部记录,所以在排序过程中需 ...
- JVM的GC理论详解
GC的概念 GC:Garbage Collection 垃圾收集.这里所谓的垃圾指的是在系统运行过程当中所产生的一些无用的对象,这些对象占据着一定的内存空间,如果长期不被释放,可能导致OOM(堆溢出) ...
- 最新java数组的详解
java中HashMap详解 http://alex09.iteye.com/blog/539545 总结: 1.就像引用类型的数组一样,当我们把 Java 对象放入数组之时,并不是真正的把 Java ...
- 转:Java HashMap实现详解
Java HashMap实现详解 转:http://beyond99.blog.51cto.com/1469451/429789 1. HashMap概述: HashMap是基于哈希表的M ...
随机推荐
- mui a链接的点击
mui里面,使用click点击在有时候是无效的,或者点击的位置错位.在别处点击才有效. mui中对a的点击应该这样写: mui('body').on('tap', "#chart" ...
- Java逆向工程(数据库表生成java类)
说起来倒是挺简单的,就是听着名字感觉挺高大上.逆向工程方式有很多,比如mybatis就提供了一个这样的工具mybatis-genderator,这个我反正是没用过只是听说过,以前在公司都是用公司写好的 ...
- 作业:for循环,迭代法和穷举法
for()循环 四要素:初始条件,循环条件,状态改变,循环体. 执行过程:初始条件--循环条件--循环体 ...
- python语法基础-函数-装饰器-长期维护
######################################################### # 装饰器 # 装饰器非常重要,面试Python的公司必问, # 原则:开放封闭原则 ...
- Ubuntu16.04编译libjpeg-turbo库
一.环境依赖 CMake v2.8.12或以后 NASM or YASM (if building x86 or x86-64 SIMD extensions),如果使用NASM, 依赖2.10之后版 ...
- mpvue框架的小程序和H5同时开发
demo链接1.样式统一为了达到共用一套样式,采用px2rem-loader和px2rpx-loader进行代码的打包,细节如下: 由于UI设计图是在蓝湖上标注,宽度750,选择像素 PX 样式中直接 ...
- echo追加和覆盖
追加: echo " " >> 文件名 覆盖: echo " " > 文件名
- ubuntu 服务器 php 环境简单搭建
安装中文支持,避免一些语言相关的坑 12345678 sudo apt-get install language-pack-zh-hans sudo vim /etc/default/locale L ...
- chap4-关联接口测试-通过全局变量传递cookie
# 1 http_request.py import requests class HttpRequest: def http_request(self, url, method, data=None ...
- Android开发之《ffmpeg解码mjpeg视频流》
MJPEG格式和码流分析,MJPEG格式的一些简介 FFmpeg解码USB摄像头MJPEG输出:http://blog.csdn.net/light_in_dark/article/details/5 ...