GC垃圾回收总结

一、如何确定一个对象是垃圾

  1.引用计数法

    public static void main(String[] args){

      Object object1=new Object();

      Object object2=new Object();

      object1.object=object2;

      object2.object=object1;

      object1=null;

      object2=null;

    }

  互相引用导致object1和object2都无法被视为垃圾

  2.可达性分析

3. 典型的垃圾收集器

垃圾收集算法是垃圾收集器的理论基础,而垃圾收集器就是其具体实现。下面介绍HotSpot虚拟机提供的几种垃圾收集器。

3.1. Serial/Serial Old

最古老的收集器,是一个单线程收集器,用它进行垃圾回收时,必须暂停所有用户线程。Serial是针对新生代的收集器,采用Copying算法;而Serial Old是针对老生代的收集器,采用Mark-Compact算法。优点是简单高效,缺点是需要暂停用户线程。

3.2. ParNew

Seral/Serial Old的多线程版本,使用多个线程进行垃圾收集。

3.3. Parallel Scavenge

新生代的并行收集器,回收期间不需要暂停其他线程,采用Copying算法。该收集器与前两个收集器不同,主要为了达到一个可控的吞吐量。

3.4. Parallel Old

Parallel Scavenge的老生代版本,采用Mark-Compact算法和多线程。

3.5. CMS

Current Mark Sweep收集器是一种以最小回收时间停顿为目标的并发回收器,因而采用Mark-Sweep算法。

CMS(Concurrent Mark-Sweep)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。

缺点:

1)CMS收集器对CPU资源非常敏感。在并发阶段,它虽然不会导致用户线程停顿,但是会因为占用了一部分线程而导致应用程序变慢,总吞吐量会降低。

2)CMS收集器无法处理浮动垃圾,可能会出现“Concurrent Mode Failure(并发模式故障)”失败而导致Full GC产生。

浮动垃圾:由于CMS并发清理阶段用户线程还在运行着,伴随着程序运行自然就会有新的垃圾不断产生,这部分垃圾出现的标记过程之后,CMS无法在当次收集中处理掉它们,只好留待下一次GC中再清理。这些垃圾就是“浮动垃圾”。

3)CMS是一款“标记--清除”算法实现的收集器,容易出现大量空间碎片。当空间碎片过多,将会给大对象分配带来很大的麻烦,往往会出现老年代还有很大空间剩余,但是无法找到足够大的连续空间来分配当前对象,不得不提前触发一次Full GC。

3.6. G1

G1(Garbage First)收集器技术的前沿成果,是面向服务端的收集器,能充分利用CPU和多核环境。是一款并行与并发收集器,它能够建立可预测的停顿时间模型。

    

转载于:https://www.cnblogs.com/sstone/p/8557008.html

### GC垃圾回收原理及实现 #### 工作原理 GC的核心目标是自动管理堆内存,通过识别并回收不再被程序引用的对象所占用的内存资源。这一过程主要依赖于可达性分析算法。具体来说,GC会构建一个有向图来表示对象之间的引用关系,并从一组称为“根集合”的节点出发,遍历整个图以确定哪些对象是可以到达的。任何无法从根集合访问到的对象都会被认为是垃圾数据,随后这些对象占据的空间会被标记以便后续清理[^1]。 #### 执行控制 尽管开发者可以通过调用`System.gc()`方法请求JVM启动一次垃圾收集操作,但实际上具体的触发时间和采用何种策略完全取决于当前使用的JVM版本及其配置情况。这意味着即使发出这样的建议也不会立刻引发实际的动作发生;相反,在大多数情况下,现代虚拟机会基于内部监控指标自行判断何时最适合执行此类维护活动。 另外值得注意的是,“Stop The World”现象——即当进行全堆扫描时暂停应用程序线程直到完成为止的现象不可避免地存在于各种类型的垃圾收集过程中因为只有这样才能确保一致性视图用于准确地标记阶段处理[^2]。 #### 主要算法介绍 - **标记-清除 (Mark-Sweep)** 此种方式首先会对所有存活下来的实例做上特殊标志然后再统一删除未被打上的部分不过容易造成内存碎片化问题影响分配新块效率。 - **标记-复制 (Copy)** 它将可用存储划分为大小相等两半每次仅使用其中一半当这部分满了就将活着的数据搬移到另一半去最后把原来那片清空虽然有效避免了前面提到过的缺点可是却牺牲了一般而言50%左右的有效容量作为代价因此适合短期存在的临时变量较多场景下应用比如Young Generation里边经常运用Minor GC就是基于此概念发展出来的技术手段之一[^3]. - **标记-整理 (Compact)** 结合两者优点既不会像单纯依靠Clear那样留下太多零散的小洞也不至于浪费那么多额外空间而是先把仍然有效的实体集中排列在一起再一次性干掉剩余空白区域内的残留物只不过相对耗时较长一些特别对于大规模长期驻留型资料集更是如此故而通常适用于Old Generation之中Major GC往往就会涉及这种类型的操作流程. ```java // Java代码示例展示如何手动触发表面层次上的提示让系统考虑适时安排一次全局范围内的清扫动作 public class GCDemo { public static void main(String[] args) throws InterruptedException{ Runtime runtime = Runtime.getRuntime(); System.out.println("Free memory before suggestion:"+runtime.freeMemory()); System.gc(); // 提议进行垃圾收集 Thread.sleep(100); // 给予一定时间等待可能发生的响应效果显现出来 System.out.println("Free memory after suggestion:"+runtime.freeMemory()); } } ``` #### 总结 综上所述,Garbage Collection 是一种非常重要的自动化工具,它极大地简化了开发人员关于动态内存管理方面的工作量同时也提高了软件系统的整体健壮性和可靠性水平.然而此同时我们也应该意识到没有任何单一方案可以完美适应每一种特定环境需求所以针对不同业务特点合理选择合适的参数组合显得尤为重要.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值