JVM又曾放过谁,垃圾终将被回收

JVM-垃圾回收 垃圾回收及其算法 阅读详情

背景

在Java中有一个很重要的概念,即一切皆对象。所谓对象,就是将现实中的事物抽象出来,进而可以通过继承、实现和组合的方式把万事万物都给容纳,所以理解对象的概念在学习Java(包括所有的面向对象的语言)的过程中至关重要。

当我们在程序中需要使用某个对象的时候,它就是爷爷,即使采用反射的方法也得把它创建出来;当我们不需要它的时候,它就是个垃圾,即使它能逃过新生代,在老年代也要依然追杀你。

今天,我们要学习的是JVM如何处理垃圾(对象),在学习之前,我们先思考以下几个问题:

  • 对象的生存周期有哪些阶段?
  • 如何判断一个对象已经成为了垃圾?
  • 垃圾如何标记?
  • 如何回收垃圾(对象),有哪些策略?

1、对象的生存周期

通常情况下,作为一名Java开发者,我们可以肆无忌惮的new对象,而不需要管理这些对象的生存周期,因为JVM会帮我们打扫卫生(管理对象)。但是,作为进阶的Coder,我们还是要认真理解一下的。下面我们先了解下的对象的生存周期。

1.1宏观视角

从宏观的角度看,对象的生存周期可以是:对象创建--->对象的使用--->对象的回收。

  • 对象创建

对象创建可以采用new指令、反序列化、反射等方法,这一步骤主要是为对象分配内存并初始化。

  • 对象的使用

对象的使用是将JVM栈中的对象的引用去定位、访问堆中的对象的具体位置,常采用的方法有句柄和直接指针。

  • 对象的回收

对象的回收就是垃圾回收,我们在下文中详解

仅仅看这三大块还是有点不明所以,太粗糙,下面我们以微观的角度分析对象的生存周期。

1.2微观视角

从微观视角来看,对象的生存的周期可以大致分为七个阶段:创建阶段、应用阶段、不可见阶段、不可达阶段、可收集阶段、终结阶段、对象空间重分配阶段。

JVM又曾放过谁,垃圾终将被回收

 

  • 创建阶段

对象创建阶段主要是为对象分配内存空间、开始构造对象并完成对static成员的初始化。对象一旦被创建,并且分派给某些变量赋值,这个对象的状态就被切换到了应用阶段。

  • 应用阶段

应用阶段就是对象至少被一个强引用关联着。(莫慌,强引用的概念在下文中讲解)

  • 不可见阶段

当一个对象处于不可见阶段时,说明程序不再持有该对象的任何强引用,但是这些引用可能还存在着,一般情况下是指程序的执行已经超过该作用域了。

boolean flag= false;if(flag){  flag = 0;  num++;        }System.out.println(num);

在上面的程序中,本地变量num在System.out.println(num)时已经超出了其作用域,程序就认为变量num处于不可见阶段。

  • 不可达阶段

对象处于不可达阶段是指该对象不再被任何强引用所持有,但是该对象仍可能被JVM等系统下的某些已装载的静态变量或线程或JNI等强引用持有着,这些特殊的强引用被称为”GC root”。存在着这些GC root会导致对象的内存泄露情况,无法被回收.

  • 可收集阶段

当垃圾回收器发现该对象已经处于“不可达阶段”而且垃圾回收器已经对该对象的内存空间又一次分配做好准备时,则对象进入了“收集阶段”。

  • 终结阶段

当对象运行完finalize方法后仍然处于不可达状态时,则该对象进入终结阶段。在该阶段是等待垃圾回收器对该对象空间进行回收。

  • 对象空间重分配阶段

对象空间又一次分配阶段,垃圾回收器对该对象的所占用的内存空间进行回收或者再分配了,则该对象彻底消失了,称之为“对象空间又一次分配阶段”。

上面落落索索一大堆,看得小伙伴似懂非懂,而小伙伴只想知道什么时候对象变垃圾以及垃圾(对象)被清除的。

事实上,这些阶段伴随着对象的创建、对象的使用、对象失效、对象被标记为垃圾、对象被回收的整个流程。为了满足你们的要求,我们把问题聚焦到垃圾(对象)的问题上,不过,在聚焦问题之前,我们最先理解下对象引用的概念,因为这对于对象变垃圾非常有帮助!

1.3对象引用

