Garbage Collection :1. 哪些对象需要回收

本文深入探讨Java垃圾回收(GC)机制,包括如何判断对象是否存活的两种方法:引用计数法和可达性分析法。详细解释了四种引用类型:强引用、软引用、弱引用和虚引用,并介绍了对象在GC过程中的自救机制。

o关于GC需要考虑的问题:
?哪些对象需要回收
?什么时候回收
?如何回收

哪些对象需要回收: 已经“死去”的对象需要被回收释放内存

首先,需要判断对象是否存活。
1.引用计数法 Reference Counting
给对象添加一个引用计数器,每当有一个reference变量指向该对象时,计数器加1, 当引用失效时,计数器减1,计数器为0时表示该对象不可能在被使用。
引用计数法实现简单,判定效率高,Java中没有使用该方法来管理内存是因为它很难解决对象之间相互循环引用的问题。
对象之间互相循环使用容易造成内存泄漏[内存泄漏]而浪费空间资源。

2.可达性分析法 GC Roots Treacing
通过一系列名为“GC Roots”的对象为起点向下搜索,搜索路径称为“引用链” reference chain,当一个对象节点到GC Roots之间不可达,则该对象“死亡”,可以被回收。

在这里插入图片描述

如上图所示,虽然对象4、5、6相互引用,但是他们与 GC Roots之间是不可达的,因此被判定为“死亡”对象可以回收。

为了描述这样一类对象(当内存空间足够时,这些对象可以保存,若即使GC后内存资源依然很紧张中,那么这些对象将会被抛弃回收),Java将引用分为四类:
1).强引用 Strong Reference : 类似“ Object obj = new Object()” 这样的称之为强引用,只要强引用还存在,该对象就不会被回收。

2).软引用 Soft Reference : 关联有用,但是非必需的对象。
对于软引用关联的对象,当内存不足时,会将这些对象列为回收范围进行第二次回收,如果这次回收后内存依然不足,会抛出内存溢出异常。
Java提供了SoftReference类来实现软引用。

3).弱引用 Weak Reference: 关联非必需对象,强度较软引用更弱一点。
弱引用关联对象智能生存到下一次GC发生的时间。当垃圾回收器工作时,无论内存是否够用,弱引用关联的对象都会被回收。
Java 提供了WeakReference类实现弱引用

4).虚引用 Phantom Reference:虚引用不会对对象的生命周期造成影响,也无法通过虚引用来获得一个对象实例。为对象设置虚引用的唯一目的就是希望在回收该对象时受到一个系统通知。
Java 提供了PhantomReference 类来实现虚引用。

在可达性分析法中,当一个对象被发现与GC Roots不通,这个对象并不会被立即处死,而是先对该对象进行标记,然后查看它是否重写了finalize()方法,如果有则将其移到一个名为的F-Queue队列之中,由一个由虚拟机自动创建的、低优先级的Finalizer线程触发执行。如果对象在finalize()中成功将自己与关联到引用链上,那么在第二次标记时该对象会被移出“即将回收”集合,否则,该对象将被彻底销毁。
这种自救方法只有一次,因为一个对象的finalize()最多只会被系统调用自动一次。

[gc] IsInBackground: 0; SensitiveStatus: 0; StartupStatus: 3; BundleName: com.huawei.hmos.clouddrive; 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: [gc] /***************** GC Duration statistic: ****************/ 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: [gc] TotalGC: 59.163 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: ProcessSharedGCRSetWorkList:0 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: Initialize: 1.024 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: Mark: 52.775 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: MarkRoots: 0.013 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: Sweep: 2.468 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: Finish: 2.865 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: [gc] /****************** GC Memory statistic: *****************/ 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: [gc] AllSpaces used: 18354.4KB committed: 21504KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: EdenSpace used: 0KB committed: 0KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: ActiveSemiSpace used: 0KB committed: 256KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: OldSpace used: 8898.34KB committed: 9728KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: HugeObjectSpace used: 2048KB committed: 2048KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: NonMovableSpace used: 1930.47KB committed: 3840KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: MachineCodeSpace used: 0KB committed: 0KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: HugeMachineCodeSpace used: 0KB committed: 0KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: SnapshotSpace used: 0KB committed: 0KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: AppSpawnSpace used: 5221.57KB committed: 5376KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: [gc] Anno memory usage size: 53.75 MB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: Native memory usage size:2.27902 MB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: NativeBindingSize: 2.2627 KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: ArrayBufferNativeSize: 0.0117188KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: RegExpByteCodeNativeSize:1.37891 KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: ChunkNativeSize: 80 KB 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: [gc] Heap alive rate: 0.363943 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: [gc] /***************** GC summary statistic: *****************/ 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: [gc] CompressGC occurs count 1 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: CompressGC max pause: 59.163 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: CompressGC min pause: 59.163 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: CompressGC average pause:59.163 ms 11-09 11:34:45.083 65415 65415 I C03F00/com.huawei.hmos.clouddrive/ArkCompiler: Heap average alive rate: 0.363943 11-09 11:34:45.083 1019 44067 I A02BA9/CameraDaemon/Msc_Occlusion_Detect: mainLv 104.00, mscLv 113.00 zoomRatio 1.00. 这里面每个数值都是啥意思
最新发布
11-12
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值