JVM—垃圾回收

这篇具有很好参考价值的文章主要介绍了JVM—垃圾回收。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  什么是垃圾        

     一个没有被任何引用的对象就是一个垃圾对象,

     垃圾对象需要被清理回收,否则一直占用内存空间,

     其他新对象无法使用垃圾对象空间,

      严重的话会造成内存溢出

   早期的垃圾回收:

      早期例如c/c++是需要程序员手动在程序对不再使用的对象进行删除释放.

      给程序员造成了繁重的工作量,

      万一忘记回收, 会造成内存泄漏.         

  现在的语言基本都是自动垃圾回收,解放了程序员

垃圾回收的区域

     垃圾回收涉及堆,方法区

 重点是堆

频繁回收新生代

较少回收老年代(频率低)

 较少回收方法区

内存溢出与内存泄漏

  内存溢出

     经过垃圾回收后,内存依然不够使用,导致程序崩溃

  内存泄漏

      一个对象在程序中不会被使用,但是垃圾收集器又不能回收.

  一直会占用着内存空间, 久而久之也是造成内存溢出的原因之一

   例如:

            单例模式中单例对象,整个程序中使用一个唯一的对象、数据库连接对象、Socket 、IO等对象,使用完毕后应该close 关闭资源,如果不关闭,回收器无法回收这些对象.

   STW(stop the world)

   当垃圾回收时(标记,回收),会导致其他用户线程暂停.

   必须保证分析时其他程序不再运行,保证分析准确性

垃圾回收算法

标记阶段

   目的:标记出哪些对象是垃圾对象

算法

   引用计数算法(没有被使用)

     在对象中有一个计数属性,只要有引用指向该对象,计数器加1

 计数器值如果为0,则表示此对象是垃圾对象.

 优点:实现简单

 缺点:

   计数器占用空间

   加一 减一需要时间开销

   无法解决循环引用问题

可达性分析算法

      从一些活跃对象开始(GCRoots)搜索,与根对象相关联的对象都是被使用的

  与根对象或者根对象相关的引用链不相关的对象,就称为垃圾对象.

哪些对象可以被称为根对象:

  1.虚拟机栈中(正在运行的方法)被引用的对象

  2.类中静态属性

  3.被用来当做同步锁

  4.java系统中的类

      对象的finalize()方法    

        Object类中         

                   protected void finalize() throws Throwable { }

在对象被回收前,可以在此方法中执行一些需要的逻辑.

当对象被判定为垃圾,在回收之前会调用finalize(),

而且finalize()方法只会被调用一次.

finalize()不需要自己调用,由垃圾回收期调用.

由于finalize()存在

对象可以分为:

   可触及的: 不是垃圾对象

   可复活的: 被标记为垃圾对象,但是finalize()还没有被调用

   不可触及的: 被标记为垃圾对象,finalize()已经被调用过了.

    回收阶段算法

  标记-复制算法

可以有多块内存,每次有一块是空闲的,

将存活的对象移动到未被使用的空间中,清除其他块中所有的垃圾对象

好处: 内存碎片少

适合存活对象小,垃圾对象多的场景(新生代回收)

  标记-清除算法

将存活对象位置不变的,将垃圾对象地址记录在一个空闲列表中,

后面如果创建新的对象,就会将空闲列表中垃圾对象覆盖掉.

不移动对象,适合老年代回收,

回收后,会产生内存碎片 

效率高

  标记-压缩算法

将存活对象重新进行排列,排列到内存一端,将其他区域空间进行清理

进行标记 - 清除 -压缩

移动对象,适合老年代回收

回收后,进来压缩, 不会产生内存碎片 

效率低

   分代收集:

根据不同的区域特点进行各自的回收

年轻代,对象生命周期短,存活对象少,回收频繁,采用复制算法

老年代,对象生命周期长,存活对象多,回收频率低,

可以采用清除和压缩两种算法混合使用.

垃圾回收器:

        垃圾回收算法是理论,垃圾回收器是真正进行回收的实践者,

        不同厂商,不同版本各自实现方式都有不同.

垃圾回收器分类:
从线程数量上分:

  单线程: 适用于一些小的设备,只有一个线程进行垃圾回收

  多线程: 有多个线程进行垃圾回收  

按照工作模式分:

   独占式: 垃圾回收线程执行时,其他用户线程暂停执行

   并发式: 垃圾回收线程可以和用户线程同时执行

按工作的内存区间分:

  年轻代垃圾回收器

 老年代垃圾回收器文章来源地址https://www.toymoban.com/news/detail-820083.html