从JDK1.2开始,Java的设计人员将对象的引用分为四类,分别是:强引用、软引用、弱引用和虚引用。

  • 强引用

强引用表示一个对象处在【有用,必须】的状态,它是使用最普遍的引用。如果一个对象具有强引用,那么垃圾回收器绝不会回收它。就算在内存空间不足的情况下,Java虚拟机宁可抛出OutOfMemoryError错误,使程序异常终止,也不会通过回收具有强引用的对象来解决内存不足的问题。

Student student = new Student(); // 这就是强引用

 

  • 软引用

软引用表示一个对象处在【有用,但非必须】的状态。在内存空间足够的情况下,如果一个对象只具有软引用,那么垃圾回收器就不会回收它,但是如果内存空间不足,垃圾回收器就会回收这个对象(回收发生在OutOfMemoryError错误之前)。只要垃圾回收器没有回收它,这个对象就能被程序使用。

软引用用来实现内存敏感的高速缓存,比如说:网页缓存、图片缓存等。

Student student = new Student();SoftReference softReference = new SoftReference(student);

 

  • 弱引用

弱引用表示一个对象处在【可能有用,但非必须】的状态。类似于软引用,但是强度比软引用更弱一些:只具有弱引用的对象拥有更短暂的生命周期。GC线程在扫描它所管辖的内存区域的过程中,一旦发现只具有弱引用的对象,就会回收掉这些被弱引用关联的对象。也就是说,无论当前内存是否紧缺,GC都会回收被弱引用关联的对象。不过,由于GC是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。

经典实用案列java.langThreadLocal中

JVM又曾放过谁,垃圾终将被回收

 

  • 虚引用

虚引用表示一个对象处在【无用】的状态,意味着虚引用等同于没有引用,在任何时候都可能被GC回收。设置虚引用的目的是为了被虚引用关联的对象在被垃圾回收器回收的时候,能够收到一个系统通知(用来跟踪对象被GC回收的活动)。

ReferenceQueue referenceQueue = new ReferenceQueue();PhantomReference phantomReference = new PhantomReference(object,queue);

 

2、垃圾(对象)判断

垃圾回收的第一步就是要判断对象是否是垃圾。事实上,一个对象是否是垃圾不是由我们程序员来判断的,更准确的说是我们Java Developer不需要的关心的,如果你真的是有代码洁癖或者强迫症,你调用gc方法也无可厚非。

事实上,垃圾回收主要有两种算法:引用计数算法和可达性分析算法

2.1引用计数算法

引用计数算法是一种很古老的算法,现在在很多java版本已经废弃掉了,作为一名学习者,还有是有必要了解一下的。

定义:引用计数算法是在对象中添加了一个引用计数器,当引用这个对象时,计数就加1;当引用失效的时候,计数器就减1,当引用计数数为0的时候,该对象也就失效了,变成了垃圾,JVM也就开始回收它了。

从定义上来看,引用计数算法还是很容易理解的,它是一个优缺点很明显的一种算法,我们接着往下看。

  • 优点

①引用计数算法原理简单,并且实时性较强,当引用计数器为0的时候,JVM就可以直接对它进行回收。

②引用计数器只作用于单个对象,即JVM扫描时,只会扫描该对象,不会顺着引用扫描全部对象。

  • 缺点

①对象每次被引用时,都需要耗费一定的时间去更新引用计数器。

②会出现引用循环问题,即对象A引用对象B,对象B引用对象A,由于A和B相互引用,计数它们不被需要了,它们也不会被JVM当做垃圾回收。

为了解决引用计数算法产生的问题,优秀的Java开发者提出了另一种算法:可达性分析算法。

2.2可达性分析算法

可达性分析算法的思路是通过一系列的“GC Roots”对象作为起点进行搜索,如果在“GC Roots”和一个对象之间没有可达路径,则称该对象是不可达的,则认为该对象可以被回收。

可达性分析算法如下图所示:

JVM又曾放过谁,垃圾终将被回收

 

与引用计数算法的不同的是,引用计数算法判断的是对象是否死亡,而可达性分析算法分析的对象是否还活着,可达性分析算法可以有效解决引用计数算法中的循环引用问题。可达性分析算法是判断对象是否为垃圾的主流算法。

3、垃圾标记

上文中我们已经讲解了如何判断一个对象是否是垃圾,及采用的是引用计数法和可达性分析法。小伙伴肯定发现这两种算法是即判断对象是否为垃圾,同时标记了对象。

