垃圾回收机制的各种疑问

article/2025/9/19 13:43:22

目录

      • jvm的内存模型中,运行时数据区分为哪几个部分?
      • JVM如何判断一个对象所占内存是可以被回收的?
      • 什么是年轻代?
      • 方法区和永久带的联系是什么?
      • 为什么要分年轻代和老年代?
      • 为什么新生代和老年代要采用不同的回收算法?
      • 为什么新生代要分出Survivor区?
      • 为什么有两个Survivor区?
      • MinorGC和Full GC的区别是什么?
      • Java堆内存的新生代Survivor区“To”被填满了,to区中的有的对象年龄还没被复制15次,也会被移动到年老代中吗?
      • 方法区可以GC吗?

jvm的内存模型中,运行时数据区分为哪几个部分?

jvm内存模型

JVM如何判断一个对象所占内存是可以被回收的?

把一系列称为 “GC Roots” 的引用(很多博客说GC Root是对象,严格来讲是对象的引用,并不是对象本身,包括下面列举的四种,也是引用。但是大家都说成对象,也不纠结这些了。)作为起始点,从这些起始点向下搜索,搜索走过的路径就是引用链,当一个对象到 GC Roots 没有任何引用链相连,也就是从 GC Roots 到这个对象不可达时,这个对象可以被回收。

GCRoot包括:

  1. 虚拟机栈(栈帧中的本地变量表)中的引用
  2. 本地方法栈中 JNI(即一般说的 Native 方法)引用
  3. 方法区中类静态属性的引用
  4. 方法区中常量引用

通俗的讲:
1. 虚拟机栈(栈帧中的本地变量表)中引用,是指main函数内新建的局部变量。
2. 本地方法栈中 JNI(即一般说的 Native 方法)引用,JNI核心方法内新建的局部变量。
3. 方法区中类静态属性引用的对象,是指所有的类变量(类的static成员变量)引用。
4. 方法区中常量引用的对象,是指所有的常量(static final)引用。

JVM中如何判断对象可以被回收?
GC Roots 是什么?哪些对象可以作为 GC Root?看完秒懂!

什么是年轻代?

  • 堆内存分为年轻代(Young Generation)、老年代(Old Generation),比例为1:2。年轻代又分为Eden和Survivor区。Survivor区由FromSpace和ToSpace组成。Eden区占大容量,Survivor两个区占小容量,默认比例是8:1:1。。
  • 永久代(Permanent Generation)是方法区的实现,存储程序运行时长期存活的对象,比如类的元数据、方法、常量、属性等。

JVM堆内存(heap)详解

方法区和永久带的联系是什么?

方法区和永久代的关系很像Java中接口和类的关系,类实现了接口,而永久代就是HotSpot虚拟机对虚拟机规范中方法区的一种实现方式。
Java方法区和永久代

为什么要分年轻代和老年代?

  • 新生代(Young Gen):年轻代主要存放新创建的对象,内存大小相对会比较小,垃圾回收会比较频繁。年轻代分成1个Eden Space和2个Suvivor Space(from 和to)。
  • 老年代(Tenured Gen):老年代主要存放JVM认为生命周期比较长的对象(经过15次的Young Gen的垃圾回收后仍然存在),这些对象内存大小相对会比较大,还有大对象,老年代的垃圾回收也相对没有那么频繁。

为什么新生代和老年代要采用不同的回收算法?

  • 在新生代中,每次垃圾收集时都发现有大批对象死去,只有少量存活,那就许选择“标记-复制”算法,只需要复制少量存活对象,就可以完成收集。
  • 老年代中因为对象存活率高、没有额外空间对它进行分配担保,就必须使用“标记–清除”、“标记整理”算法来进行回收。如果在老年代采用标记复制算法,需要复制的对象很多,效率不高。

为什么新生代要分出Survivor区?

  • Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生。Survivor的预筛选保证,除了大对象(超过Survivor一半)和累加超过Survivor一半的对象之外,其他对象如果在新生代中经历16次Minor GC还能存活,才会被送到老年代。
    详见 为什么新生代内存需要有两个Survivor区?

为什么有两个Survivor区?

  • 两个Survivor区可以减少复制次数,提高效率。

    • 年轻代采用复制算法,如果年轻代只有Eden区和from区,恰好Eden区和From区都存在需要回收的垃圾对象,Eden区的存活对象可以复制到from区对象的后面,然后把Eden区清空。但是From区有垃圾对象也有存活对象,from区的这些对象又往哪里复制?
      1. 如果往老年代复制,老年代也会快速装满,引发full GC,性能降低。
      2. 如果往清空后的Eden区复制, 比如:Eden区ABCDEF对象中,AB存活,From区XYZ对象,X存活。先把AB复制到From区,把Eden区清空,然后再把ABX复制到Eden区,From区清空,From区本身比较小,能装的对象不多,还需要把Eden区的ABX再复制回来。这样做也不是不行,只是相对于from+to机制来说,AB对象多了两次次复制,效率明显低了。再from+to机制下,Eden和from区的存活对象直接复制到to区,然后清空Eden和from区,并且交换from和to 。
  • 另外一篇文章:为什么新生代内存需要有两个Survivor区,给出的观点是两个Survivor区是为了解决碎片化问题,这个观点本人不大认可,但是文章还是值得读的。 因为复制算法本身已经解决了碎片问题,上面的思路2就是例证,只是效率低。所以还是这样做的效率更高。

    聊聊JVM的年轻代
    为什么新生代内存需要有两个Survivor区
    为什么新生代内存需要有两个Survivor区?(腾讯云)

