Java虚拟机——垃圾回收流程与算法

【Matlab 传感器布局优化】基于群智能算法的wsn覆盖优化研究 本文主要是对同构和异构传感器在指定空间内的布局进行优化,以最大覆盖率为目标,使用了DBO/SCA/WOA/SSA/NOA等启发式算法,在100x100的空间内,对30,100,200个传感器进行优化,得到最优的布局位置和对应覆盖率。 阅读详情

如何判断对象是否不再被引用

引用计数法(Referentce Counting)

在对象中添加一个引用计数器,每当有一个地方引用,计数器值就加1,当一个引用失效时,计数器值就减1。该方法需要额外的存储空间,虽然算法简单,实现简单,但是会引起一些问题(比如无法解决对象之间循环引用的问题),主流的Java虚拟机都没有采用这种方式。

可达性分析法(Reachability Analysis)

通过一系列称为“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索构成所走过的路径称为“引用链(Reference Chain)”,如果某个对象到GC Roots之间没有任何引用链连接,那么该对象就不可能再被使用。

可作为GC Roots的对象包括:

  • 虚拟机栈中引用的对象
  • 方法区中类 静态属性 所引用的对象
  • 方法区中常量所引用的对象
  • 本地方法栈中JNI所引用的对象
  • Java虚拟机内部的引用
  • 所有被同步锁(synchronized关键字)持有的对象
  • 反应Java虚拟机内部情况的JMXBean、JVMTI中注册的回调、本地代码缓存等。

引用类型:

  • 强引用:
    最“传统”的引用过定义,指在程序代码中普遍存在的 引用赋值(即类似 Object obj = new Object())。只要强引用关系还在,垃圾收集器就永远不会回收掉被引用的对象。

  • 软引用:
    用来描述一些还有用,但非必须的对象。 如果一个对象只具有软引用,且内存空间足够,垃圾回收器就不会回收它;如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。

  • 弱引用
    弱引用与软引用的区别是,如果对象只被软引用所引用,当GC时不管内存是否充足都会被回收。

  • 虚引用
    虚引用是最弱的引用,它不会对对象的生存时间构成影响,也无法通过虚引用来取得一个对象实例。虚引用对象在任何时候都可以被回收。

如何处理不再被引用的对象

在经过可达性分析后,那些不再被引用的对象不会立刻被回收,只有经过了两次标记之后,才会被回收。

垃圾收集算法

分代收集理论

分代收集理论建立在三个分代假说之上:

  • 弱分代假说:绝大多数对象都是朝生夕灭的
  • 强分代假说:熬过越多次垃圾收集过程的对象就越难以消亡
  • 跨带引用相对于同代引用来说只占极少数

前两个假说奠定了多款垃圾收集器的统一设计原则:收集器应该将Java堆划分出不同的区域,然后将回收对象依据其年龄(经历垃圾收集过程的次数)分配到不同的区域之中存储。

把堆分区之后,垃圾收集器才能每次只回收其中一个或一些区域

回收类型划分:

  • Partial GC:指目标不是收集整个Java堆的垃圾收集,其中又包括:
    • Minor GC/Young GC:目标只是 新生代 的垃圾收集
    • Major GC/Old GC:目标只是 老年代 的垃圾收集
    • Mixed GC:收集整个新生代和部分老年代
  • Full GC:收集整个Java堆和方法区

标记-清除(Mark-Sweep)算法

先标记出所有需要收集的对象,标记完成后,统一回收所有标记了的对象。也可以反过来标记存活的对象,收集所有未被标记的对象。

缺点:

  • 效率不稳定:如果存在大量需要比清理的对象,就需要做大量的标记与清理工作,导致标记和清理工作的效率随堆中对象数量的增加而降低;
  • 可能导致大量碎片:大量不连续的碎步片导致无法找到足够大的连续内存,从而不得不提前触发另一次GC。

标记-复制算法

简称为复制算法,为了解决标记-清除算法面临大量可回收对象时,效率低下的问题。

