浅谈JAVA垃圾回收

怎样找到垃圾

引用计数法

为每个创建的对象分配一个引用计数器,用来存储该对象被引用的次数,引用计数为0的对象将被回收。因为这种方案存在无法检测“循环引用”的问题,所以java并没有采用这个算法

根搜索算法

这种算法的思路是将所有引用对象想象成一棵树,从树的根节点GC roots出发,找出所有连接的树枝对象,其余未连接根节点的对象视为“垃圾”

GC ROOTS

  • 虚拟机栈(帧栈中的本地变量表)中引用的对象
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中JNI引用的对象

怎样回收垃圾

标记清除法

方式
先标记可清除的垃圾,再清理
特点
容易造成内存碎片,比如有多段不连续的闲置1M内存,那想开辟2M的内存空间时,这些都是不可用

复制算法

方式
将内存分为相等的两块轮流使用,内存块A用完了就将活着的对象复制到内存块B,然后清理内存块A
特点
不会造成碎片,但内存使用率只有一半

标记整理法

方式
先标记可清除垃圾,再将可清除垃圾移到一端,再清理掉端边界外的内存区域
特点
是标记清除法的升级版,解决了碎片问题,但是因为频繁变动内存地址,效率很低

分代收集算法

方式
java堆分为新生代和老年代,新生代分为Eden区(伊甸区)和survivor区(幸存区),幸存区分为from和to两个区
特点
相当于上面三种算法的组合算法
Eden区(新生代)
多数情况下,对象会在伊甸区进行内存分配。伊甸区内存不够时,虚拟机会发生一次minor GC(次要垃圾清理),清理后存活的对象会被放入survivor的from区
Survivor区(新生代)
这是Eden区和老年代的一个缓冲,目的是减少被送到老年代的对象,从而减少major GC(主要垃圾清理)的发生。survivor区分为from和to两个区,每次进行minor GC的时候,会将from区的存活对象复制到to区(复制算法),放不下的会直接进入老年代区。然后from区和to区的职责调换,如此反复。
Old区(老年代)
老年代只有在major GC的时候才会清理。老年代采用标记整理法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值