是的,更准确的说:如果一个对象不存在引用,那么这个对象就是垃圾。而引用计数算法中的计数器和可达性分析算法中的引用链都是标记对象的方式。

我们也在上面说过,由于引用计数算法存在循环引用问题,所以现有的主流标记算法是可达性分析算法。下面,我们将详细分析下可达性分析算法标记垃圾对象的过程。

在Java中,可以作为GC Roots的对象通常包含以下几种:

  • 虚拟机栈中引用的对象
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法中(Native)引用的对象

在可达性分析算法中,即使存在不可达的对象,该对象也不一定是非死不可的,一个对象要真正的死亡,要经历两次标记的过程。

标记过程分析:

当使用可达性分析算法分析对象时,若发现一些对象与GC Root链不可达,那么该对象就会被第一次标记,然后进行筛选,筛选的条件是判断该对象有没有必要执行finalize()方法(此方法每个对象默认都有),但如果对象没有重写finalize()方法或者对象的finalize方法已经被虚拟机调用过一次了,则都将视为“没有必要执行”,垃圾回收器可以直接回收。

如果该对象被判定为有必要执行finalize()方法,那么虚拟机会把这个对象放置在一个的队列中,然后由一个专门的Finalizer线程去执行这个对象的finalize()方法。如果此时存在某些对象重新与引用链上的任何一个对象建立了关联,那么在第二次标记时它将被移这个队列。

4、垃圾回收

内存是很宝贵的资源,对于不需要的垃圾对象,我们要尽管把它驱逐出去。上文讲解的垃圾(对象)判断、垃圾标记步骤都是为垃圾回收做铺垫。

在文章JVM内存中,我们详细分析JVM的运行时数据区,不熟悉的同学可以再去学习下。

4.1堆的布局结构分析

事实上,垃圾回收的地方是运行时数据区的堆中,我们都知道对象的存活是有周期的,如果一个对象没有被引用,那么就可以认为该对象可以被清除掉了,就是我们认为的垃圾。由于每个对象存活的时间不同,为了减少GC线程扫描垃圾时间及频率,我们可以将存活时间较长的对象单独放一个区域。因此,堆的布局也就确定下来了。总的来说,堆被划分成两部分:新生代和老年代。

JVM又曾放过谁,垃圾终将被回收

 

image-20210205113109427

新生代和老年代比值为1:2,这个比例并不是唯一的,我们可以可以通过参数 –XX:NewRatio按照具体的场景来指定,如果再细粒度的划分,新生代又可以分为Eden区和Survivor区,而Survivor区又可以分为FromSurvivor和ToSurvivor,默认比值为8:1:1

JVM又曾放过谁,垃圾终将被回收

 

这时问题又来了,为什么要将Survivor分为两块相等大小的空间啊?好问题,我先说答案,这两分为两部分主要是为了解决内存碎片化的问题,如果内存碎片化严重,也就是两个对象占用不连续的内存,已有的连续内存不够新对象存放,就会触发垃圾回收(GC)。

4.2垃圾回收算法

上文中我们分析了运行时数据区中的堆的布局结构,按照对象的生存周期将堆分成了新生代、老年代,新生代又细分为了三个区:Eden,From Survivor,To Surviver,比例是8:1:1。理解堆的布局结构对理解JVM中的垃圾回收算法的流程非常有帮助。为什么这么说呢?因为垃圾对象主要是在堆中,又因为堆切分了不同的分区,根据每块分区特性采用的垃圾回收算法也是不同的。

在下面的学习中,我们先学习下常用的垃圾回收算法,最后根据堆中不同的分区内存的特性选择合适的垃圾回收算法。

通常情况下,常用的垃圾回收算法有标记-清除算法、标记复制算法、标记整理算法和分代回收算法。

标记-清除算法

标记清除算法分为标记和清除两个阶段,即首先标记出需要回收的对象,标记完成后统一清理对象。它的优点是效率高,缺点是容易产生内存碎片。

标记阶段是以根节点(GC Roots)为起点在引用链上进行扫描,对存活的对象进行标记。清除阶段是扫描整个对象集合,清除集合中未被标记的对象。

垃圾标记和垃圾回收阶段如下图所示:

JVM又曾放过谁,垃圾终将被回收

 

