Skip to content

游侠安全网

关注网络与数据安全

Primary Menu
  • 业界
  • 安全
  • 网络
  • 办公
  • 厂商
  • 培训
  • 应用
  • 影音
  • 数码
  • 文摘
  • 猎头
  • 程序
  • 站长
  • 系统
  • 随笔
  • 业界

小课堂 | JVM内存模型(二)

齐安科技 2020年12月25日 1 minute read

还记得齐安安老师曾经提到的JVM模型知识分享吗?JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。

在上一篇小课堂中介绍到了垃圾回收算法。那么到底什么对象才算是一个垃圾对象?垃圾对象是怎样被GC回收的呢?

Q:GC是什么?

A:是指JAVA/.NET中的垃圾回收器(Garbage Collection),可以帮助程序员去控制内存的释放。当Java虚拟机(VM)或.NETCLR发觉内存资源紧张的时候,就会自动地去清理无用对象所占用的内存空间。

一、如何判定垃圾对象?

1、引用计数法(eference-counting)

算法思路:给每个被管理的对象关联一个引用计数器,计数器记录着该对象当前被引用的次数。每当有一个地方引用这个对象时,计数器就+1;每当指向该对象的引用失效时,计数器就-1;任何时刻计数器为0的对象都是不能再被使用的,即对象已“死”。

缺点:很难解决对象之间相互矛盾循环引用的状况。

代码示例:

从控制台输出的[PSYoungGen: 11596K->888K(76288K)]结果可见,GC没有因为test1、test2的互相引用就没有回收,JVM也没有用引用计数法来判断对象是否存活,是否需要被回收。

 

2、可达性分析算法(Reachability Analysis)

算法思路:通过一系列被称为引用链(GC Roots)的对象作为起始点,沿着这些节点向下搜索,所走过的路径称被为Reference Chain。当一个对象到 GC Roots 没有任何的引用链相连时,说明从 GC Roots 到这个对象不可达,证明此对象不可用。

下图为例:

对象Object5-7之间互相引用,但是与GC Roots之间并无可达性,因此可以被标记为垃圾对象,据此被判定为可回收对象。

在Java语言中,以下对象可以作为GC Roots:

◆ 虚拟机栈(栈帧中的本地变量表)中引用的对象

◆ 方法区中静态属性引用的对象

◆ 方法区中常量引用的对象

◆ 本地方法栈中(Native方法)引用的对象

在可达性分析算法中不可达的对象,也并非会被GC立刻回收,这时它们暂时处在"缓刑"阶段。一个对象的真正死亡,至少要经历两次标记过程,如果对象不可达,那它将会被第一次标记并进行一次筛选,筛选的条件是此对象是否有必要执行finalize()方法。

Q:什么是finalize()方法?

A:finalize()方法在Object中进行了定义,用于在对象“消失”时,由JVMs进行调用,用于对对象进行垃圾回收,类似于C++中的析构函数,可以覆盖此方法提供垃圾收集时的其他资源;用户自定义时,用于释放对象占用的资源(比如进行I/0操作)

当对象没有覆盖finalize()方法或者finalize()方法已经被JVM调用过,虚拟机会将这两种情况都视为没有必要执行finalize()方法,此时的对象才是真正"死亡"的对象,即垃圾对象。

 

二、垃圾对象是如何被GC回收的?

当对象被判定为有必要执行finalize()方法,那么这个对象将会被放置在一个叫做F-Queue的队列之中,并在稍后由一个虚拟机自动建立的、低优先级的Finalizer线程去执行它,触发finalize()方法。

finalize()方法是对象逃脱死亡的最后一次机会,稍后GC将对F-Queue中的对象进行第二次小规模标记,如果对象在finalize()中成功拯救自己(只需要重新与引用链上的任何一个对象建立起关联即可),那在第二次标记时它将会被移除出"即将回收"的集合,如果对象这时候还是没有逃脱,那么它就是真的被回收了。

代码示例:

从控制台可以看出,在第一次finalize()方法被调用时,test对象重新可达,因此自救成功,没有被GC所回收;在第二次GC时,由于任何一个对象的finalize()方法都只会被系统自动调用一次,相同的对象在逃脱一次后再次面临回收,它的finalize()方法不会被再次执行,因此逃脱失败,最终被GC回收。