MinorGC和Full GC的区别是什么?

  • MinorGC也称作Young GC,只对Young Gen进行回收。Eden区内存不足时会触发Minor GC。

  • Full GC对年轻代、老年代都进行内存回收。Full GC的触发条件是:

    1. 调用System.gc()只是建议虚拟机执行 Full GC,但是虚拟机不一定真正去执行。
    2. 未指定老年代和新生代大小,堆伸缩时会产生fullgc。
    3. 老年代空间不足。
    4. JDK 1.7 及以前的(永久代)空间满。
    5. 空间分配担保失败。

    Full GC 和 Minor GC,傻傻分不清楚
    一文搞懂Y-GC和Full GC的触发条件
    什么时候会触发Full GC

Java堆内存的新生代Survivor区“To”被填满了,to区中的有的对象年龄还没被复制15次,也会被移动到年老代中吗?

  • 虚拟机并不是永远地要求对象的年龄必须达到了MaxTenuringThreshold才能晋升老年代,如果在Survivor空间中具有相同年龄N的所有对象,如果它们内存大小的总和大于Survivor空间的一半,年龄大于或等于m的对象就可以直接进入老年代,无须等到MaxTenuringThreshold中要求的年龄。


    例如:下面的场景

    MaxTenuringThreshold为15
    年龄1的对象占用了33%
    年龄2的对象占用33%
    年龄3的对象占用34%。

    年龄1的占用了33%,年龄2的占用了33%,累加和超过默认的TargetSurvivorRatio(50%),年龄2和年龄3的对象都要晋升。

    jvm误区–动态对象年龄判定

方法区可以GC吗?

根据Java虚拟机规范的规定,方法区无法满足内存分配需求时,也会抛出OutOfMemoryError异常,虽然规范规定虚拟机可以不实现垃圾收集,因为和堆的垃圾回收效率相比,方法区的回收效率实在太低,但是此部分内存区域也是可以被回收的。
方法区的垃圾回收主要有两种,分别是对废弃常量的回收(常量池的回收)和对无用类的回收(类的卸载)。
JVM:方法区可以GC吗?

垃圾回收会造成,界面卡顿。

详解Java的垃圾回收机制(GC)
Java虚拟机垃圾回收(三) 7种垃圾收集器
Java虚拟机(JVM)你只要看这一篇就够了!
300赞:浅析JAVA的垃圾回收机制(GC)


http://chatgpt.dhexx.cn/article/H0D6hmFq.shtml

相关文章

垃圾回收(GC) 很干,很全

说一下垃圾回收机制 垃圾回收主要针对的是JVM的堆内存,我讲一下我了解的hotspot实现的jvm, 分为新生代和老年代,按照以前的说法,还有一个永久代,永久代在方法区里(物理上跟老年代相连),保存了class信息,静态变量,常量池等, jdk1.8之后,方法区实现发生了变化,取消了永久代的概念…

浅谈垃圾回收机制

目录 前言: 1.标记清除(主要) 2.引用计数(次要) 3.一些注意的点 前言: JavaScript的垃圾回收机制是为了防止内存泄漏的,所谓的内存泄漏是指当已经不需要某块内存时这块内存还存在着&#xff…

通过图文给你讲明白java GC的垃圾回收机制

本文原链接 http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html 1. JAVA GC 概述 JAVA GC采用了分代思想,将java堆分成新生代,年老代,永久代。GC算法主要有标记-清除,标记-压缩,复制算法。 新生代…

jvm垃圾回收是什么时候触发的? 垃圾回收算法? 都有哪些垃圾回收器

1.1。那究竟GC为我们做了什么操作呢? 1 ,哪些内存需要回收? 2 ,什么时候回收? 3 ,如何回收? 这时候有人就会疑惑了,既然GC 已经为我们解决了这个矛盾,我们还需…

Java回收垃圾的基本过程与常用算法