标记-复制算法

标记复制算法是将内存划分两个空间,在任意的时间点,所有动态分配的对象都只能分配在其中一个空间,这个空间可以被称为活动空间,而另外一个空间则是空闲的。当有效内存空间耗尽时,JVM将暂停程序运行,开启复制算法GC线程。接下来GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。

此时,空闲区间已经与活动区间交换,而垃圾对象现在已经全部留在了原来的活动区间,也就是现在的空闲区间。事实上,在活动区间转换为空间区间的同时,垃圾对象已经被一次性全部回收。

JVM又曾放过谁,垃圾终将被回收

 

标记整理算法

标记整理算法与标记清除算法很相似,也是分为两个阶段:标记和整理,。

标记:它的第一个阶段与标记/清除算法是一模一样的,均是遍历GC Roots,然后将存活的对象标记。

整理:移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。因此,第二阶段才称为整理阶段

JVM又曾放过谁,垃圾终将被回收

 

分代回收算法

目前大多数JVM垃圾收集器采用的算法都是分代回收算法,其思想是根据对象存活的生命周期将内存划分成三个区域:新生代、老年代和永久代。划分区域可以参考堆的内存结构,新生代和老年代和堆中的划分是一一对应,而永久代在Java8中已经用元空间代替了。

  • 新生代回收算法

新生代主要存放生命周期较短的对象,所有新生成的对象首先都应该放在新生代中的Eden区,回收时将Eden区存活对象复制到To Survivor区,然后清空eden区。当To Survivor区也存放满了时,则将Eden区和To Survivor区存活对象复制到From Survivor区,然后清空Eden和这个From Survivor区,此时To Survivor区为空,然后将To Survivor区和From Survivor区交换,即保持From Survivor区为空, 如此往复。

当From Survivor区不足以存放 Eden区和To Survivor区的存活对象时,就将存活对象直接存放到老年代。若是老年代也满了就会触发一次Full GC,也就是新生代、老年代都进行回收。

一般情况下,新生代发生的GC也叫做Minor GC,MinorGC发生频率比较高(不一定等Eden区满了才触发)。

  • 老年代回收算法

在新生代中经历了N次垃圾回收后仍然存活的对象,就会被放到年老代中。因此,可以认为年老代中存放的都是一些生命周期较长的对象。老年代的内存比新生代也大很多(大概比例是1:2),当老年代内存满时触发Major GC即Full GC,Full GC发生频率比较低,老年代对象存活时间比较长,存活率标记高。

  • 永久代回收算法

永久代用于存放静态文件,如Java类、方法等。永久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的永久代空间来存放这些运行过程中新增的类。在JDK1.8之前,永久代称方法区,在JDK1.8后,永久代被称为元空间。

堆结构中的不同分区中的算法选择

事实上,JVM对堆中的不同区域(新生代和老年代)采用不同的算法。

新生代比较适合复制算法,新生代有Eden、From Survivor和To Survivor三个区,因为Eden区中对象会被复制到To Survivor,且From Survivor和To Survivor相互交换比较频繁,所以采用复制算法。

老年代中的对象的生命周期比较长,所以不适合复制算法,在老年代一般采用的是标记-整理/清除算法。

JVM垃圾回收机制 1.什么是垃圾回收机制 垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。 2.什么时候进行垃圾回收 ①会在cpu空闲的时候自动进行回收   ②在堆内存存储满了之后   ③主动调用System.gc()后尝试进行回收 补充:System.gc()用于调用垃圾收集... 阅读详情

相关推荐

基于人脸识别的课堂考勤系统 tkinter+openpyxl+face_recognition

基于face_recognition库实现人脸考勤系统功能。利用Python的tkinter模块来设计考勤系统的图形化界面,此外结合openpyxl模块,实现将学生的信息和考勤打卡数据保存到表格中,方便查看和调用。该系统具备“刷脸打卡”、“新学生注册”等功能。............

lyx4949的博客 6968

JVM——JVM面试问题

现如今,在作为一个刚毕业和计算机专业的学生或者是一个工作了三到五年的后端java程序员,面试过程中JVM的问题也已经是必考,本博文主要分享JVM面试问题与答案。帮助大家快速的熟悉JVM的面试内容,同时给大家及时的整理好相关JVM面试问题与解答。帮助大家更好的应对JVM的面试问题。

庄小焱 1689

