【JVM专题】垃圾回收算法与垃圾收集器

DeepSeek提示词实战:从零到百的AI角色扮演指南(附100+场景模板) 本文提供了一份详尽的DeepSeek提示词实战指南,重点讲解AI角色扮演的核心技巧。通过“角色扮演四要素法”和五大核心场景模板,帮助用户从零开始掌握如何设计高质量提示词,有效提升AI输出的深度与精度,并附赠100+实用场景模板供参考。 阅读详情

一.垃 圾 回 收

 

  主要解决3个问题:

 

      1.如何判定对象为垃圾对象

           引用计数法   可达性分析法

      2.如何回收

           回收策略: 标记-清除算法    复制算法    标记-整理算法   分代收集算法           

           垃圾回收器: Serial   Parnew    Cms    G1

      3.何时回收

 

  (1)引用计数法:

 

  

 

   所以当计数值为0的时候,垃圾回收器便开始收集。但通常情况下都不使用该种策略,因器其并不能完全回

   收,例如,在堆内存中若存在对象之间的引用,便不能被回收。

 

 

 

 此时,若切断引用。在堆中的整体由于被对方引用,所以不会被回收,此时垃圾回收效率低。

 

eg:
 

  public class testGC {

      private Object instance;

    

      public testGC() {

        

          byte[] b = new byte[20*1024*1024];

    

      }

    
    public static void main(String[] args) {

        

        testGC t1 = new testGC();

        testGC t2 = new testGC();
       

        t1.instance = t2;

        t2.instance = t1;
      

        t1 = null;

        t2 = null;

        System.gc();

    }   

}

 

配置JVM参数

打印得到的日志