半区复制算法(Semispace Copying):将可用内存按容量 平分 为两块,每次只是用其中一块,当这一块内存用完时,就将还存活着的对象复制到另一块上,然后再把这块空间全部清理掉。

优点:不会产生内存碎片,因为是顺序分配内存,且统一回收的。
缺点:将可用内存缩小为了原来的一半;若一次复制存在大量存活的对象,那么就会产生大量的内存间复制开销。

目前大量商用虚拟机都采用该算法对 新生代 进行垃圾收集。

更加优化的半区复制算法

IBM公司对新生代“朝生夕灭”的特点做了更量化的诠释:新生代中的对象,有98%熬不过第一轮收集。所以我们不必按1:1的比例来划分新生代的内存空间。

Appel式回收:

将新生代内存空间划分为一个较大的Eden空间和两个较小的Survivor空间。Appel式回收将对象存储在Eden区或者其中一块Servivor区上,另一块Servivor区空闲。当发生垃圾收集时,将存活的对象一次性复制到空闲的Servivor区,然后清理Eden区和已用的Survior区。HotSpot虚拟机默认的Eden和Survivor的到小比例是8:1。如果一次Minor GC,Survivor空间不足以容纳存活的对象,那么部分存活的对象将直接进入老年代。

标记-整理(Mark-Compact)算法

该算法用户收集 老年代 对象。其标记过程与标记-清除算法一样,但在标记之后,不是直接清除,而是将存活的对象向内存的一端移动,然后再清理掉边界以外的内存区域。

内存分配原则

  • 对象优先在Eden分配

  • 大对象直接进入老年代

大对象指那些需要连续的大量空间的Java对象,比如很长的字符串,或很长的数组等。

  • 长期存活的对象进入老年代

虚拟机为每个对象定义了一个对象年龄计数器,存储在对象头中。对象通常在Eden区里诞生,如果经历一次Minor GC后任然存活,并且能被Survivor容纳的话,该对象就会被移入Survivor区,并且将其对象年龄设置为1,以后每经历过一次Minor GC并存活下来,年龄加1,当年龄达到一定程度(默认为15),该对象就晋升到老年代中去。

动态对象年龄:HotSpot虚拟机并不是一定要求对象的年龄达到阈值才将其存入老年代。当Survivor区里 相同年龄 对象占用的空间大于Survivor区容量的一半,年龄大于等于该年龄的对象就可以直接进入老年代。

40分钟快速入门Dart基础(上) 针对final 和const 理解的有点模糊的可以参考这篇文章: 可以参考这里Flutter 知识梳理(Dart)-Dart中static final const 区别看是不是超级好上手,好操作~其实Dart的整个学习起来还是蛮简单的,对于有基础的老司机更简单一些。分分钟敲起来~这篇文章就简单的介绍到这里如何短时间快速入门Dart,避免入坑。由于是想让大家快速入门Flutter,所以针对上面的这些章节我们讲解的只是一些在开发Flutter 过程中常用的一些方法和函数。 阅读详情

相关推荐

别再傻傻分不清了!用Design Compiler和PrimeTime实操对比PBA与GBA模式

本文深度解析静态时序分析(STA)中Design Compiler与PrimeTime工具的PBA与GBA模式差异,通过实际案例演示两种模式在转换时间计算、时钟路径分析等方面的对比,并提供工程实践中模式选择的策略与调试技巧,帮助工程师在芯片设计流程中平衡精度与效率。

weixin_42552315的博客 415

Java虚拟机垃圾回收过程

JVM堆中几乎放着Java世界中所有的对象实例,垃圾收集器在对堆内存进行回收前,第一件事情就是要确定这些对象有哪些还存活着,哪些已经死去(即不可能再被任何途径使用的对象)。 在主流的商业程序语言中,Java和c#等都是使用根搜索算法(GC Roots Tracing)判定对象是否存活的。这个算法的基本思路就是通过一系列的名为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过

Java 之 道 1312

