JVM垃圾收集GC

JVM虚拟机(十二)ParallelGC、CMS、G1垃圾收集器的 GC 日志解析 阅读详情

1.如何判断垃圾对象

1)引用计数算法

给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器减1;任何时刻计数器为0的对象就是不可能再被使用的。
引用技术算法实现相对简单,判定效率也比较高(ActionScript3,Python语言等都使用此算法),但是java虚拟机没有使用这个算法,主要原因是引用技术算法很难解决循环引用的问题

2)可达性分析算法

在主流的商用程序语言(java、c#)的主流实现中,都是通过可达性分析来判定对象是否存活的。
对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。
通过一系列名为根(GC Roots)的引用作为起点,从这些根开始搜索,经过一系列的路径,如果可以到达java堆中的对象,那么这个对象就是“活”的,是不可回收的。可以作为根的对象有:

  • 虚拟机栈(栈桢中的本地变量表)中的引用的对象。
  • 方法区中的类静态属性引用的对象。
  • 方法区中的常量引用的对象。
  • 本地方法栈中JNI的引用的对象。

2. 两次标记过程

  • 如果对象在进行可达性分析后发现没有被任何GC Roots对象所引用,那么它将被第一次标记并且进行一次筛选,条件是此对象是否有必要执行finalize()方法。当对象没有覆盖finalize()或finalize()方法以及被虚拟机调用过(只会被调用一次),虚拟机将视为没有必要执行finalize
  • 如果需要执行finalize(),那么这个对象将被放置在一个叫做F-queue队列之中,并在稍后由一个虚拟机自动建立的、低优先级的Finalizer线程去执行它
  • finalize()是对象逃脱被回收的最后一次机会,稍后GC将对F-queue中的对象进行第二次标记。如果对象要在finalize()中拯救自己(把this赋值给某个类变量或者对象的成员变量)那么第二次标记的时候它将被移出”即将回收“的集合。否则,对象会被回收。

3.回收方法区

永久代的垃圾收集主要回收两部分内容:废弃常量和无用的类。
废弃常量:假如一个字符串为”abc“,如果没有被任何String对象引用,如果此时发生内存回收且有必要回收的时候,”adb“常量会被系统清理出常量池
无用的类:
1.该类所有的实例都已经被回收,也就是行锁java堆中不存在该类的任何实例
2.加载该类的ClassLoader已经被回收
3.该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射访问该类的方法
HotSpot虚拟机提供了-Xnoclassgc参数来控制是否回收类

4.垃圾收集算法

垃圾收集器通常会假设大部分的对象的存活时间都非常短,只有少数对象的存活时间比较长。
垃圾收集算法在JVM中主要是复制算法(新生代GC)和标记/整理算法(老年代GC)。

标记-清除(Mark-Sweep)算法
算法过程:
1. 先判定对象是否可回收,对其标记。
2. 统一回收(简单地删除对垃圾对象的内存引用)。
优点:简单直观容易实现和理解。缺点:效率不高,内存空间碎片化。

复制(Copying)算法
将内存平均分成A、B两块,算法过程:
1. 新生对象被分配到A块中未使用的内存当中。当A块的内存用完了, 把A块的存活对象对象复制到B块。
2. 清理A块所有对象。
3. 新生对象被分配的B块中未使用的内存当中。当B块的内存用完了, 把B块的存活对象对象复制到A块。
4. 清理B块所有对象。
5. goto 1。
优点:简单高效。缺点:内存代价高,有效内存为占用内存的一半。

对复制算法进一步优化:使用Eden/S0/S1三个分区
平均分成A/B块太浪费内存,采用Eden/S0/S1三个区更合理,空间比例为Eden:S0:S1==8:1:1,有效内存(即可分配新生对象的内存)是总内存的9/10。
算法过程:
1. Eden+S0可分配新生对象;
2. 对Eden+S0进行垃圾收集,存活对象复制到S1。清理Eden+S0。一次新生代GC结束。
3. Eden+S1可分配新生对象;
4. 对Eden+S1进行垃圾收集,存活对象复制到S0。清理Eden+S1。二次新生代GC结束。
5. goto 1。

标记-紧凑(Mark-Compact)
算法过程:
1. 标记:标记可回收对象(垃圾对象)和存活对象。
2. 紧凑(也称“整理”):将所有存活对象向内存开始部位移动,称为内存紧凑(相当于碎片整理)。完毕后,清理剩余内存空间。

分代收集策略
由于不同的对象适合使用不同的垃圾收集算法,所以引入“代”这个概念。不同的代有不同的分区,一般分为新生代区和老年代区。
新生代:适合采用复制算法进行垃圾收集,对象分布在Eden/S0/S1三个区。
老年代:适合采用标记-紧凑算法进行垃圾收集。

JVM内存结构,JAVA类的加载机制,GC算法,垃圾收集器 一、什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结构。类的加载的最终产品是位于堆区中的 Class对象, Class对象封装了类在方法区内的数据结构,并且向Java程序员提供了访问方法区内的数据结构的接口。 类加载器并不需要等到某个类被“首次... 阅读详情

相关推荐

JVM垃圾回收算法、收集器、触发情况、查看GC情况、频繁Full gc

文章目录垃圾回收算法标记-清除算法(Mark-Sweep)复制算法(Copying)标记-整理算法(Mark-Compat)分代算法垃圾回收器新生代老年代如何确定一个垃圾是可以回收的计数引用法可达性分析GC触发情况Minor GCFull GCJVM命令查看某个java进程的GC情况频繁老年代回收怎么分析解决 垃圾回收算法 标记-清除算法(Mark-Sweep) 如果你将内存想象成一个大方格,而这个大方格又由9*9个方块组成,我们存入的数据有小有大,有的可能要占用一个方格,有的数据可能需要占用两个方格甚至更

不洇的博客 904

JVM中的垃圾收集(GC)

​ GC,即,众所周知,Java在运行时会产生相当多的数据:譬如各种新引用,对象,类等等,而这些东西都存储在堆以及元空间之中(1.8之后),而当这些东西堆积起来,就很可能超过内存上限,然后OOM报错​ 那当然不能这样,因为Java本来的目标就是构建一个能长时运行且稳定的系统。,垃圾回收​ 垃圾回收可以说是Java中最重要的一环,没有之一:它直接决定了整个JVM的稳定性以及性能,各种对于GC收集器的研究也一直在进行,每一次GC技术的突破都是Java性能的突破​ 下面就让我们来逐渐学习GC。

qq_30004513的博客 1242

【福建dem】原始高程数据tif格式

DEM(Digital Elevation Model,数字高程模型)是一种地理信息系统中的关键数据集,它提供了地表地形的三维信息,通常用于分析地貌特征、模拟水文过程、规划建设、灾害预警等多个领域。这种数据对于地理分析非常有价值,例如,它可以用于计算坡度、坡向、地形粗糙度等地形特征,或者进行洪水模拟、地质灾害评估、太阳能辐射分析等。“福建dem原始高程数据tif格式”是研究和理解福建省地形地貌的重要资源,结合GIS工具,可以揭示丰富的地理信息,为科研、工程和决策提供有力支持。

鸿业远图科技 943

JVM中常见的GC垃圾收集器

在 JVM 中,垃圾收集器(GC)的设计目标差异显著,主要体现在吞吐量、延迟、内存支持规模、线程模型等核心特性上。小型应用 / 嵌入式:优先 Serial GC;吞吐量优先(批处理):Parallel GC;中大型应用(平衡吞吐与延迟):G1(默认选择);超低延迟 + 大内存:ZGC 或 Shenandoah(根据 JDK 版本和生态选择)。实际使用中需结合堆大小、CPU 核心数、延迟要求进行压测调优,而非盲目选择 “高端” 收集器。

2401_85973273的博客 1304

RK3568/RK3588之修改8250驱动实现RS485收发的自动切换

在串口发送前,若为485,则将控制引脚拉为发送状态,在发送后,循环查看是否发送完成,若发送完成则将引脚置回读状态,如此一来,就能实现在内核测控制方向切换,而不会因为延时造成数据丢失,经过测试此办法可行。全部修改完成后,重新编译生成内核文件和设备树文件,烧写到板子上即可。

哒宰的博客 3109

在Redroid容器中构建Frida RPC服务:自动化生成淘宝X-Sign签名参数

本文详细介绍了在Redroid容器中构建Frida RPC服务,实现自动化生成淘宝X-Sign等签名参数的完整方案。通过逆向分析定位关键方法,定制Redroid系统使Frida-Server常驻运行,并编写Frida脚本将签名方法暴露为RPC接口,最终封装为可远程调用的微服务,解决了签名生成的可移植性与工程化难题。

ice55的博客 643

JVM 的 GC(Garbage Collection,垃圾收集)

在 JVM 中,“垃圾”指的是已经不再被任何引用链访问到的对象,也就是程序中无法再访问到的“无用对象”。判断垃圾:通过可达性分析,找出不可达对象标记存活对象:从 GC Roots 开始遍历清理内存:根据算法(复制、标记-清除、标记-整理)回收垃圾分代收集:新生代用复制算法,老年代用标记-整理选择收集器:根据应用需求选择合适的 GC(如 G1 适合大堆低延迟)监控调优:通过日志和工具分析 GC 行为,优化参数💡一句话总结。

qq_61723836的博客 954

【FPGA教程案例59】深度学习案例6——基于FPGA的CNN卷积神经网络之整体实现

在课程,我们对的基本原理有了初步认识。在上一个课程,我们完成了CNN的Relu激活层、pool池化层、卷积层以及图像输入层的实现,如下图所示:在本课程中,我们将上述四个模块结合起来,构建一个简单的CNN卷积神经网络。...

FPGA/MATLAB学习教程/源码/项目合作开发 2634

【JVM】垃圾收集器与GC日志(一)

串行:一个GC线程运行并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍然处于等待状态。并发(Concurrent):指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),用户程序在继续运行,而垃圾收集程序运行于另一个CPU上。