[GC (System.gc()) [PSYoungGen: 22446K->648K(37888K)] 42926K->21136K(123904K), 0.0019986 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

[Full GC (System.gc()) [PSYoungGen: 648K->0K(37888K)] [ParOldGen: 20488K->546K(86016K)] 21136K->546K(123904K), [Metaspace: 2748K->2748K(1056768K)], 0.0112990 secs] [Times: user=0.00 sys=0.02, real=0.01 secs]

Heap

 PSYoungGen      total 37888K, used 328K [0x00000000d6600000, 0x00000000d9000000, 0x0000000100000000)

  eden space 32768K, 1% used [0x00000000d6600000,0x00000000d6652030,0x00000000d8600000)

  from space 5120K, 0% used [0x00000000d8600000,0x00000000d8600000,0x00000000d8b00000)

  to   space 5120K, 0% used [0x00000000d8b00000,0x00000000d8b00000,0x00000000d9000000)

 ParOldGen       total 86016K, used 546K [0x0000000083200000, 0x0000000088600000, 0x00000000d6600000)

  object space 86016K, 0% used [0x0000000083200000,0x00000000832888d0,0x0000000088600000)

 Metaspace       used 2755K, capacity 4486K, committed 4864K, reserved 1056768K

  class space    used 295K, capacity 386K, committed 512K, reserved 1048576K

 

(2)可达性分析法

 

 通过定义GCRoot来进行从栈内存到堆中寻找,能被找到的说明是活着的对象,不能被找到的说明是垃圾对象,就要被回收。

 

 

 

   模型图:

 

 

如果切断了引用,则在堆中的整个一团,都将被当醉垃圾被回收。

 

(3)标记清除算法

 

   标记清除算法是其他算法的基础,但其本身有两个要解决的问题:效率问题  空间问题

  

 

    图中橙色表示正在被使用的空间,黄色表示可被回收的空间 。这样回收之后会造成空间的不连续,

    内存分配的时候效率就很低。又会进行多次垃圾回收。

 

(4)复制算法(主要在新生代)

     

      解决标记清除的效率问题

     

  

 

下面描述一下大概过程:模拟两个独立的区域,在上面的内存中,被标记回收的对象,清除以后。未被使用的对象,

将被连续的安排在下面的区域中,这样,当划分对象的时候,其效率大大提高。同样的,在下面的区域,被标记清除

之后,未被使用的内存也将被移动到上半部分,再被使用。

 

 

详细说明:

      内存的大概分布如下  在Eden区,只要创建新的对象,就会被扔到这个区域内。 两块Survivor为上图中

      的两块区域。Tenured Gen为内存担保,防止内存不够,作为缓冲。

 

   

     内存变化大致如下图,其被浪费的空间也仅占10%左右,这是一个可以被考虑的范围。

 

 

(5)标记整理算法(适用于老年代)

        

     对于老年代部分的内存,回收效率较低,会后垃圾较少的情况下,采用该算法最合适。

 

     

 

    标记整理算法可理解为    标记--整理--清楚三个部分,在上图中被标记的算法向右移动,

    右边的未被标记的算法也需要往左边移动,这样右边便会被整体清除回收,仅仅只是移动。

 

(6)分代收集算法

        分代收集算法并不是一个行的算法。他是有复制算法和标记整理算法的组合而实现的,

     当处于新生代,则采用复制算法。当处于老年代则采用标记整理算法。分代收集算法

     会根据不同的情况采用不同的策略。

 

(7)Serial垃圾收集器

 

       关于其特性:

 

    

 

     单线程执行模式大致如下:

 

    

    

 

        首先理解一下,单线程垃圾收集器,可能很多人会理解,单线程效率不是非常低,于是很多人就受不了

     其实不然,比如你在收集垃圾的时候又在创建垃圾,这样你就会永远无法收集完垃圾。如上图,在其他

     线程执行过程中,暂停其他线程,单独开启垃圾回收线程,当垃圾回收完毕,则可以进行其他线程,这

     样来回往复的进行垃圾收集与回收。但缺点就是,在高并发情况下,其执行效率较低。

 

(8)Parnew垃圾收集器

 

      该收集器为多线程执行模式

      使用复制算法收集(新生代)

 

     

 

   根据图可看出,与Serial垃圾收集器的不同是,在收集线程执行的过程中是多个垃圾收集线程执行,

在高并发的情况下执行效率较高,降低垃圾收集的时间,提高用户体验感。其实在某些情况下,

例如桌面客服端下,不如Serial执行效率高。

 

   要注意的一个点是,通常在使用Cms收集器对老年代进行收集的时候,不能同时使用Parallel进行收集,所以通

常情况下与parnew收集器进行组合使用。

 

(9)Parallel垃圾收集器

      

      parallel与parnew的大致功能相同,但他们的不同点在于关注点不同,即使用场景不同。

 

      

 

    parallel可进行参数的改变进行控制吞吐量:

     

    

 

 

    垃圾回收器的最大停顿时间以毫秒的单位,若时间过短,则其所能收集的内存也变小,

    但其收集的频率将变大。所以相当于一杆秤,根据应用场景不同要权衡好时间。

 

         

 

小结:

   parnew 适用于例如和用户交互的场景,垃圾收集器停顿时间短,用户体验感好。

   parallel适用于服务端开发,在高并发的情境下

 

 

Tushare Day2——了解stock_basic数据并根据行业和地区进行统计 了解stock_basic数据 1  stock_basic基础信息2  导入包和stock_basic数据、查看基本信息3  根据行业列进行统计3.1  1.先把不同行业列举出来,看一下一共有多少种行业3.2  2.统计每个行业分别有多少家公司3.3  3.把行业从array的二维数组形式变成list形式3.4  4.把行业从list形式转换成文本形式3.5&nbsp 阅读详情

相关推荐

ADP在线自适应动态规划之持续激励条件

在线自适应动态规划之持续激励条件 在在线自适应动态规划算法中,需要通过满足持续激励条件(Persistent Excitation Condition)保证critic网络权值的收敛性,一般的做法都是在算法初期在输入端引入探测噪声(Probing Noises)来保证数据的丰富性,但是由于在输入端引入噪声会给系统带来一些不好的影响,甚至可能破坏系统的稳定性。因此,出现了一些其他的方法来避免引入探测噪声,受阅读所限,我目前了解两种: Concurrent Learning(CL) Experience Re

qq_43435956的博客 6161

JVM专题二、内存分配与回收算法与垃圾收集器详解

JVM专题二、内存分配与回收算法与垃圾收集器详解 JVM虚拟机堆详解 学习思路按如下步骤。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3LUqoSu1-1586094408978)(file:///C:\Users\xuchang\AppData\Local\Temp\ksohtml612\wps13.jpg)] [外链图片转存失败,源站可能有防盗链机制,建议将...

HelloWorld! 248

Keil MDK安装NRF52832开发环境全攻略(附系统时间错误解决方案)

本文详细介绍了如何使用Keil MDK搭建NRF52832开发环境,包括基础软件安装、项目配置关键步骤以及常见问题解决方案。特别针对系统时间错误导致的编译失败问题提供了实用解决方法,帮助开发者快速上手NRF52832开发。

weixin_29168153的博客 505

【JVM面试专题-面试中JVM常问的问题你都知道吗?】

【JVM面试专题-面试中JVM常问的问题你都知道吗?】上面的问题对于已经工作一段时间的程序员来说肯定没有多大的问题,但是对于一些在校的大学生来说可能会或多或少的存在一些问题?我觉得不要紧,关于JVM的面试知识原来你不知道,也不了解,但是现在你看到了,就应该立即学习起来,查漏补缺,把整个知识框架完善起来。不要有太大的心理负担,慢慢积累,视频呢我也会按照一个一个问题的形式去发布,而同学们呢只需要一天掌握一个小的知识点就没问题了,日记月累,相信你在面试的时候被问到JVM内容的时候一定会有说的。

Coder_ljw的博客 399

Java写项目前的准备工作指南(技术栈选择 环境搭建和工具配置 项目结构设计与模块划分)

在开始编写一个 Java 项目之前,做好充分的准备工作是至关重要的。很多初学者可能在没有清晰规划的情况下就开始编写代码,导致项目开发进度缓慢、结构混乱,甚至最终无法按预期完成。而事实上,项目的成功不仅仅取决于编码能力,还包括项目初期的规划和准备。准备工作是确保项目顺利进行的基础,它包括技术选型、环境搭建、需求分析、团队协作及项目管理等多个方面。通过这些准备,我们可以确保项目的开发不仅高效而且有可维护性,最终能交付出高质量的代码。在项目开发过程中,异常处理是非常关键的一部分。

eternal__day的博客 1188

过程挖掘(Process Mining)1——始于颜值

下周开始每周1-2篇的过程挖掘分享 过程挖掘是什么? 过程挖掘与过程管理的关系? 过程挖掘与数据挖掘的关系? 管理学还是计算机科学?

hyhy12580的博客 6236

一文了解垃圾回收算法、垃圾收集器

由于Finalizer线程优先级相较于普通线程优先级要低,而根据Java的抢占式线程调度策略,优先级越低的线程,分配CPU的机会越少,因此当多线程创建重写finalize方法的对象时,Finalizer可能无法及时执行finalize方法,Finalizer线程回收对象的速度小于创建对象的速度时,会造成F-Queue越来越大,JVM内存无法及时释放,造成频繁的Young GC,然后是Full GC,乃至最终的OutOfMemoryError。从上图可以看出,没有进行垃圾回收之前,内存占用11960K。

loushaoqi的博客 2656

OpenStack ussuri 私有云平台搭建企业级实战

openstack是一个云操作系统,这个操作系统控制着数据中心中的计算,存储和网络资源。所有这些资源的管理都是通过API来来实现的,并且管理资源都有相应的认证机制。在openstack中有一个叫做dashboard的仪表盘,这个仪表盘通过web界面可以管理这些在DC中的资源。除了能提供IaaS功能外,你还可以使用orchestration,错误管理和服务管理等服务来确保应用的高可用性。

悦分享 2338

JVM垃圾回收——G1垃圾收集器

Garbage First(简称G1)收集器是垃圾收集器技术发展史上里程碑式的成果,它摒弃了传统垃圾收集器的严格的内存划分,而是采用局部回收的设计思路和基于Region的内存布局形式。G1是一款主要面向服务端应用的垃圾收集器,在jdk6 update14时,就有了实验版本。而到了jdk7 update4之后移除了“Experimental”标识。它的目的是为了适应现在不断扩大的内存和不断增加的处理器数量,进一步降低暂停时间(pause time),同时兼顾良好的吞吐量。

weixin_39555954的博客 1万+

高通平台开发系列讲解(系统篇)系统关机流程

📢本篇章主要图解高通平台系统关机流程。

内核笔记 3212

2025年再论 SAP ABAP 系统经典的三层架构的理解

【摘要】本文基于作者19年SAP开发经验,深入解析SAP经典三层架构在S/4HANA时代的演进与实践。数据库层从多数据库支持转向HANA专属,通过SQLScript实现计算下推;应用层以ABAP平台为核心,融合OData和RAP等现代开发范式;表现层从SAP GUI过渡到Fiori Launchpad为主导。文章通过真实案例(如月末关账优化、ATP检查改造)展示三层协作如何提升性能,并探讨了本地/云/混合部署策略。全文贯穿SAP官方技术文档参考,为开发者提供体系化架构认知和实践指导。

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

JVM虚拟机(三)垃圾回收算法、分代回收、垃圾回收器种类、G1垃圾回收器

JVM虚拟机(三)垃圾回收算法、分代回收、垃圾回收器种类、G1垃圾回收器

ACGkaka的博客 1978

使用MATLAB和Simulink来设计并仿真一个智能家居多传感器数据融合系统

智能家居多传感器数据融合系统旨在通过集成来自多种不同类型的传感器的数据,以提供更精确和可靠的环境信息或用户状态监测。例如,将温度、湿度、光照强度、运动检测等多种传感器的数据结合起来,可以更好地了解家庭内部的状态,并做出相应的调整或响应。在这个教程中,我们将使用MATLAB和Simulink来设计并仿真一个智能家居多传感器数据融合系统。

amy_mhd的博客 189

JVM垃圾回收

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

qq_62097431的博客 2136

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

JVM之垃圾回收算法详解

JVM之垃圾回收算法详解现有的垃圾回收算法分类垃圾收集器的设计原则标记-清除算法缺点标记-复制算法“Apple回收策略”缺点标记-整理算法缺点总结 现有的垃圾回收算法 分类 根据如何判定对象是垃圾,垃圾回收算法分为两类: 1、引用计数式垃圾收集(判定垃圾是通过引用计数器)别名:直接垃圾收集 2、追踪式垃圾收集(判定垃圾是通过GC Roots)别名:间接垃圾收集 主流虚拟机采用的是第二种追踪式垃圾收集,所以本文讲解第二种垃圾收集的算法 垃圾收集器的设计原则 根据两个分代假说: 1.绝大部分对象是熬不过第一

北洋的博客 4610

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

JVM中垃圾回收算法及垃圾收集器

目录 1 垃圾收集器的分类 1.1 次收集器 1.2 全收集器 1.3 垃圾回收器的常规匹配 2 常见垃圾回收算法 2.1 引用计数(Reference Counting) 2.2 复制(Copying) 2.3 标记-清除(Mark-Sweep) 2.4 标记-整理(Mark-Compact) 3 分代垃圾收集器 3.1 串行收集器(Serial) 3.2 并行收集器(P...................................................

上善若泪 2809

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

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

【JVM】Java垃圾回收与垃圾收集器_java 主动发起回收

运行时内存区域 :虚拟机栈、程序计数器、本地方法栈、Java堆、方法区。

2401_86963487的博客 1517

JVM垃圾收集算法及垃圾收集器

今天来总结一下最近学习到的JVM垃圾收集算法和垃圾收集器。原来以为这部分知识,对于一个Java程序员的用处不大,可是如果你的运营Web项目,出现了性能问题,那么这部分知识可以帮助你从运维的角度来优化你的项目。       首先,先讲一下JVM的垃圾收集算法,因为这是学习垃圾收集器的前堤。各种垃圾收集器也都是基于这些算法来实现的。 JVM垃圾收集算法       JVM垃圾收集算法有四种:

hello 5527

JVM垃圾回收机制&垃圾回收相关算法&垃圾收集器

在运行过程中,如果,这个对象就称为垃圾对象不清理垃圾对象,后续的对象可能会没有空间进行存储,会导致等问题。

谜语人的博客 1066

一文搞懂 JVM 垃圾收集器

G1(Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多核心处理器及大容量内存的机器(4G 以上的服务器才建议使用 G1 垃圾回收器),结合多种垃圾收集算法,从整体上看是基于标记-整理算法,从局部来看是基于标记-复制算法,都不会产生空间碎片,可预测的停顿,可以指定垃圾收集的时间,以极高概率满足 GC 停顿时间要求的同时,还具备高吞吐量性能。总结:本篇简单分享了垃圾收集器的工作流程及原理,对我们理解 JVM 以及 JVM 内存调优有一定的帮助,希望可以帮助到正在提升的你。

weixin_42118323的博客 1104

JVM垃圾回收算法及垃圾回收器

JVM基本垃圾回收算法,按照基本回收策略分 标记-清除(Mark-Sweep) 一、标记-清除(Mark-Sweep) https://www.html.cn/qa/other/22924.html 此算法执行分两阶段。 第一阶段 标记:遍历内存区域,对需要回收的对象打上标记。 第二阶段 清除:再次遍历内存,对已经标记过的内存进行回收。 此算法需要暂停整个应用 绿色、蓝色---代表存活对象 灰色---非存活对象 白色--未使用的内存 缺点: 效率问题:遍历了两次内存空间(

喵酱 2957

JVM垃圾回收算法与垃圾收集器

JVM是通过分代收集理论进行垃圾回收的,即新生代和老年代选择的垃圾回收算法是不同的: 新生代:标记-复制算法 老年代:标记-清除、标记-整理算法等。 下面来看每个算法的理论和应用: 1. JVM垃圾回收算法 1.1 标记-复制算法 ①:此算法将内存分为大小相同的两块,每次使用其中一块,当这一块内存使用完毕后,通过标记活着的对象,把活着的对象复制到另一块中,然后把第一块内存空间清理掉。 ②:标记-复制 算法一般用在新生代,因为标记-复制算法只使用一半的内存空间,因为新生代对象朝生夕死的缘故,只需要付出少量的复

qq_1149513559的博客 1073

【JVM】从可达性分析,到JVM垃圾回收算法,再到垃圾收集器

深入理解Java虚拟机》[1]中,有下面这么一段话:在JVM的各个区域中,如虚拟机栈中,栈帧随着方法的进入和退出而有条不紊的执行者出栈和入栈操作。每一个栈帧中分配多少内存基本上是在类结构确定下来时就已知的(尽管在运行期会由即时编译器进行一些优化,但在基于概念模型的讨论里,大体上可以认为是编译器可知的),因此这几个区域的内存分配和回收都具有确定性,在这几个区域内就不需要考虑如何回收的问题,当方法结束或者线程结束时,内存自然就跟随着回收了。

不想睡觉的橘子君的博客 1201

3-JVM垃圾回收算法和垃圾收集器

垃圾回收算法和垃圾收集器 1.什么是垃圾回收 对于内存当中无用的对象进行回收,如何去判断一个对象是不是无用的对象。 引用计数法: 每个对象中都会存储一个引用计数,每增加一个引用就+1,消失一个引用就-1。当引用计数器为0时就会判断该对象是垃圾,进行回收。 但是这样会有一个弊端。就是当有两个对象互相引用时,那么这两个对象的引用计数器都不为0,那么就不会对其进行回收。 可达性分析: 判断某...

weixin_30037665的博客 1046

JVM - 再聊GC垃圾收集算法及垃圾收集器

文章目录Pre分代收集理论常见的垃圾收集算法标记 Pre JVM-04垃圾收集Garbage Collection(上)【垃圾对象的判定】 JVM-05垃圾收集Garbage Collection(中)【垃圾收集算法】 JVM-06垃圾收集Garbage Collection(下)【垃圾收集器】 分代收集理论 当前虚拟机的垃圾收集都采用分代收集算法 , 意思就是根据对象存活周期的不同将 java堆分为新生代和老年代,这样就可以根据各个年代的特点选择合适的垃圾收集算法。 举个例子,新生代中,大部分对象都是

小工匠 2万+

jvm的三种算法以及10种垃圾收集器

jvm的三种算法以及10种垃圾收集器 jvm怎么知道堆里面的对象是无用数据,有两种方式: 1.引用计数法: 每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。 2.跟查找GC Roots (Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,即为不可达对象。 jvm的三种基本算法 1.1 标记

li646495946的博客 4647
上一篇: Eclipse的debug调试大全
下一篇: ForkJoinPool 分支/ 合并框架实战与原理分析
ITgo
博客等级 码龄9年 14粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值