使用pdfBox实现pdf转图片出现中文方块乱码 简单修改源码解决

参考文章 问题排查:使用pdfbox将pdf转image时STSong-Light字体中文乱码 pdfbox版本是2.0 日志中打印出类似这样的日志(例:Using fallback XXX for CID-keyed font STSong-Light),就说明系统没有安装STSong-Light字体,pdfbox使用XXX字体来替代了。如果出现方块,就说明没有这种字体,并且替代字体也没有,日志也有相应的其他提示。 正常操作就是安装缺失的 STSong-Light 字体,但是在网上搜到的都是 STSong

aji_csdn的博客 5266

java虚拟机垃圾回收执行流程

判断对象是否存活算法一: 引用计数算法: 当对象被创建时为其分配一个引用计数器,每当有位置访问时,该计数器数值就加一,当引用失效时,计数器值就减少1,任何时刻计数器引用为0的对象便不可能在被访问,但这不是java虚拟机堆对对象判断存活的方式,原因在于:难以解决对象之间相互引用如下例子public class TestGC { private Object object = n

just xiaoqiang 908

AD9253 LVDS 高速ADC驱动开发

对应:data clock时钟为500M DDR mode。具体内容:下文的参考博客写的很清楚,我就不详细写了。参考博客clock align模块不完整,本文新增这个模块。3、该款ADC工作在125Msps下,14bit - 2Lane - 1frame 模式。2、查阅Xilinx xapp524手册。1、查阅AD9253器件手册。

CAOXUN_FPGA的博客 2109

使用openclaw出现blocked URL fetch (url-fetch) reason=Blocked: resolves to private/internal/special 解决方案

本文主要介绍了使用openclaw出现blocked URL fetch (url-fetch) target=https://news.google.com/search reason=Blocked: resolves to private/internal/special-use IP address 解决方案,希望能对使用xx的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 11万+

Java虚拟机垃圾回收过程及垃圾收集器

文章目录一、GC需要完成的事情二、哪些内存需要回收?判断对象是否存活的算法:1、引用计数法2、可达性分析法三、垃圾收集算法1、标记-清除算法2、复制算法3、标记-整理算法4、分代收集算法四、对象内存分配1、对象优先分配在Eden2、大对象直接进入老年代3、长期存活的对象进入老年代4、空间分配担保五、垃圾收集器1、年轻代垃圾收集器1)Serial 收集器2)ParNew3)Parallel Scav...

TRX的博客 784

深入浅出讲解外部服务提供者 OAuth 2.0 帐户客户端创建与 ABAP 系统集成

本文详细介绍了在SAP ABAP平台配置OAuth 2.0客户端以安全调用外部Web服务的完整流程。主要内容包括:首先需要在外部服务提供者平台注册OAuth客户端,获取client ID和client secret;其次需特别注意重定向URI必须是公开可访问的地址;然后在ABAP系统中通过事务码OA2C_CONFIG配置OAuth客户端信息;最后阐述了常见的错误排查方法。文章强调了OAuth 2.0作为SAP系统与外部服务安全集成的标准协议,正确配置客户端是确保后续API调用安全可靠的关键前提。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1735

java一次完整的垃圾收集过程_详解Java 虚拟机垃圾收集机制

1 垃圾收集发生的区域之前我们介绍过 Java 内存运行时区域的各个部分,其中程序计数器、虚拟机栈、本地方法栈三个区域随线程共存亡。栈中的每一个栈帧分配多少内存基本上在类结构确定下来时就已知,因此这几个区域的内存分配和回收都具有确定性,不需要考虑如何回收的问题,当方法结束或线程结束,内存自然也跟着回收了而 Java 堆和方法区这两个区域则有显著的不确定性,只有在程序运行时我们才能知道程序究竟创建了...

weixin_27033895的博客 590

视觉SLAM十四讲slambook2示例代码所有依赖库的编译安装教程(VTK、OpenCV3、ceres、Sophus、g2o、Eigen、Pangolin、googletest等)