Cover_sky的博客 2281

【图像去噪】基础知识之加噪 | 给图像加噪的若干种方式,包括加高斯白噪声(AWGN)、泊松-高斯噪声、模拟真实噪声(SIDD、DND)等

本文介绍给干净图像加噪的若干种方式,新手入门必看!。根据noise类型不同,产生不同的Noisy,Noisy一般是模型输入。【图像去噪】基础知识之图像流 | 图像从输入到输出的前世今生,包括类型变化、维度变化、数值变化等。

主要更新底层视觉(去噪、超分等)相关的科研内容,形式为【论文精读】+【论文复现】 1097

RK3588,V4l2 读取Gmsl相机, Rga yuv422转换rgb (dma), 实现零拷贝

RK3588, 使用V4l2 读取 gmsl 相机,获得yuv422格式图像, 使用 rga 转换 rgb 图像。减少cpu占用率. 内存管理方式采用 dma,实现零拷贝.

J。 1261

深入理解JVM的垃圾收集(GC)机制

本文介绍了垃圾收集(GC)的基本概念和实现原理。主要内容包括:1.垃圾判定方法:引用计数法(存在循环引用问题)和可达性分析(通过GC Roots判断对象是否存活);2.分代收集理论:将堆内存分为新生代(存活时间短)和老年代(存活时间长),采用不同回收策略;3.三种垃圾回收算法:标记-清除(简单但有碎片)、标记-复制(适合新生代)、标记-整理(适合老年代);4.Stop The World现象:垃圾回收时必须暂停用户线程,这对系统性能有重要影响。文章阐述了垃圾收集的关键问题和解决方案,为理解JVM内存管理机制