目录 一、基本概述 二、垃圾分类 基本背景 举例说明各种引用类型的作用 强引用(Strong Reference) 软引用(Soft Reference) 弱引用(Weak Reference) 虚引用(Phantom Reference&#xff…

java面试-GC垃圾回收机制

原理: GC是垃圾收集的意思(Garbage Collection),Java提供的GC功能可以自动监测对象是否超过作用域从而达到自动回收内存的目的。 简而言之,GC是将java的无用的堆对象进行清理,释放内存,以免发生内存泄露。…

JVM垃圾回收算法、GC和分代回收、三色标记并发漏标、垃圾回收器

一.标记清除 标记速度与存活对象线性关系 清除速度与内存大小线性关系 标记清除法分为标记阶段和清除阶段,标记阶段首先找到一些GC Root对象(根对象),根对象是那些一定不能被回收的对象。清除阶段比较简单,加标记的对…

垃圾回收的主要区域是堆,那方法区会回收吗?

有些人认为方法区(如HotSpot虚拟机中的元空间或者永久代)是没有垃圾收集行为的,《Java虚拟机规范》中提到过可以不要求虚拟机在方法区中实现垃圾收集,事实上也确实有未实现或未能完整实现方法区类型卸载的收集器存在(如…

GC(垃圾回收)详解

JVM 1.年轻代:年轻代主要存放新创建的对象,垃圾回收会比较频繁。(稍微讲细一点就是即可,年轻代分成Eden Space和Suvivor Space。当对象在堆创建时,将进入年轻代的Eden Space。垃圾回收器进行垃圾回收时,扫描Eden Spac…

java---垃圾回收算法(GC)

目录 一、如何判断一个对象是否存活 1.引用计数法 2.可达性分析法 二、垃圾回收算法 1.标记清除法 2.复制算法 3.标记整理法 4.分代算法 具体流程 注意事项 空间分配担保原则 总结 一、如何判断一个对象是否存活 Java 堆中存放着几乎所有的对象实例,垃圾…

Java - GC 垃圾回收

JVM中一个垃圾回收线程,它的优先级较低,正常情况下不会执行。JVM空闲或者当前内存不足时,才会触发垃圾回收线程执行,扫描内没有被引用的对象,将这些对象添加到要回收的集合中进行回收。 GC介绍 Garbage Collection 垃圾收集,监测对象是否可…

GC是如何判断一个对象为垃圾的?被GC判断为垃圾的对象一定会被回收吗?

一.GC如何判断一个对象为”垃圾”的 java堆内存中存放着几乎所有的对象实例,垃圾收集器在对堆进行回收前,第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”。那么GC具体通过什么手段来判断一个对象已经”死去”的? 1.引用计数算法(…

基于28181协议的视频与平台的对接

问题描述 将IPC摄像头接入平台进行观看,或使用28181/rtsp/rtmp/flv等协议将视频流分发到其他平台。 解决方案 WVP-PRO(基于GB/T 28181-2016标准实现的流媒体平台),依托优秀的开源流媒体服务ZLMediaKit,提供完善丰富…

GB28181协议实现系列之----SDK Demo发布(7)

GB28181在终端的应用越来越广,但是一般很多做终端的厂家要加入到互联互通的GB28181网络协议栈中都必须招聘一些专业做GB28181的开发人员,并且需要对接各厂家的兼容性开发及对接调试工作,或是修改一些定制功能。安防市场一年有千亿以上的产值&…

GB28181协议之设备录像查询

目录 一、概述 二、GB28181录像文件查询 2.1 录像文件基本要求 2.2 命令流程 2.3 抓包文件抓图示例 三、国标平台介绍 一、概述 近年来,国内视频监控应用发展迅猛,系统接入规模不断扩大,涌现了大量平台提供商,平台提供商的接…

ZLMediaKit+wvp-GB28181-pro,搭建28181协议视频平台

ZLMediaKitwvp-GB28181-pro,搭建28181协议视频平台 一,简介 ZLMediaKit:实现RTSP/RTMP/HLS/HTTP协议的轻量级流媒体框架,支持大并发连接请求 一个基于C11的高性能运营级流媒体服务框架,项目地址:ZLMediaKit 特点: 基…

java gb28181网关_视频网关GB28181协议转换解决方案

原标题:视频网关GB28181协议转换解决方案 应用需求及问题: 四川某一所学校,校园内装置有上百个摄像头,学校监控系统是RTSP协议,现在需求要把校园的监控系统视频画面接入到公安系统里, 可公安系统只支持GB-T…

GB28181协议--校时

1、简介 根据《GB/T 28181 —2016》7.10、9.10的要求,GB28181设备网络校时功能描述如下: 联网系统内的IP 网络服务器设备宜支持 NTP(见IETF RFC2030) 协议的网络统一校时服务。 网络校时设备分为时钟源和客户端, 支持客户/服务器的工作模式; 时钟源应支…

GB28181协议常见几种信令流程(一)

在监控系统中,常见的摄像机设备互联协议有国际标准的ONVIF、国标的GB28181和各厂商的私有连接协议,本章从GB28181-2016中摘抄整理常见信令流程,如28181的会话/媒体通道、SIP基本注册/注销流程、客户端主动发起视频点播流程、设备控制流程等。…

国标GB28181协议客户端开发(一)整体流程和技术选型

国标GB28181协议客户端开发(一)整体流程和技术选型 本系列文章将介绍国标GB28181协议设备端的开发过程。本文旨在探讨整体设计和技术选型方面的考虑,为开发人员提供指导和参考。文章将从设备端开发的整体架构、信令交互流程以及关键技术选型等…