这是2021年的最后一篇博客~ 新年快乐! 0 准备工作   首先需要先安装cmake编译器: sudo apt-get install cmake   以及,将十四讲的示例代码克隆下来(十四讲的源码地址点击这里): git clone --recursive https://github.com/gaoxiang12/slambook2.git   由于里面的3rdparty文件夹内所有内容都来自于其他github仓库,所以需要加上--recursive参数,不然克隆下来的内容不完整。   如果你.

zeeq的博客 7839

LVGL 组件对齐方式说明

本文说明 LVGL(以 v8 为例)中常用的 lv_align_t对齐选项的含义与用法,对应界面设计工具里下拉列表中的以及等命名。

摸鱼专家 131

Java虚拟机 - 垃圾回收

JVM垃圾回收 柯南语录:比你厉害的人都在努力,你还有什么理由不努力。 垃圾收集器(Garbage Collection,简称GC),垃圾收集需要完成的三件事情: ·哪些内存需要回收? ·什么时候回收? ·如何回收? 1. 那如何判断对象是否存活呢? 在堆里面存放着Java世界中几乎所有的对象实例,垃圾收集器在对堆进行回收前, 第一件事情就是要确定这些对象之中哪些还“存活”着,哪些已经“死去”(“死去”即不可能再被任何途径使用的对象)了。 1.1. 引用计数法 在对象中添加一个引用计数器,每当有一个

Leida_wanglin的博客 951

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

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

JVM第九讲:深入理解java虚拟机之垃圾回收算法?CMS垃圾回收的基本流程?对象引用类型?

深入理解java虚拟机之垃圾算法?CMS垃圾回收的基本流程? 摘要:思考三个问题: 1、哪些内存需要回收?2、什么时候回收?3、如何回收?

Jet_qi的博客 1757

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

【web】Java虚拟机(JVM)(重点:JVM 执行流程&垃圾回收相关算法)

本文重点介绍JVM 执行流程、JVM 运行时五大数据区、JVM 类加载过程、分类、双亲委派模型、死亡对象的判断算法:引用计数法、可达性分析算法、垃圾回收算法:分代算法。

爱干饭的猿的博客 2017

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Java虚拟机——垃圾回收

Java虚拟机——垃圾回收简介

AIAIAIXIAO_的博客 2252

JVM系列--垃圾回收

在C/C++这类没有自动垃圾回收机制的语言中,一个对象如果不再使用,需要手动释放,否则就会出现内存泄漏。内存泄漏指的是不再使用的对象在系统中未被回收,内存泄漏的积累可能会导致内存溢出。在这段代码中,通过死循环不停创建Test类的对象,每一轮循环结束之后,这次创建的对象就不再使用了。但是没有手动调用删除对象的方法,此时对象就会出现内存泄漏。这段代码中,手动调用delete删除对象,就不会出现内存泄漏。称这种释放对象的过程为垃圾回收,而需要程序员编写代码进行回收的方式为手动回收。

jifashihan的博客 1367

学习笔记【Java 虚拟机②】垃圾回收

本博客主要讲述了垃圾收集器与内存分配策略,以及三个内存调优的小例子。

做笔记,记录学习中遇到的问题。 989

Java中的垃圾回收器

一、垃圾回收器 前面我们介绍的所有回收算法都是为实现垃圾回收器服务的,而垃圾回收器就是内存回收的具体实现。目前HotSpot虚拟机用到的垃圾回收器如下图所示。注意只有两个回收器之间有连线才能配合使用。 1、串行垃圾回收器 在JDK1.3.1之前,单线程回收器是唯一的选择。它的单线程意义不仅仅是说它只会使用一个CPU或一个收集线程去完成垃圾收集工作。而且它进行垃圾回收的时候,必须暂停其他所有的工作线程(Stop The World,STW),直到它收集完成。它适合Client模式的应用,在单CPU环境下,它

m0_49580032的博客 1198

JVM-垃圾回收(1)

