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

java垃圾回收(GC)

时间:2023-08-16 20:44:38浏览次数:125  
标签:java Eden 对象 回收 算法 Survivor0 GC 垃圾

java和c++最大的不同点之一即中无需程序员去关注程序的内存管理,因为jvm提供了垃圾回收机制来保证内存的管理和回收。

 

jvm如何确定回收对象

引用计数法:

该方法当前jvm并未采用,仅作简单介绍,类似于c++智能指针,提供对象的引用计数器判断对象是否活跃,但是无法解决两个对象循环引用问题。

可达性分析算法:

通过判断对象的引用链是否可达来决定对象是否可以被回收。可达性分析算法是从离散数学中的图论引入的,程序把所有的引用关系看作一张图,通过一系列的名为GC Roots的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为引用链。当一个对象到 GC Roots 没有任何引用链相连(就是从 GC Roots 到这个对象不可达)时,则证明此对象是不可用的,然后对此对象进行标记。
 注:注意的是被判定为不可达的对象不一定就会成为可回收对象。被判定为不可达的对象要成为可回收对象必须至少经历两次标记过程,如果在这两次标记过程中仍然没有逃脱成为可回收对象的可能性,则基本上就真的成为可回收对象了。

 

jvm会在什么时候进行垃圾回收的动作

  1.  会在cpu空闲的时候自动进行回收
  2.  在堆内存存储满了之后
  3.  主动调用System.gc()后尝试进行回收 

 

jvm如何进行垃圾回收

垃圾回收算法有四个:标记-清除算法,复制算法,标记-整理算法,分代收集算法.。当前主流使用的是分代收集。

 

分代收集算法

java中,堆区分为老年代和新生代,新生代又分为Eden区、Survivor0区和Survivor1区(分配比例8:1:1)

当对象去堆区申请资源时:

  1. 若Eden区空间足够,则对象在Eden区中生成
  2. 若Eden区满,则触发Young GC,进行垃圾回收,此时将Eden区存活对象复制到Survivor0区,然后清空Eden区,为后续新的对象分配内存。
  3. 当Survivor0区也满了时,则将Eden区和Survivor0区存活对象复制到Survivor1区,然后清空Eden区和Survivor0区。此时Survivor0区为空,交换S0区和S1区身份,即让S1区为空。
  4. 若Survivor01区也不足以存放Eden区和Survivor0区的存活对象时,就将存活对象直接存放到老年代。如果老年代也满了,就会触发一次FullGC,即新生代、老年代都进行回收。

注意新生代发生的GC也叫做MinorGC,MinorGC发生频率比较高,不一定等 Eden区满了才触发。而新生代触发Young GC是当Eden区满了才触发。

关于老年代:老年代存放的都是一些生命周期较长的对象,就像上面所叙述的那样,在新生代中经历了N次垃圾回收后仍然存活的对象就会被放到老年代中。此外,老年代的内存也比新生代大很多(大概比例是1:2),当老年代满时会触发Major GC(Full GC),老年代对象存活时间比较长,因此FullGC发生的频率比较低。  

 

 

转载文章:https://blog.csdn.net/qq_41946216/article/details/131201057

 

标签:java,Eden,对象,回收,算法,Survivor0,GC,垃圾
From: https://www.cnblogs.com/Explosion556/p/17636129.html

相关文章

  • Java基础2.0
    题1:如何理解 final 关键字?1)类的final变量和普通变量有什么区别?当用final作用于类的成员变量时,成员变量(注意是类的成员变量,局部变量只需要保证在使用之前被初始化赋值即可)必须在定义时或者构造器中进行初始化赋值,而且final变量一旦被初始化赋值之后,就不能再被赋值了。2)被final修......
  • 2023.8.16 周三:Java论文提交管理系统
    1packageSystem;2importjava.util.Scanner;3publicclassPaperManagement{4publicstaticvoidmain(String[]args){5Scannerscanner=newScanner(System.in);6ScoreInformation[]students=newScoreInformation[5];......
  • java配置数据库
    server:port:8888spring:datasource:driver-class-name:com.mysql.cj.jdbc.Driverurl:jdbc:mysql://localhost:3306/ri?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2......
  • java反射和泛型测试
     java反射和泛型测试packagecom.qsds.test;importjava.lang.reflect.Method;importcom.qr.util.GetFieldOrder;/***Helloworld!**/publicclassApp<T>{publicstaticvoidmain(String[]args)throwsException{//反射测试tes......
  • 【深度挖掘Java并发编程底层源码】「底层技术原理体系」带你零基础认识和分析学习相关
    FutureTask的基本介绍FutureTask是Java中的一个类,它实现了Future接口和Runnable接口,并且被用作线程执行的任务。FutureTask可以在多线程环境下异步执行一个任务并获取其结果。FutureTask的特点用法异步执行:通过将耗时的任务交给FutureTask,在一个单独的线程中执行,当前线程可以继续执......
  • 【Java】从头开始的Java复健day8
    用的书:《Java从入门到精通》day1(3.1-3.3):【Java】从头开始的Java复健day1day2(3.4-3.8):【Java】从头开始的Java复健day2day3(4.1-4.4):【Java】从头开始的Java复健day3day4(4.5-5.2):【Java】从头开始的Java复健day4day5(5.3-5.4):【Java】从头开始的Java复健day5da......
  • 学习笔记 - Java 面向对象_上
    学习面向对象内容的三条主线Java类及类的成员:属性、方法、构造器;代码块、内部类面向对象的特征:封装、继承、多态、(抽象)其他关键字的使用:this、super、package、import、static、final、interface等类的相关概念类和对象概述类(Class)和对象(Object)是面向对象的核心概念。......
  • 记录--JS 的垃圾回收机制
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助前言垃圾回收(GarbageCollection)是一种内存管理机制,用于检测和清理不再被程序使用的内存,这些不再被使用的内存就被称为垃圾。垃圾回收器会在JS引擎(浏览器或者nodejs)内部周期性地运行,一般情况下无需开发者手动......
  • java List removeAll 慢
     之前 odmComponentPlatformListCopy.removeAll(componentPlatformListCopy); 由于2个list都有100多万非常慢 几个小时 改为 odmComponentPlatformListCopy.removeAll(newHashSet<>(componentPlatformListCopy)); 几秒钟就完成了,list的泛型对象需要实现hashco......
  • JavaScript面试题2
    JavaScript21.下面代码的输出是什么?functionsayHi0{ console.log(name);        console.log(age);        varname="Lydia";        letage=21;       }//打印出来:undefined和......