iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何深入Java核心探秘Java垃圾回收机制
  • 645
分享到

如何深入Java核心探秘Java垃圾回收机制

2023-06-17 14:06:30 645人浏览 八月长安
摘要

这期内容当中小编将会给大家带来有关如何深入Java核心探秘Java垃圾回收机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。垃圾收集GC(Garbage Collection)是Java语言的核心技术之一

这期内容当中小编将会给大家带来有关如何深入Java核心探秘Java垃圾回收机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

垃圾收集GC(Garbage Collection)是Java语言的核心技术之一,之前我们曾专门探讨过Java 7新增的垃圾回收器G1的新特性,但在JVM的内部运行机制上看,Java的垃圾回收原理与机制并未改变。垃圾收集的目的在于清除不再使用的对象。GC通过确定对象是否被活动对象引用来确定是否收集该对象。GC首先要判断该对象是否是时候可以收集。两种常用的方法是引用计数和对象引用遍历。

引用计数收集器

引用计数是垃圾收集器中的早期策略。在这种方法中,堆中每个对象(不是引用)都有一个引用计数。当一个对象被创建时,且将该对象分配给一个变量,该变量计数设置为1。当任何其它变量被赋值为这个对象的引用时,计数加1(a = b,则b引用的对象+1),但当一个对象的某个引用超过了生命周期或者被设置为一个新值时,对象的引用计数减1。任何引用计数为0的对象可以被当作垃圾收集。当一个对象被垃圾收集时,它引用的任何对象计数减1。

优点:引用计数收集器可以很快的执行,交织在程序运行中。对程序不被长时间打断的实时环境比较有利。

缺点: 无法检测出循环引用。如父对象有一个对子对象的引用,子对象反过来引用父对象。这样,他们的引用计数永远不可能为0.

跟踪收集器
 
早期的JVM使用引用计数,现在大多数JVM采用对象引用遍历。对象引用遍历从一组对象开始,沿着整个对象图上的每条链接,递归确定可到达(reachable)的对象。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,GC必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。

下一步,GC要删除不可到达的对象。删除时,有些GC只是简单的扫描堆栈,删除未标记的未标记的对象,并释放它们的内存以生成新的对象,这叫做清除(sweeping)。这种方法的问题在于内存会分成好多小段,而它们不足以用于新的对象,但是组合起来却很大。因此,许多GC可以重新组织内存中的对象,并进行压缩(compact),形成可利用的空间。

为此,GC需要停止其他的活动活动。这种方法意味着所有与应用程序相关的工作停止,只有GC运行。结果,在响应期间增减了许多混杂请求。另外,更复杂的 GC不断增加或同时运行以减少或者清除应用程序的中断。有的GC使用单线程完成这项工作,有的则采用多线程以增加效率。

一些常用的垃圾收集器
 
◆标记-清除收集器
 
这种收集器首先遍历对象图并标记可到达的对象,然后扫描堆栈以寻找未标记对象并释放它们的内存。这种收集器一般使用单线程工作并停止其他操作。并且,由于它只是清除了那些未标记的对象,而并没有对标记对象进行压缩,导致会产生大量内存碎片,从而浪费内存。
 
◆标记-压缩收集器
 
有时也叫标记-清除-压缩收集器,与标记-清除收集器有相同的标记阶段。在第二阶段,则把标记对象复制到堆栈的新域中以便压缩堆栈。这种收集器也停止其他操作。

复制收集器
 
这种收集器将堆栈分为两个域,常称为半空间。每次仅使用一半的空间,JVM生成的新对象则放在另一半空间中。GC运行时,它把可到达对象复制到另一半空间,从而压缩了堆栈。这种方法适用于短生存期的对象,持续复制长生存期的对象则导致效率降低。并且对于指定大小堆来说,需要两倍大小的内存,因为任何时候都只使用其中的一半。

增量收集器
 
增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾,也可理解为把堆栈分成一小块一小块,每次仅对某一个块进行垃圾收集。这会造成较小的应用程序中断时间,使得用户一般不能觉察到垃圾收集器正在工作。

分代收集器
  