FreeSurfer预处理命令

比如将/source/kernel.tgz解压到 /source/linux-2.6.29 目录 tar zxvf /source/kernel.tgz -C /source/ linux-2.6.29 tar zxvf /home/tj/application/freesurfer/subjects/mindboggle/OASIS-TRT-20-1.tar.gz -C /home/tj/application/freesurfer/subjects (1)lh.thickness mri_surf2su

Dream19961996的博客 1508

【Java虚拟机】JVM垃圾回收器详解

JVM垃圾回收器详解

互联网小阿祥 4555

设备树实践:从零构建一个嵌入式板级的设备树描述

本文详细介绍了如何从零开始为嵌入式Linux系统构建设备树(Device Tree),以i.MX6ULL处理器为例,涵盖硬件分析、设备树语法、外设配置及调试技巧。通过实践指导,帮助开发者掌握设备树编写,实现硬件与软件的高效对接,提升嵌入式开发效率。

plum99的博客 307

lighttools用透镜旋转手动创建菲尼尔透镜

学过很多软件,都没有留下痕迹,很多年之后只记得学过的软件常用的一些功能,稍微难一些的再次用起需要重新学,但如果留下点痕迹,重新再用就会很快。lighttools无意之中接触了,记一点点笔记吧。...

kingsai2012的博客 4334

Java当中jvm运行时区域新生代、老年代、永久代和Garbage Collection垃圾回收机制【杭州多测师】【杭州多测师_王sir】...

1、本地方法栈和程序计数器 ==》偏底层一般不会接触到 2、方法区 ==》对应为永久代 3、虚拟机栈(stack) ==》对应为栈 4、堆(heap) ==》对应里面有新生代+老年代 stack(栈内存) heap(堆内存) 永久代 5、栈内存1)线程私有2)生命周期和线程相同3)主要存放内...

多测师_王sir的博客 1371

网络安全与黑客攻防常见设备:前置机、跳板机、堡垒机与肉鸡

前置机、跳板机、堡垒机和肉鸡,这些看似冷僻的技术名词,实则是网络安全与黑客攻防战中的关键角色。它们有的守护着企业的数字Pltform,保卫网络安全;有的则成为黑客的跳板,游走于灰色地带。

网络技术联盟站 967

JVM永久代