三、本堂小结

本文对Java中使的垃圾回收算算法进行了图文举例说明。GC机制可以在程序性能调优、并发场景下垃圾回收造成性能瓶颈时,进行必要的监控和调节。希望以上这些信息可以更好的帮助程序员们排查出内存溢出、解决内存泄漏等问题,同时为大家带来一些技术上的启发。

也欢迎同学们随时与齐安安联系,分享和交流珍贵知识与宝贵经验!

 

参考资料

[1] GC回收 百度百科

https://baike.baidu.com/item/GC/66426?fr=aladdin

[2]《深入理解Java虚拟机:JVM高级特性与最佳实践》,周志明,2011年6月

[3]《可达性算法、Java引用 详解》简书,2018年3月

https://www.jianshu.com/p/8f5fa8288d9b

撰稿|齐安安

责编|喵喵

排版设计 | 喵喵

参考资料著作权归作者所有

转载请注明出处

相关内容:

  • 因机器配置问题 黑客们难以在Defcon上查找原型投票机的漏洞
  • 美国黑客入侵Booking.com 公司管理层却对此保持沉默
  • WinRAR请升级7.13版,旧版已被黑客利用植入恶意文件
  • 关于VMware vCenter Server存在远程代码执行漏洞的安全公告
  • Deepin操作系统如何使用Windows远程桌面
  • 紧急 | 思科多款统一通信设备存在Struts2 S2-045漏洞
Tags: Java

Post navigation

Previous: 世平信息获评2020浙江省软件核心竞争力企业!
Next: 小课堂 | 关于安全漏洞,这些你都知道吗?

相关资讯

20260610043908045002
  • 业界

法国政府加密通讯平台 Tchap 遭黑客入侵,官方宣称加密聊天记录未泄露

网路游侠 2026年6月10日
20260525131030754187
  • 业界
  • 随笔

免费日志审计软件 GreenLogAudit 发布 v1.0.5

网路游侠 2026年5月25日
Dirty Frag:通用 Linux 本地权限提升漏洞
  • 业界

Dirty Frag:通用 Linux 本地权限提升漏洞

网路游侠 2026年5月8日

最近更新

  • WinLog Insight —— 让Windows日志分析,一键到位!
  • 法国政府加密通讯平台 Tchap 遭黑客入侵,官方宣称加密聊天记录未泄露
  • 告别繁琐代码!WordPress 网站添加统计代码的终极解决方案
  • 写了一款记录U盘插拔、文件操作,并给操作人拍照的软件
  • 快速入门FreeFileSync:免费开源,数据同步备份神器
  • 免费日志审计软件 GreenLogAudit 发布 v1.0.5
  • 网络安全检查清单(2026版)|等保合规自查必备Checklist
  • 什么是 nDPI?开源深度包检测引擎 nDPI 全面解析
  • Windows日志采集工具:从NXLog到Winlogbeat,国产免费客户端只有WinLogAgent
  • 强迫症狂喜:WinLogAgent 1.0.3 升级:目录只有1个exe啦!

可能错过

20260610151411914452
  • 安全
  • 随笔

WinLog Insight —— 让Windows日志分析,一键到位!

网路游侠 2026年6月10日
20260610043908045002
  • 业界

法国政府加密通讯平台 Tchap 遭黑客入侵,官方宣称加密聊天记录未泄露

网路游侠 2026年6月10日
20260609180436920351
  • 站长

告别繁琐代码!WordPress 网站添加统计代码的终极解决方案

网路游侠 2026年6月10日
20260530155614841775
  • 安全
  • 随笔

写了一款记录U盘插拔、文件操作,并给操作人拍照的软件

网路游侠 2026年5月30日
  • 业界
  • 安全
  • 网络
  • 办公
  • 厂商
  • 培训
  • 应用
  • 影音
  • 数码
  • 文摘
  • 猎头
  • 程序
  • 站长
  • 系统
  • 随笔
陕ICP备11003551号-2 Copyright YouXia.ORG(游侠安全网)© All rights reserved. | MoreNews by AF themes.