复制收集器的缺点是:每次收集时,所有的标记对象都要被拷贝,从而导致一些生命周期很长的对象被来回拷贝多次,消耗大量的时间。而分代收集器则可解决这个问题,分代收集器把堆栈分为两个或多个域,用以存放不同寿命的对象。JVM生成的新对象一般放在其中的某个域中。过一段时间,继续存在的对象(非短命对象)将获得使用期并转入更长寿命的域中。分代收集器对不同的域使用不同的算法优化性能。

并行收集器
 
并行收集器使用某种传统的算法并使用多线程并行的执行它们的工作。在多CPU机器上使用多线程技术可以显著的提高java应用程序的可扩展性。

***,贴出一个非常简单的跟踪收集器的例图,以便大家加深对收集器的理解:

如何深入Java核心探秘Java垃圾回收机制 
跟踪收集器图例

 使用垃圾收集器要注意的地方
 
下面将提出一些有关垃圾收集器要注意的地方,垃圾收集器知识很多,下面只列出一部分必要的知识:
 
◆每个对象只能调用finalize(   )方法一次。如果在finalize(   )方法执行时产生异常(exception),则该对象仍可以被垃圾收集器收集。
 
◆垃圾收集器跟踪每一个对象,收集那些不可触及的对象(即该对象不再被程序引用 了),回收其占有的内存空间。但在进行垃圾收集的时候,垃圾收集器会调用该对象的finalize(   )方法(如果有)。如果在finalize()方法中,又使得该对象被程序引用(俗称复活了),则该对象就变成了可触及的对象,暂时不会被垃圾收集了。但是由于每个对象只能调用一次finalize(   )方法,所以每个对象也只可能 "复活 "一次。
 
◆Java语言允许程序员为任何方法添加finalize(   )方法,该方法会在垃圾收集器交换回收对象之前被调用。但不要过分依赖该方法对系统资源进行回收和再利用,因为该方法调用后的执行结果是不可预知的。
 
◆垃圾收集器不可以被强制执行,但程序员可以通过调研System.gc方法来建议执行垃圾收集。记住,只是建议。一般不建议自己写System.gc,因为会加大垃圾收集工作量。

上述就是小编为大家分享的如何深入Java核心探秘Java垃圾回收机制了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

--结束END--

本文标题: 如何深入Java核心探秘Java垃圾回收机制

