首页 > 编程语言 >java垃圾回收(GC)机制

java垃圾回收(GC)机制

时间:2023-06-13 14:34:09浏览次数:42  
标签:java 标记 对象 回收 算法 GC 垃圾 引用

一、为什么要进行垃圾回收?

因为内存的容量是有限的。

二、如果判断一个对象需要回收?

1、引用计数算法:给每个对象中加一个引用计数器。每增加一个引用,计数器就+1。当计数器为0时,代表没有引用。因为有循环引用的存在,所以java虚拟机不再使用引用计数算法。

2、可达性分析算法:通过GC Roots作为起始点向下搜索。搜索所走过的路径成为引用链。如果没有引用链,则对象可以被回收。

3、对方法区的回收:主要是对常量池的回收和对类的卸载。

三、四种引用状态

  1. 强引用。被强引用关联的对象不会被回收。使用new一个新对象的方式来创建强引用。
  2. 软引用。被软引用关联的对象只有在内存不够时才会被回收。使用SoftReference类来实现软引用。
  3. 弱引用。被弱引用关联的对象一定会被回收。也就是说它只能存活到下次垃圾回收发生之前。使用WeakReference类来实现弱引用。
  4. 虚引用。又被成为幽灵引用或者幻影引用。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用取得一个对象。为一个对象设置虚引用的唯一目的就是能够在这个对象被回收时收到一个系统通知。

四、垃圾回收算法

1、标记清除算法(mark-sweep)

将存活的对象进行标记,然后清理掉未被标记的对象。

不足:

(1)标记和清除过程效率都不高。

(2)会产生大量不连续的内存碎片,导致无法给大对象分配内存。

2、标记整理算法(mark-compact)

让所有存活对象都向一端移动。然后清理掉端边界以外的对象。

3、复制算法(copying)

4、分代收集

 

标签:java,标记,对象,回收,算法,GC,垃圾,引用
From: https://www.cnblogs.com/aleda-territory/p/17477427.html

相关文章

  • java如何往List<? extends number>中加入元素?体会范型集合父子关系以及范型通配符的使用
    以下来自一个stackoverflow的一个问答,写的很清楚。基本上就是子类集合的引用付给父类引用,如果父类的引用变量声明的是<?extendsParent>,则父类引用变量只能对集合进行读操作,读出来的变量是Parent类型,这是因为不确定该父类引用变量指向的是什么类型的集合,可以是Child1,也可以C......
  • Java:如何写好代码,少点bug
    前言工作差不多两年了。2021-04-14实习入职,至今2023-04-07,和大佬相比我这还是属于初级程序员,技术不强。平时写代码没啥技术含量,但真的挺多同事连基本的CRUD都写不好,不管是代码规范还是安全性问题都有很大的纰漏,所以觉得自己最大的骄傲就是代码规范,bug少。同时希望刚工作不久的......
  • java 泛型 深入
    评:泛型的好处:(casting)的绝对无误。/*******不使用泛型类型*******/Listlist1=newArrayList();list1.add(8080);//编译器不检查值String......
  • 【技术积累】JavaSciprt中的函数【一】
    什么是函数?如何声明函数?JavaScript中的函数是一段可重复使用的代码块,它可以接受输入并返回输出。在JavaScript中,函数是一种特殊的对象,因此可以将其存储在变量中,将其作为参数传递给其他函数,并从其他函数中返回。在JavaScript中,声明函数有两种方式:函数声明和函数表达式。1.函数......
  • Java8 Stream List Map:Stream 流对象汇总 求和 某个属性 BigDecimal MDouble
    测试实体(数字对象使用MDouble):importcom.mchweb.common.lang.MDouble;importlombok.*;@Getter@Setter@Builder(toBuilder=true)@NoArgsConstructor@AllArgsConstructorpublicclassUser{privateMDoublemoney;}importcom.mchweb.common.lang.MDouble;imp......
  • 你真的读懂了Java源码?Collections源码初探
    最近重温Java知识,遇到不懂的问题搜索互联网/博客很难直接找到答案,还好如今有了chatGPT,比大多数CV复读机/纯文档翻译的内容更有用。很多文章总结冠以“深入理解xxx”,“万字长文详解xxx”的文章,也不过是演示一遍调用代码,让你知道了怎么用,在什么情况下用。但至于为什么这么用,以及Java......
  • java WebUploader 分片上传
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率。 本文是基于springboot+vue实现的文件上传,本文主要介绍服务端实现文件......
  • Java 利用POI对象 SXSSFWorkbook 导出Excel
    最开始调用的方法是(标记的地方): workbook=newHSSFWorkbook();和workbook=newXSSFWorkbook();这两个方法就是导出Excel的最关键的方法,接下来我来说说这两个方法作用:1.HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;2.XSSFWorkbook:是操作Excel2007的版本......
  • Java判断一个List中是否有重复元素
    1.将List转为Set,通过2个集合的size大小是否相等来判断有无重复元素publicstaticvoidmain(String[]args){ListstringList=newArrayList<>(Arrays.asList("a","a","b","c"));SetstringSet=newHashSet<>(stringList);......
  • Javascript中的内存(垃圾)回收机制
    JavaScript具有自动垃圾回收机制。垃圾收集器会按照固定的时间间隔周期性的执行常见的垃圾回收方式:标记清除、引用计数方式。一、标记清除方法1、工作原理:【标记“离开环境”的就回收内存】当变量进入环境时,将这个变量标记为“进入环境”。当变量离开环境时,则将其标记为“......