m0_75163045的博客 1054

微信小程序(云开发) - 实现微信小程序拼团功能+前后台源码/数据库设计,开团参团、自动成团、微信分享链接URL参与拼团、组团人数/倒计时/实时数据、设置拼团人数限制等(拼团退款处理逻辑、订单同步等)

实现微信小程序云开发拼团功能,云开发小程序--微信拼团设计实现,微信小程序实现秒杀、拼团等效果,微信小程序云开发拼团源码完整版 包含前后台和数据库,拼团商城小程序开发,分销,拼团,社群团购,微信小程序—判断参团人数(设置拼团剩余人数数组)拼多多拼团小程序开发,微信云开发教程怎么实现微信小程序云开发拼团功能?云开发如何实现拼团,拼团小程序怎么弄,微信小程序案例:拼团模块,需要朋友助力,详细源码demo示例,如何做拼团功能,云开发小程序如何做拼团功能,外卖电商拼团,仿拼多多拼团,拼团后退款怎么办,拼团后订单管理

🏆 前端领域优质创作者 4626

JVM垃圾回收和GC收集器运行原理

GC收集器是垃圾回收的具体实现,它根据不同的算法和策略来回收垃圾对象。JVM提供了多种GC收集器,每种收集器都有不同的特点和适用场景。JVM垃圾回收和GC收集器是Java开发中不可或缺的技术,它们解放了开发者从繁琐的内存管理中。通过使用不同的GC收集器,我们可以根据应用的需求选择最适合的收集器,提高程序的性能和稳定性。