JVM:java虚拟机,负责将字节码文件(.class文件)解释成能让系统执行的机器码JVM运行时数据区会有五个部分:方法区、堆、程序计数器、本地方法栈、虚拟机栈其中堆的会组成如下图程序计数器、本地方法栈、虚拟机栈是线程私有的,其中的对象随着线程的结束而消失,但方法区和堆是线程公有的,其对象不会自动消失,所以需要进行垃圾回收进行消除。

suningsss的博客 84

理解Java虚拟机

声明:学习刘望舒《Android晋级解密》第10章Java虚拟机总结 一、Java虚拟机的执行流程 Java虚拟机的运行流程包括两部分,编译时和运行时。其中编译时是将.java文件编译为.class文件;运行时是将.class文件交给Java虚拟机,进行程序的执行。由于最终Java虚拟机执行的是.class文件,因此在编译时是通过何种语言生成的.class文件,Java虚拟机并不关心,因此任何语言...

xk7298的博客 321

Java垃圾回收机制

Java垃圾回收机制

zhangyan_1010的专栏 4052

GC机制(垃圾回收机制)详解

一、我们为什么要去了解GC和内存分配? 在真实工作中的项目中,时不时的会发生内存溢出、内存泄露的问题,这也是不可避免的Bug,这些潜在的Bug在某些时候会影响到项目的正常运行,如果你的项目没有合理的进行业务内存分配,将会直接影响到的项目的并发处理,当垃圾收集成为系统达到更高并发量的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节,而了解了GC实现机制则是我们一切监控和调节的前提。 二、...

cxinling的博客 2070

java垃圾回收主要是哪两块_理解Java垃圾回收机制

讲GC原理很简单,但是把GC原理讲的简单就不简单了。本文力求简单透彻,让所有Android开发人员都能明白基本的GC原理。Jvm(Java虚拟机)内存模型从Jvm内存模型中入手对于理解GC会有很大的帮助,不过这里只需要了解一个大概,说多了反而混淆视线。Jvm(Java虚拟机)主要管理两种类型内存:堆和非堆。堆是运行时数据区域,所有类实例和数组的内存均从此处分配。非堆是JVM留给自己用的,包含方法区...

weixin_28941715的博客 94

JVM详解 --- 垃圾回收机制

由于对象进行了分代处理(便于内存分配与回收),因此垃圾回收区域、时间也不一样。GC有两种类型:Minor GC和Full GC。Minor GC:一般情况下,当新对象生成,并且在Eden申请空间失败时,就会触发Minor GC,对Eden区域进行GC,清除非存活对象,并且把尚且存活的对象移动到Survivor区。然后整理Survivor的两个区。这种方式的GC是对年轻代的Eden区进行,不会影响到年老代。因为大部分对象都是从Eden区开始的,同时Eden区不会分配的很大,所以Eden区的GC会频繁进行。

大师兄你家猴跑啦的博客 2059

Java JVM 垃圾回收机制

JVM 的垃圾回收机制是自动的,它通过不同的回收算法和回收器来回收堆内存中的对象。垃圾回收的主要目的是释放不再使用的对象占用的内存,以避免内存泄漏和内存溢出。

qq_35082497的博客 622

垃圾回收在哪一章java_一文看懂Java垃圾回收与算法

首先来张祖传的思维导图:内存回收与垃圾收集器在很多时候都是影响系统性能、并发能力的主要因素,虚拟机之所以提供多种不同的收集器以及提供大量的调节参数,是因为只有根据实际应用需求、实现方式选择最优的垃圾收集方式才能获得最好的性能。GC发生在那里:JVM虚拟机运行时内存区域主要分为(如下图):虚拟机栈、本地方法栈、程序计数器、Java堆、方法区。其中虚拟机栈、本地方法栈、程序计数器为线程私有区域,在这几...

weixin_29338423的博客 174
上一篇: Java虚拟机——运行时数据区与对象内存布局
下一篇: Spring AOP(面向切面编程)
风萧水丶寒
博客等级 码龄11年 6粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值