首页 > 其他分享 >关于JVM的垃圾回收

关于JVM的垃圾回收

时间:2024-11-05 19:30:10浏览次数:1  
标签:标记 对象 回收 算法 垃圾 JVM 引用

垃圾回收主要回收的是堆中的实例、数组。

STW(stop the world)暂停所有应用程序的线程,等待垃圾回收完成

 

1.对象什么时候可以被垃圾回收器回收

一个对象如果没有任何的引用指向他了,那么他现在就是不可达对象(垃圾),如果定位了垃圾,那么垃圾回收器就可能会将他回收。(比如这个对象被显式的设置为null,可以让垃圾回收器更好的识别他并回收)

定位垃圾有两种办法:

  • 引用计数法(不常用,循环引用会导致内存泄漏问题),
  • 可达性分析算法(常用,扫描堆内的对象,如果沿着GC root对象为起点的引用链找不到该对象,则表示该对象可以回收)
    • 可达性分析法有哪些可以作为GC root的对象
      • 虚拟机栈帧中的对象
      • metaspace中类静态属性引用的对象、常量引用的对象
      • native修饰的方法  

2.JVM中的垃圾回收算法都有哪些

标记清除算法

  • 标记:根据可达性算法将得出的垃圾进行标记
  • 清除:对这些标记为可回收的对象进行垃圾回收
  • 清除和回收速度相对较快,但是会导致内存不完整,碎片化比较严重

标记整理算法(老年代常用算法)

  • 在标记清除算法的基础上,再将对象位置进行移动,虽然解决了碎片化问题,但是在性能上会有一定影响

复制算法(年轻代常用算法)

需要开辟两个大小完全相同的内存空间;

同样是通过gc root标志垃圾;在垃圾回收后,会将存活的对象复制到另一个区域,该区域全部清空。

在垃圾对象较多的情况下效率较高,而且无碎片化;但是需要分配两块内存空间,并且有一块在同一时间内是无法使用的

 

3.JVM中的分代回收

堆会进行区域划分:新生代(eden,幸存者区to,幸存者区from):老年代比例为1:2

对象分代回收策略:

  1. 新创建的对象都先分配到eden区;
  2. eden区内存不足时,会标记eden区与from区的存活对象
  3. 采用复制算法将存活对象复制到to中,复制完毕后释放eden和from区内存
  4. eden区内存再次不足时,标记eden区和to区存活对象,再次进行复制算法将其移动到from区,回到2
  5. 当幸存区对象经历多次回收(至多15次),会从新生代晋升为老年代。(幸存区内存不足或者大对象也会提前晋升)

 

4.MinorGC、MixedGC、fullGC的区别是什么

MinorGC(youngGC)发生在新生代的垃圾回收,暂停时间短(STW)

MixedGC发生在新生代+老年代部分区域的垃圾回收,由G1收集器持有

fullGC新生代+老年代完整的垃圾回收,STW时间很长,应极力避免

 

5.JVM都有哪些垃圾回收器

串行垃圾回收器:分为serial和serial old串行垃圾收集器,使用单线程进行垃圾回收,堆内存较小,适合个人电脑

  • serial作用于新生代,使用复制算法;serial old作用于老年代,使用标记-整理算法。垃圾回收时,只有一个线程在工作,其他线程都要STW,等待垃圾回收完成

并行垃圾回收器:分为parallel new和parallel old,JDK8默认使用该回收器

  • parallel new作用于新生代,使用复制算法;parallel old作用于老年代,使用标记-整理算法。与串行不同的是,并行回收是多个线程在工作,其他没什么不同....

CMS(并发)垃圾回收器concurrent mark sweep:主要针对老年代的垃圾回收器。停顿时间短,用户体验好;在进行垃圾回收时应用可以正常运行。有以下四个工作阶段

  • 初始标记:短暂的STW,标记一下GCroot关联的对象
  • 并发标记:标记出所有科可达对象
  • 重新标记:修正并发标记期间的变动,需要STW
  • 并发清楚:采用标记-清除法,会有内存碎片

G1垃圾回收器

G1和其他垃圾回收器的区别就是不再按默认的将堆分为新生代与老年代,而是将堆划分为多个大小相同的region,每一个region可以按需要来充当eden、survivor、old。也因此G1可以预测STW

JDK9之后默认垃圾回收器都是采用的G1。G1应用于老年代与新生代

划分了多个区域,每个区域都可以作为eden,survivor,old,humongous(专门存储大对象,如果一个存储空间不够的话他是会连续存储来实现humongous);采用复制算法。

如果垃圾回收速度赶不上新建对象速度会导致fullGC

有三个工作阶段:

  1. 年轻代垃圾回收
    1. 初始时,所有区域都处于空闲状态
    2. 刚刚创建对象时,会随机选择一些空间作为eden区
    3. 当eden区需要进行垃圾回收时,挑选一个空闲区作为survivor区,用复制算法复制存活对象,需暂停用户线程(这里的STW很短)
    4. eden区会和新的survivor通过复制算法合并成新的survivor区,其中较老的对象晋升至老年代
  2. 并发标记
    1. 当老年代占用内存超过阈值(默认45%)后,触发并发标记,无STW
  3. 混合垃圾回收
    1. 回收存活对象较少的老年代,和survivor区中的合并为新的old

 

