回顾《深入理解 Java 虚拟机》之垃圾收集器

GC 并非 Java 的专利,事实上最早 Lisp 语言就有了 GC 和内存动态分配的概念。GC 的重点在于两个:

  1. 如何判定对象的存活与否
  2. 如何进行垃圾回收,这里又分为不同的回收算法

如何判断对象存活

关于GC roots 选取的这个问题,知乎上 R大 有过详细的回答,这里贴上链接:Java 的 GC 为什么要分代?,顺便表达一下对R大的敬仰,简直是知乎清流啊,努力成为 R大 那样的人!这篇回答中涉及到了 GC root 的一些内容。其中很重要的一点是强调了 GC roots 必须是一组活跃的引用,而不是对象

再谈引用

上述的两种判断方法都涉及到引用,但在 JDK1.2 以前,Java 中对引用的定义过于狭隘(或者说分类太单一):只要是引用类型的数据中存储的是代表另一快内存的起始地址,就称为这块内存代表着一个引用。过于简单、粗暴的定义固然理解容易,但是无法便捷地扩充概念,凡是都有轻重缓急,GC 这种代价大的操作更是如此,因此总要通过引用进行一些区分,例如区分引用的强弱、区分引用的优先级等,从而可以针对性的进行垃圾回收。

因此 JDK1.2 之后 Java 对引用的概念进行了扩充,分为四种类型,其引用强度依次减弱,详细的内容请看我之前的文章:Java里四种引用类型的作用和区别

可达性分析中的“缓刑”过程

真正宣告一个对象的死亡需要经历两次标记,第一次为搜索后未与 GC roots 引用链相连,则被标记并且此时会进行一次筛选,筛选条件是此对象是否有必要执行 finalize() 方法。

如果对象判定为需要执行,那么这个对象会先被放在一个 F-Queue 的队列中,稍后由一个虚拟机自动创建的、低优先级的 Finalizer 线程去执行,这里虚拟机只是触发这个方法,并不会等它结束,这样做是避免 F-Queue 中的其他对象等待时间过长。finalize() 方法中,只要对象能与引用链上的任何一个对象建立关联,就可以成功拯救自己,那么第二次小规模标记时就被移出待回收队列。

方法区中的 GC

方法区(或者是 HotSpot 中的永久代)确实不一定需要 GC,因为回收效率低不值得,但是归根到底这是由具体虚拟机的实现去决定的。

永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。回收废弃常量的方法和回收堆中对象非常相似;但是判断一个类是否无用却较复杂,需要同时满足以下三个条件:

  1. 该类所有实例都已被回收
  2. 加载该类的 ClassLoader 已被回收
  3. 该类对应的 java.lang.Class 对象没有任何地方被引用,无法通过反射访问该类的方法

参考资料

-《深入理解Java虚拟机》 周志明著

资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值