赵KK的博客 667

[VT虚拟化驱动]安装DPC回调检测CPU对VT的支持

文章目录前言一、驱动基本框架二、安装DPC回调三、检测CPU对VT的支持本章代码def.h:DriverEntry.cpputil.cpp 前言 对于VT的介绍网上有很多详细的介绍,这里不再赘述,只需要知道它有比操作系统还高的权限,可以利用这一点进行某些操作,如内存隐藏, 无痕HOOK ,MSR HOOK, 调试或者反调试, 这里直奔主题 一、驱动基本框架 虚拟机设置里虚拟化引擎设置: 新建一个空的WDM工程,平台设置为x64平台,右键属性——>Inf2Cat——>Run Inf2Cat设置

吾无法无天的博客 3906

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

jvm垃圾收集-java GC

GC算法: 标记-清除(碎片,大对象空间不足;效率低) 复制(浪费50%的空间;持续复制长生存期对象,效率低) 标记-整理 分代收集,结合“复制”与“标记-整理”,新生代用“复制”算法,老年代用“标记-整理” 新生代中只有少量对象存活,采用复制算法,所费空间并不多。 老年代中对象存活率高,对象生命周期长,不宜采用复制算法 垃圾收集器 衡量垃圾收集器的主要参数:STW(Stop The Wor...

李思苇 296

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

JVM内存结构、GC算法以及各种垃圾收集器介绍

之前有“(updated)Allocation Failure引发的一些GC知识梳理”这篇文章中简单介绍过GC相关的一些知识点,但是总结的并不是很全面,本片文章希望能尽量详细分析下JVM内存结构、GC算法以及各种垃圾收集器介绍。 JVM内存结构如下: 主要包括了下面几个部分: 程序计数器(线程私有) 存放着当前线程所执行的字节码的行号指示器 栈(线程私有) 每个方法被执行...

淡定一生2333的博客 1314

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

详解JVM垃圾回收(Minor GC和Full GC有什么不同?、CMS收集器、G1收集器、垃圾回收算法)

在Java中垃圾回收的目的是回收释放不再被引用的实例对象,这样做可以减少内存泄漏、内存溢出问题的出现。

记录开发中常见的问题以及技术等 3069

JVM GC 垃圾收集简介

对于程序汇总分配的内存,当使用完成后,这部分内存就会成为垃圾,需要对其进行释放,否则,这部分内存将无法被重复利用,最终造成内存泄漏。GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。对于java而言,是自动进行垃圾回收的。既然要实现垃圾的自动回收,那么第一件事就是找到垃圾,那么如何发现垃圾呢?其实就是判断这个对象是否存活。常见的两种方式判断:引用计数法(reference count)的循环引用、相互引用: 没有外部引用,但是本身的计数器又不为0。根

老男孩的架构路 331

JVM GC 垃圾收集器

区域化分代式垃圾收集器,G1 是并行收集器,它把内存分割为很多不想关的区域(Region),每个Region可能是 Eden区,幸存者1区或幸存者0区,老年代等,这样可以避免在整堆中进行垃圾收集,将整个堆化整为零,一次回收其中一个或一些 Region,G1 进行垃圾回收时,会优先收集价值比较大的Region(可以认为当前不可达对象比较多的 Region 为价值比较大)。但实际使用中,由于各种疏忽,导致某些对象的生命周期超长,长时间无法释放,最后导致这种对象越来越多,最后 OOM,目前也称之为内存泄漏。

这个需求,做不了 473

jvm GC算法类型&垃圾收集器种类详解一条龙

总结下gc相关的内容,也是面试中常问的。 一.jvm体系概览 其中,灰色是线程私有空间;黄色(方法区和堆区)是公有空间,GC就跟这俩有关系。 二.常见的垃圾回收算法 4种: 1. 引用计数 缺点:a.每次对对象进行赋值时,都需要维护引用计数器,且计数器本身也有一定的消耗; b.较难处理循环引用。 jvm一般不采用这种时间方式。 2. 复制 发生在年轻代。 复制之后有交换,谁空谁是To。 详细...

雨剑的博客 1836

JVM垃圾收集器 以及如何查看GC日志

涉及的一些概念 新生代 DefNew:在Serial收集器中新生代名为Default New Generation ParNew:垃圾收集器ParNew中新生代名称就会变为[Parnew,意思为Parallel New Generation PSYongGen:如果采用Parrallel Scavenge收集器,那么它配套的新生代名称为PSYongGen 老年代同理,名称由垃圾收...

小白鼠丶 1316

JVM 垃圾收集与 GC 算法

一. 垃圾收集基础 Java语言的一大特点就是可以进行自动垃圾回收处理,而无需开发人员过于关注系统资源(尤其是内存资源)的释放情况。自动垃圾收集虽然大大减轻了开发人员的工作量,但同时,它也增加了软件系统的负担。一个不合适的垃圾回收方法和策略会对系统性能造成不良影响。 1. 垃圾收集的作用 在C++语言中,程序员必须小心谨慎地处理每一项内存分配,且内存使用完后,必须手工释放曾经占用的内存空间,当内存...

illusory_germ的博客 342

JVM之GC(垃圾收集)(第三篇)

文章目录1 基础术语2 常见垃圾收集算法2.1 常见标记算法2.1.1 引用计数器算法2.1.2 可达性分析算法2.2 常见收集算法2.2.1 标记-清除算法2.2.2 标记-压缩算法2.2.3 复制算法2.2.4 增量算法2.2.5 分代收集算法 红\color{#FF0000}{红}红 橙\color{#FF7D00}{橙}橙 黄\color{#FF0000}{黄}黄 绿\color{...

spring_zhangH的博客 240

JVM(2):垃圾收集器与gc

1.如何判断对象已死? 引用计数算法: 我们可以为每一个对象设置一个count引用计数器,每当一个地方引用它的时候,计数器就加1,当引用失效的时候,计数器就减1;当计数器的值为0的时候,就代表着这个对象不会再被使用了,这个时候就可以对该对象进行回收。 这个算法十分简单,但是并没有被广泛的使用。因为这个看似简单的原理需要考虑很多例外的情况。 可达性算法: 这是当前比较主流的判断对象是否应该被回收的方...

超人不会飞ilx 233

JVM的垃圾收集器,GC日志分析(HotSpot,JDK1.8附上GC思维导图)

JVM的垃圾收集器,GC日志分析(HotSpot) -server与-client参数 Server jvm的初始空间会大一些,默认使用的是并行垃圾回收器,启动慢,运行快 Client jvm相对保守一些,初始空间会小一些,使用串行垃圾回收器,他的目标是为了让JVM的启动速度更快,但是运行速度会比Server jvm慢一些 JVM在启动的时候,会根据硬件和操作系统自动选择使用Server还是Client类型的JVM JVM选择模式: 32位操作系统: 如果操作系统为windows系统,不论硬件配置如何

Violet 1124
上一篇: 引用类型
下一篇: Heap分区和分代概念
jamespengo
博客等级 码龄16年 83粉丝 48原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值