6.强引用,软引用,弱引用,虚引用的区别

强引用:只有所有的GCroot都不通过强引用引用该对象,该对象才能被垃圾回收

软引用:SoftReference当触发一次垃圾回收时,下一次垃圾回收就会回收该对象

弱引用:WeakReference垃圾回收时,无论内存是否充足都会回收弱引用对象。ThreadLocal内存泄漏问题就是因为Entry extend WeakReference

虚引用:需配合引用队列使用,被引用对象回收时,会将虚引用入队,由Reference Handler线程调用相关方法释放内存。该引用主要用于跟踪对象被垃圾回收的状态

标签:标记,对象,回收,算法,垃圾,JVM,引用
From: https://www.cnblogs.com/kun1790051360/p/18528649

相关文章

  • java计算机毕业设计城市垃圾分类回收管理系统(开题+程序+论文)
    本系统(程序+源码)带文档lw万字以上 文末可获取一份本项目的java源码和数据库参考。系统程序文件列表开题报告内容城市垃圾分类回收管理系统的相关研究一、研究背景随着城市化进程的迅猛发展,城市垃圾产量呈现出急剧增长的态势。传统的垃圾处理模式,如简易堆放或填埋,已经暴......
  • 一文夯实垃圾收集的理论基础
    如何判断一个引用是否存活引用计数法给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加1;当引用失效,计数器就减1;任何时候计数器为0的对象就是不可能再被使用的。优点:可即刻回收垃圾,当对象计数为0时,会立刻回收;弊端:循环引用时,两个对象的计数都为1,导致两个对象都无法......
  • Java面试题中高级进阶(JVM篇)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!什么是StopTheWorld?什么是OopMap?说一下JVM的主要组成部分及其作用?什么是指针碰撞?什么是空闲列表?什么是TLAB?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***什么是StopT......
  • 垃圾堆积视频监测
    垃圾堆积视频监测利用现场已有的监控摄像头,垃圾堆积视频监测通过人工智能AI视觉分析技术自动识别小区垃圾桶、街道、马路、路口是否有垃圾堆放、垃圾桶满溢等情况。一旦检测到垃圾堆放、垃圾桶满溢、垃圾暴露等情况,系统会自动截图并发出告警消息,提醒管理人员及时处理。与传统的人......
  • 基于MATLAB的实验室垃圾分类
    本文主要是针对不同颜色的实验室垃圾进行检测。(1)本文采用了一种应用MATLAB软件,将颜色作为实验室垃圾检测的先决步骤,在RGB色彩空间应用阈值法建立颜色模型来定位初步检测结果。(2)定位到了初步检测以后,再继续精准定位实验室垃圾区域。本文还利用了形态学知识,进行小面积干扰的去......
  • JVM 由哪几部分组成?
    JVM的组成我们先笼统的总结一下类装载子系统运行时的数据区(内存)堆区(heap):new出来的对象都放到堆里栈区(stack):线程栈,线程私有,存放线程用到的局部变量,执行方法的时候,就会将用到的方法插入栈,一个方法对应于一个栈帧。方法区(methodarea):存储已被虚拟机加载的类信息、......
  • Java路线图:Java基础入门、Java核心技术、JVM和性能优化、web服务器、web开发框架、消
    准备下载、配置Maven下载、安装IntelliJIDEA准备一个GitHub仓库(或者码云),管理Java源代码Java基础入门1)基本数据类型8种基本数据类型(boolean、char、byte、short、int、long、float、double)整形中byte、short、int、long的取值范围单精度和双精度为什么不能使用......
  • JVM-GC调优
    GC调优GC调优指的是对垃圾回收(GarbageCollection)进行调优。GC调优的主要目标是避免由垃圾回收引起程序性能下降。GC调优的核心分成三部分:1、通用Jvm参数的设置。2、特定垃圾回收器的Jvm参数的设置。3、解决由频繁的FULLGC引起的程序性能问题。GC调优没有没有唯一的标准......
  • Java面试题虚拟机为什么使用元空间替换了永久代(JVM篇)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!虚拟机为什么使用元空间替换了永久代?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***虚拟机为什么使用元空间替换了永久代「什么是元空间?什么是永久代?为什么用元空间代替永久......
  • Java面试题虚拟机为什么使用元空间替换了永久代(JVM篇)
    前言本来想着给自己放松一下,刷刷博客,突然被几道面试题难倒!虚拟机为什么使用元空间替换了永久代?似乎有点模糊了,那就大概看一下面试题吧。好记性不如烂键盘***12万字的java面试题整理***虚拟机为什么使用元空间替换了永久代***「什么是元空间?什么是永久代?为什么用元空间......