当前位置:首页 > 科技  > 软件

JVM优化:垃圾回收概述

来源: 责编: 时间:2023-08-09 23:02:49 469观看
导读一、什么是垃圾回收说起垃圾收集(Garbage Collection, 下文简称GC) , 有不少人把这项技术当作Java语言的伴生产物。 事实上, 垃圾收集的历史远远比Java久远, 在1960年诞生于麻省理工学院的Lisp是第一门开始使 用内存动态分

一、什么是垃圾回收

说起垃圾收集(Garbage Collection, 下文简称GC) , 有不少人把这项技术当作Java语言的伴生产物。 事实上, 垃圾收集的历史远远比Java久远, 在1960年诞生于麻省理工学院的Lisp是第一门开始使 用内存动态分配和垃圾收集 技术的语言。垃圾收集需要完成的三件事情: 哪些内存需要回收? 什么时候回收? 如何回收?2AV28资讯网——每日最新资讯28at.com

二、Java垃圾回收的优缺点

优点:2AV28资讯网——每日最新资讯28at.com

a.不需要考虑内存管理,2AV28资讯网——每日最新资讯28at.com

b.可以有效的防止内存泄漏,有效的利用可使用的内存,2AV28资讯网——每日最新资讯28at.com

c.由于有垃圾回收机制,Java中的对象不再有"作用域"的概念,只有对象的引用才有"作用域"2AV28资讯网——每日最新资讯28at.com

缺点:2AV28资讯网——每日最新资讯28at.com

java开发人员不了解自动内存管理, 内存管理就像一个黑匣子,过度依赖就会降低我们解决内存溢出/内存泄漏等问题 的能力。2AV28资讯网——每日最新资讯28at.com

三、判断对象是否存活 - 引用计数算法

引用计数算法可以这样实现:给每个创建的对象添加一个引用计数器,每当此对象被某个地方引用时,计数值+1, 引用失效时-1,所以当计数值为0时表示对象已经不能被使用。引用计数算法大多数情况下是个比较不错的算法, 简单直接,也有一些著名的应用案例但是对于Java虚拟机来说,并不是一个好的选择,因为它很难解决对象直接相 互循环引用的问题。2AV28资讯网——每日最新资讯28at.com

优点: 实现简单,执行效率高,很好的和程序交织。2AV28资讯网——每日最新资讯28at.com

缺点: 无法检测出循环引用。2AV28资讯网——每日最新资讯28at.com

譬如有A和B两个对象,他们都互相引用,除此之外都没有任何对外的引用,那么理论上A和B都可以被作为垃 圾回收掉,但实际如果采用引用计数算法,则A、B的引用计数都是1,并不满足被回收的条件,如果A和B之 间的引用一直存在,那么就永远无法被回收了2AV28资讯网——每日最新资讯28at.com

四、判断对象是否存活-可达性分析算法

在主流的商用程序语言如Java、C#等的主流实现中,都是通过可达性分析(Reachability Analysis)来判断对象是否存 活的。此算法的基本思路就是通过一系列的“GC Roots”的对象作为起始点,从起始点开始向下搜索到对象的路径。 搜索所经过的路径称为引用链(Reference Chain),当一个对象到任何GC Roots都没有引用链时,则表明对象“不可 达”,即该对象是不可用的。2AV28资讯网——每日最新资讯28at.com

2AV28资讯网——每日最新资讯28at.com

在Java语言中,可作为GC Roots的对象包括下面几种:2AV28资讯网——每日最新资讯28at.com

  • 栈帧中的局部变量表中的reference引用所引用的对象
  • 方法区中static静态引用的对象
  • 方法区中final常量引用的对象
  • 本地方法栈中JNI(Native方法)引用的对象
  •  Java虚拟机内部的引用, 如基本数据类型对应的Class对象, 一些常驻的异常对象(比如 NullPointExcepiton、 OutOfMemoryError) 等, 还有系统类加载器。
  • 所有被同步锁(synchronized关键字) 持有的对象。
  • 反映Java虚拟机内部情况的JMXBean、 JVMTI中注册的回调、 本地代码缓存等。

2AV28资讯网——每日最新资讯28at.com

五、JVM之判断对象是否存活

finalize()方法最终判定对象是否存活:2AV28资讯网——每日最新资讯28at.com

即使在可达性分析算法中判定为不可达的对象, 也不是“非死不可”的, 这时候它们暂时还处于“缓 刑”阶段, 要真 正宣告一个对象死亡, 至少要经历两次标记过程:2AV28资讯网——每日最新资讯28at.com

第一次标记:2AV28资讯网——每日最新资讯28at.com

如果对象在进行可达性分析后发现没有与GC Roots相连接的引用链, 那它将会被第一次标记, 随后进行一次筛 选, 筛选的条件是此对象是否有必要执行finalize()方法。2AV28资讯网——每日最新资讯28at.com

没有必要:2AV28资讯网——每日最新资讯28at.com

假如对象没有覆盖finalize()方法, 或者finalize()方法已经被虚拟机调用过, 那么虚拟机将这两种情况都视为“没有必 要执行”。2AV28资讯网——每日最新资讯28at.com

有必要:2AV28资讯网——每日最新资讯28at.com