到了这里,关于JVM—垃圾回收的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【Java虚拟机】JVM垃圾回收机制和常见回收算法原理

    【Java虚拟机】JVM垃圾回收机制和常见回收算法原理

    1.垃圾回收机制 (1)什么是垃圾回收机制(Garbage Collection, 简称GC) 指自动管理动态分配的内存空间的机制,自动回收不再使用的内存,以避免内存泄漏和内存溢出的问题 最早是在1960年代提出的,程序员需要手动管理内存的分配和释放 这往往会导致内存泄漏和内存溢出等问

    2024年02月02日
    浏览(15)
  • java八股文面试[JVM]——垃圾回收器

    java八股文面试[JVM]——垃圾回收器

    jvm结构总结   常见的垃圾回收器有哪些?     CMS(Concurrent Mark Sweep) 整堆收集器 : G1 由于整个过程中 耗时最长 的 并发标记 和 并发清除 过程中,收集器线程都可以与用户线程一起工作,所以 总体上来说 ,CMS收集器的内存回收过程是与用户线程一起并发地执行。老年代收

    2024年02月11日
    浏览(14)
  • [AIGC] 深入理解 Java 虚拟机(JVM)的垃圾回收

    [AIGC] 深入理解 Java 虚拟机(JVM)的垃圾回收

    一、是什么 Java 虚拟机(JVM)的垃圾回收(Garbage Collection)是一种自动内存管理机制,用于释放不再使用的对象所占用的内存空间。垃圾回收的目标是回收那些不再被程序引用的对象,以避免内存泄漏和内存溢出等问题。 二、为什么需要垃圾回收 在 Java 程序中,对象的创建

    2024年02月21日
    浏览(10)
  • 【Java】JVM执行流程、类加载过程和垃圾回收机制

    【Java】JVM执行流程、类加载过程和垃圾回收机制

    JVM,就是Java虚拟机,Java的的程序都是运行在JVM当中。 程序在执行之前先要把java源代码转换成字节码(class文件),JVM 首先需要把字节码通过一定的方(类加载器(ClassLoader)) 把文件加载到内存中的运行时数据区(Runtime Data Area) ,而字节码文件是 JVM 的一套指令集规范,并

    2024年02月16日
    浏览(16)
  • 【Java高级应用:深入探索Java编程的强大功能,JVM 类加载机制, JVM 内存模型,垃圾回收机制,JVM 字节码执行,异常处理机制】

    本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题 中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:

    2024年01月16日
    浏览(13)
  • JVM | 垃圾回收器(GC)- Java内存管理的守护者

    JVM | 垃圾回收器(GC)- Java内存管理的守护者

    在编程世界中, 有效的内存管理 是至关重要的。这不仅确保了应用程序的稳定运行,还可以大大提高性能和响应速度。作为世界上最受欢迎的编程语言之一,通过Java虚拟机内部的垃圾回收器组件来自动管理内存,是成为之一的其中一项必不可少的技术点。 在许多传统的编程

    2024年02月09日
    浏览(16)
  • 深入探讨Java虚拟机(JVM):执行流程、内存管理和垃圾回收机制

    深入探讨Java虚拟机(JVM):执行流程、内存管理和垃圾回收机制

    目录 什么是JVM? JVM 执行流程 JVM 运行时数据区 堆(线程共享) Java虚拟机栈(线程私有) 什么是线程私有? 程序计数器(线程私有) 方法区(线程共享) JDK 1.8 元空间的变化 运行时常量池 内存布局中的异常问题 1.  Java堆溢出 2.  虚拟机栈和本地方法栈溢出 JVM 类加载 1.

    2024年02月09日
    浏览(14)
  • JVM——JVM 垃圾回收

    JVM——JVM 垃圾回收

    本节常见面试题 问题答案在文中都有提到 如何判断对象是否死亡(两种方法)。 简单的介绍一下强引用、软引用、弱引用、虚引用(虚引用与软引用和弱引用的区别、使用软引用能带来的好处)。 如何判断一个常量是废弃常量 如何判断一个类是无用的类 垃圾收集有哪些算

    2024年02月12日
    浏览(9)
  • 【JVM】JVM 垃圾回收算法

    【JVM】JVM 垃圾回收算法

    目前JVM中有三种常见的垃圾回收算法,分别是:标记清除、标记整理和复制,这三种垃圾回收算法各有优缺点,下面逐一介绍。 在读本篇文章中,如果对JVM中哪个是垃圾,哪个不是垃圾,JVM到底是怎么知道的,请先读下面这篇文章 【JVM】JVM 判断对象存活算法(引用计数算法

    2024年02月09日
    浏览(13)
  • JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

    JVM——垃圾回收(垃圾回收算法+分代垃圾回收+垃圾回收器)

    只要一个对象被其他对象所引用,就要让该对象的技术加1,某个对象不再引用其,则让它计数减1。当计数变为0时就可以作为垃圾被回收。 有一个弊端叫做循环引用,两个的引用计数都是1,导致不能作为垃圾回收,会造成内存泄露。 java虚拟机没有采用该算法。 该算法需要

    2024年02月12日
    浏览(10)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包