复习备用,感谢开源 永久代是用于存放静态文件,如Java类、方法等。持久代对垃圾回收没有显著影响,但是有些应用可能动态生成或者调用一些class,例如Hibernate 等,在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类,永久代中一般包含: 类的方法(字节码...) 类名(Sring对象) .class文件读到的常量信息 class对象相关的对象列表和类型列表 (e.g...

RuiDer的博客 3329

【SigmaStudio】自定义算法组件之XML编写规范(一)

SigmaStudio生成自定义算法组件时,需要XML和DLB文件,本文主要记录XML文件的编码规范

liang_song的博客 1142

Vibe coding 氛围编程:编程就像聊天一样,低代码开发时代来了?

Vibe coding:编程就像聊天一样,低代码开发时代来了!

Code_流苏:在代码中寻诗意,在实践中觅真知 4806

JVM系列4——垃圾回收算法

垃圾回收算法包含标记-清除、标记-复制、标记-整理、分代回收算法。

xiaodigua1024的博客 251

【TC397第2篇】TC397 EB MCAL开发指南:ADS MCAL Demo集成深度解析

通过本文的指导,我们完成了TC397 EB MCAL与ADS的深度集成,并成功运行了一个简单的MCAL Demo。这个案例不仅帮助我们理解了MCAL在实际开发中的应用,同时也展示了ADS作为一个强大的开发工具在嵌入式系统开发中的优势。在接下来的系列文章中,我们将进一步探讨MCAL的高级应用、优化技巧以及更多实用的开发案例。敬请关注,共同探索TC397 EB MCAL开发的更多精彩!

一直在水些技术小文 453

JVM 又曾放过谁,垃圾终将被回收

背景 在 Java 中有一个很重要的概念,即一切皆对象。所谓对象,就是将现实中的事物抽象出来,进而可以通过继承、实现和组合的方式把万事万物都给容纳,所以理解对象的概念在学习 Java(包括所有的面向对象的语言)的过程中至关重要。 当我们在程序中需要使用某个对象的时候,它就是爷爷,即使采用反射的方法也得把它创建出来;当我们不需要它的时候,它就是个垃圾,即使它能逃过新生代,在老年代也要依然追杀你。 今天,我们要学习的是 JVM 如何处理垃圾(对象),在学习之前,我们先思考以下几个问题: 对象的生存周

weixin_70730532的博客 106

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

java+复杂又垃圾_JVM又曾放过谁,垃圾终将被回收

背景在Java中有一个很重要的概念,即一切皆对象。所谓对象,就是将现实中的事物抽象出来,进而可以通过继承、实现和组合的方式把万事万物都给容纳,所以理解对象的概念在学习Java(包括所有的面向对象的语言)的过程中至关重要。当我们在程序中需要使用某个对象的时候,它就是爷爷,即使采用反射的方法也得把它创建出来;当我们不需要它的时候,它就是个垃圾,即使它能逃过新生代,在老年代也要依然追杀你。今天,我们要学...

weixin_28728495的博客 94

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

JVM垃圾回收机制 (垃圾判断,垃圾回收算法,垃圾回收器,五种引用)【jvm】

????‍????博主主页:爪哇贡尘拾Miraitow ????传作时间:????2022年1月9日 晚21:44???????? ????内容介绍:最近在学习JVM所以会时不时更新有关内容 ????参考资料:黑马JVM 度娘 ????参考链接:????JVM垃圾回收机制 ⏳简言以励:列位看官,且将新火试新茶,诗酒趁年华 ????内容较多有问题希望能够不吝赐教???? ???? 欢迎点赞 ???? 收藏 ⭐留言 ???? ????JVM垃圾回收 ♻1.1 如何判断对象可以回收♻1、 引用计数器法2、可达

qq_46489085的博客 4063

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

JVM中垃圾回收

JVM中的垃圾回收是通过对堆内存进行管理、清理无用对象,从而确保应用的高效运行。整个垃圾回收过程包括对象的分代存储、不同的垃圾回收算法(标记-清除、复制、标记-整理等),以及多种垃圾回收器(Serial GC、Parallel GC、CMS GC、G1 GC等)来适应不同的应用场景。优化垃圾回收是一个综合的过程,需要根据应用的特性选择合适的垃圾回收器,并通过合理的内存分配、减少对象创建与销毁、调优对象晋升策略等方法减少GC对应用性能的影响。

yymagicer的博客 2261

JVM垃圾回收

一、设计目标和适用场景设计目标:同时注重低停顿时间和高吞吐量,可以在不牺牲大量吞吐量的情况下实现较短的停顿时间,适用于大内存应用和对响应时间有较高要求的场景。适用场景:例如需要快速响应的交互式应用、大规模数据处理等,尤其是在堆内存较大(几个 GB 甚至更大)时表现出色。设计目标:主要是为了降低垃圾收集的停顿时间,以满足对响应时间要求较高的应用。适用场景:适合于对停顿时间比较敏感的应用,如互联网应用、Web 服务器等。

qq_62097431的博客 2137

【JVM】垃圾回收

文章目录JVM-垃圾回收1.如何判断对象可以回收1-1 引用计数法1-2 可达性分析算法1-3 五种引用2.垃圾回收算法2-1 标记清除2-2 标记整理2-3 复制3.分代垃圾回收3-1 回收流程3-2 GC 分析4.垃圾回收器4-1 串行4-2 吞吐量优先4-3 响应时间优先4-4 G15.垃圾回收调优5-1 调优领域5-2 确定目标5-3 最快的 GC5-4 新生代调优5-5 老年代调优 JVM-垃圾回收 本文章参考:黑马程序员JVM 1.如何判断对象可以回收 1-1 引用计数法 当一个对象被其他变量

小皮皮LL的博客 4093

一文看懂:JVM垃圾回收算法、CMS垃圾回收器、G1垃圾回收器

Hello,大家好,我是此林。今天我们来聊一聊 JVM 垃圾回收机制。在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。手动回收的方式相对来说回收比较及时,删除代码执行之后对象就被回收了,可以快速释放内存。缺点是对程序员要求比较高,很容易出现创建完对象之后,程序员忘记释放对象。

2401_82540083的博客 2512
上一篇: 直击面试!阿里技术官手码12W字面试小册在Github上爆火
下一篇: 聊聊MySQL架构演进:从主从复制到分库分表
爱玛士
博客等级 码龄7年 720粉丝 253原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值