如果这个对象被判定为确有必要执行finalize()方法, 那么该对象将会被放置在一个名为F-Queue的 队列之中, 并在 稍后由一条由虚拟机自动建立的、 低调度优先级的Finalizer线程去执行它们的finalize() 方法。 finalize()方法是对 象 逃脱死亡命运的最后一次机会, 稍后收集器将对F-Queue中的对象进行第二次小规模的标记, 如果对 象要在 finalize()中成功拯救自己——只要重新与引用链上的任何一个对象建立关联即可, 譬如把自己 (this关键字) 赋值 给某个类变量或者对象的成员变量, 那在第二次标记时它将被移出“即将回收”的集 合; 如果对象这时候还没有逃 脱, 那基本上它就真的要被回收了。2AV28资讯网——每日最新资讯28at.com

2AV28资讯网——每日最新资讯28at.com

六、再谈引用

在JDK1.2以前,Java中引用的定义很传统: 如果引用类型的数据中存储的数值代表的是另一块内存的起始地址,就 称这块内存代表着一个引用。这种定义有些狭隘,一个对象在这种定义下只有被引用或者没有被引用两种状态。 我 们希望能描述这一类对象: 当内存空间还足够时,则能保存在内存中;如果内存空间在进行垃圾回收后还是非常紧 张,则可以抛弃这些对象。很多系统中的缓存对象都符合这样的场景。 在JDK1.2之后,Java对引用的概念做了扩 充,将引用分为 强引用(Strong Reference) 、 软引用(Soft Reference) 、 弱引用(Weak Reference) 和 虚引 用(Phantom Reference) 四种,这四种引用的强度依次递减。2AV28资讯网——每日最新资讯28at.com

1、强引用2AV28资讯网——每日最新资讯28at.com

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java虚拟 机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问 题。 ps:强引用其实也就是我们平时A a = new A()这个意思。2AV28资讯网——每日最新资讯28at.com

2、软引用2AV28资讯网——每日最新资讯28at.com

如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对 象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。 软引用可以和一个引用队列 (ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到 与之关联的引用队列中。2AV28资讯网——每日最新资讯28at.com

3、弱引用2AV28资讯网——每日最新资讯28at.com

用来描述那些非必须对象, 但是它的强度比软引用更弱一些, 被弱引用关联的对象只能生存到下一次垃圾收集发 生为止。 当垃圾收集器开始工作, 无论当前内存是否足够, 都会回收掉只 被弱引用关联的对象。 在JDK 1.2版之 后提供了WeakReference类来实现弱引用。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用 所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。2AV28资讯网——每日最新资讯28at.com

弱引用与软引用的区别在于: ①更短暂的生命周期; ②一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。2AV28资讯网——每日最新资讯28at.com

4、虚引用2AV28资讯网——每日最新资讯28at.com

“虚引用”顾名思义,它是最弱的一种引用关系。如果一个对象仅持有虚引用,在任何时候都可能被垃圾回收器回 收。虚引用主要用来跟踪对象被垃圾回收器回收的活动。2AV28资讯网——每日最新资讯28at.com

虚引用与软引用和弱引用的一个区别在于: ①虚引用必须和引用队列 (ReferenceQueue)联合使用。 ②当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到 与之 关联的引用队列中。2AV28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-5148-0.htmlJVM优化:垃圾回收概述

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何高效使用Gherkin

下一篇: 实现分布式事务:Java与MySQL的XA事务协调

标签:
  • 热门焦点
  • Find N3入网:最高支持16+1TB

    OPPO将于近期登场的Find N3折叠屏目前已经正式入网,型号为PHN110。本次Find N3在外观方面相比前两代有很大的变化,不再是小号的横向折叠屏,而是跟别的厂商一样采用了较为常见的
  • 石头智能洗地机A10 Plus体验:双向自清洁治好了我的懒癌

    一、前言和介绍专为家庭请假懒人而生的石头科技在近日又带来了自己的全新旗舰新品,石头智能洗地机A10 Plus。从这个产品名上就不难看出,这次石头推出的并不是常见的扫地机器
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 三言两语说透设计模式的艺术-单例模式

    写在前面单例模式是一种常用的软件设计模式,它所创建的对象只有一个实例,且该实例易于被外界访问。单例对象由于只有一个实例,所以它可以方便地被系统中的其他对象共享,从而减少
  • 量化指标是与非:挽救被量化指标扼杀的技术团队

    作者 | 刘新翠整理 | 徐杰承本文整理自快狗打车技术总监刘新翠在WOT2023大会上的主题分享,更多精彩内容及现场PPT,请关注51CTO技术栈公众号,发消息【WOT2023PPT】即可直接领取
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 零售大模型“干中学”,攀爬数字化珠峰

    文/侯煜编辑/cc来源/华尔街科技眼对于绝大多数登山爱好者而言,攀爬珠穆朗玛峰可谓终极目标。攀登珠峰的商业路线有两条,一是尼泊尔境内的南坡路线,一是中国境内的北坡路线。相
  • 10天营收超1亿美元,《星铁》比《原神》差在哪?

    来源:伯虎财经作者:陈平安即便你没玩过《原神》,你一定听说过的它的大名。恨它的人把《原神》开服那天称作是中国游戏史上最黑暗的一天,有粉丝因为索尼在PS平台上线《原神》,怒而
Top