本文链接: https://www.lsjlt.com/news/289568.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何深入Java核心探秘Java垃圾回收机制
    这期内容当中小编将会给大家带来有关如何深入Java核心探秘Java垃圾回收机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。垃圾收集GC(Garbage Collection)是Java语言的核心技术之一...
    99+
    2023-06-17
  • 浅谈Java垃圾回收机制
    目录一.什么是垃圾二.怎么回收垃圾2.1 静态对象什么时候变成垃圾被回收2.2 新生代和年老代三、垃圾回收算法3.1 标记清除算法3.2 复制清除算法(专门用于处理年轻代垃圾的)3....
    99+
    2024-04-02
  • 深入剖析 JavaScript 垃圾回收机制
    机制 JavaScript 使用“标记-清除”垃圾回收算法: 标记阶段:垃圾回收器遍布应用程序的内存,并标记所有仍在被使用的对象。 清除阶段:垃圾回收器释放所有未标记的对象占用的内存。 垃圾回收触发器 JavaScript 垃圾回收在...
    99+
    2024-04-02
  • JavaScript垃圾回收机制原理总结深入探究
    目录1. 垃圾为何要产生并回收2. 垃圾回收机制2.1 标记清除法2.2 引用计数法3. V8对垃圾回收机制的优化——分代式垃圾回收机制3.1 新生代与老生代...
    99+
    2022-11-13
    JavaScript垃圾回收 JS垃圾回收机制
  • 深入浅析Java 中的可视化垃圾回收机制
    这期内容当中小编将会给大家带来有关深入浅析Java 中的可视化垃圾回收机制,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。基础当谈到释放不再使用的内存,垃圾回收已经在很大程度上取代了早期技术,比如手动内存管...
    99+
    2023-05-31
    java 可视化 ava
  • java 垃圾回收机制以及经典垃圾回收器详解
    判断对象存活方法 引用计数法:在对象中添加一个引用计数子,每当一个地方引用他时,计数器就加一,当引用失效时,计数器就减一。 会有对象循环引用问题: objA.instance =...
    99+
    2024-04-02
  • Java垃圾回收机制是什么
    这篇文章主要介绍“Java垃圾回收机制是什么”,在日常操作中,相信很多人在Java垃圾回收机制是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java垃圾回收机制是什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-17
  • Java的垃圾回收机制详解
    目录 1、C语言与Java语言垃圾回收区别 2、System.gc() 3、面试题引入Java垃圾回收 3.1 jvm怎么确定哪些对象应该进行回收 3.1.1 引用计数法 3.1.2 可达性分析算法  3.2 jvm会在什么时候进行垃圾回收...
    99+
    2023-09-13
    java jvm 开发语言
  • 深入了解JavaScript中的垃圾回收机制
    JavaScript中的垃圾回收机制负责自动管理内存,回收不再使用的对象所占用的内存空间。在JavaScript中,开发者不需要显式地分配和释放内存,垃圾回收器会自动完成这些操作。以...
    99+
    2023-05-15
    JavaScript垃圾回收机制 JavaScript垃圾回收
  • Java 中的垃圾回收机制详解
    目录介绍重要条款:使对象符合 GC 条件的方法请求JVM运行垃圾收集器的方式定稿总结介绍 在 C/C++ 中,程序员负责对象的创建和销毁。通常程序员会忽略无用对象的销毁。由...
    99+
    2024-04-02
  • 简单介绍Java垃圾回收机制
    Java的内存分配与回收全部由JVM垃圾回收进程自动完成。与C语言不同,Java开发者不需要自己编写代码实现垃圾回收。这是Java深受大家欢迎的众多特性之一,能够帮助程序员更好地编写Java程序。这篇教程是系列第一部分。首先会解释基本的术语...
    99+
    2023-05-30
    java 垃圾回收机制 ava
  • 深入浅析JS中的垃圾回收机制
    基本类型存放在栈中,引用类型存放在堆中。JavaScript 是在创建变量(对象,字符串等)时自动进行了分配内存,并且在不使用它们时“自动”释放。释放的过程称为垃圾回收。垃圾回收策略所有垃圾回收器都需要做的任务标记空间中活动(存活)对象和非...
    99+
    2023-05-14
    javascript 垃圾回收机制
  • 怎么理解Java 垃圾回收机制
    怎么理解Java 垃圾回收机制,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。什么是自动垃圾回收自动垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将...
    99+
    2023-06-05
  • Java垃圾回收机制怎么理解
    这篇文章主要讲解了“Java垃圾回收机制怎么理解”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java垃圾回收机制怎么理解”吧!Java垃圾回收是一个自动运行的管理程序运行时使用的内存的进程...
    99+
    2023-06-17
  • 深入探索Go语言垃圾回收机制的工作原理
    Go语言的垃圾回收机制采用了并发标记清除(concurrent mark and sweep)的算法,主要分为三个阶段:标记阶段、清...
    99+
    2023-10-08
    Golang
  • 如何理解 Java 中垃圾回收的奥秘?
    ...
    99+
    2024-04-02
    Java垃圾回收 根对象 可达性 分代式GC 并行GC
  • Java超详细分析垃圾回收机制
    目录前言垃圾回收概述内存溢出和内存泄漏垃圾回收算法标记阶段STW(Stop-the-World)回收阶段标记-清除算法复制算法标记-压缩算法三种算法的比较总结前言 在前面我们对类加载...
    99+
    2024-04-02
  • Java垃圾回收机制的示例详解
    目录一、概述二、对象已死?1.引用计数算法2.可达性分析算法3.四种引用4.生存还是死亡?5.回收方法区三、垃圾收集算法1.分代收集理论2.名词解释3.标记-清除算法4.标记-复制算...
    99+
    2024-04-02
  • 如何理解Java垃圾回收
    这篇文章主要介绍“如何理解Java垃圾回收”,在日常操作中,相信很多人在如何理解Java垃圾回收问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解Java垃圾回收”的疑惑有所帮助!接下来,请跟着小编一起来...
    99+
    2023-06-15
  • Java基础之垃圾回收机制详解
    目录一、GC的作用二、GC主要回收哪些内存三、分代回收四、垃圾回收器五、总结一、GC的作用 进行内存管理 C语言中的内存,申请内存之后需要手动释放;一旦忘记释放,就会发生内存泄漏! ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作