JVM—垃圾回收

  什么是垃圾        

     一个没有被任何引用的对象就是一个垃圾对象,

     垃圾对象需要被清理回收,否则一直占用内存空间,

     其他新对象无法使用垃圾对象空间,

      严重的话会造成内存溢出

   早期的垃圾回收:

      早期例如c/c++是需要程序员手动在程序对不再使用的对象进行删除释放.

      给程序员造成了繁重的工作量,

      万一忘记回收, 会造成内存泄漏.         

  现在的语言基本都是自动垃圾回收,解放了程序员

垃圾回收的区域

     垃圾回收涉及堆,方法区

 重点是堆

频繁回收新生代

较少回收老年代(频率低)

 较少回收方法区

内存溢出与内存泄漏

  内存溢出

     经过垃圾回收后,内存依然不够使用,导致程序崩溃

  内存泄漏

      一个对象在程序中不会被使用,但是垃圾收集器又不能回收.

  一直会占用着内存空间, 久而久之也是造成内存溢出的原因之一

   例如:

            单例模式中单例对象,整个程序中使用一个唯一的对象、数据库连接对象、Socket 、IO等对象,使用完毕后应该close 关闭资源,如果不关闭,回收器无法回收这些对象.

   STW(stop the world)

   当垃圾回收时(标记,回收),会导致其他用户线程暂停.

   必须保证分析时其他程序不再运行,保证分析准确性

垃圾回收算法

标记阶段

   目的:标记出哪些对象是垃圾对象

算法

   引用计数算法(没有被使用)

     在对象中有一个计数属性,只要有引用指向该对象,计数器加1

 计数器值如果为0,则表示此对象是垃圾对象.

 优点:实现简单

 缺点:

   计数器占用空间

   加一 减一需要时间开销

   无法解决循环引用问题

可达性分析算法

      从一些活跃对象开始(GCRoots)搜索,与根对象相关联的对象都是被使用的

  与根对象或者根对象相关的引用链不相关的对象,就称为垃圾对象.

哪些对象可以被称为根对象:

  1.虚拟机栈中(正在运行的方法)被引用的对象

  2.类中静态属性

  3.被用来当做同步锁

  4.java系统中的类

      对象的finalize()方法    

        Object类中         

                   protected void finalize() throws Throwable { }

在对象被回收前,可以在此方法中执行一些需要的逻辑.

当对象被判定为垃圾,在回收之前会调用finalize(),

而且finalize()方法只会被调用一次.

finalize()不需要自己调用,由垃圾回收期调用.

由于finalize()存在

对象可以分为:

   可触及的: 不是垃圾对象

   可复活的: 被标记为垃圾对象,但是finalize()还没有被调用

   不可触及的: 被标记为垃圾对象,finalize()已经被调用过了.

    回收阶段算法

  标记-复制算法

可以有多块内存,每次有一块是空闲的,

将存活的对象移动到未被使用的空间中,清除其他块中所有的垃圾对象

好处: 内存碎片少

适合存活对象小,垃圾对象多的场景(新生代回收)

  标记-清除算法

将存活对象位置不变的,将垃圾对象地址记录在一个空闲列表中,

后面如果创建新的对象,就会将空闲列表中垃圾对象覆盖掉.

不移动对象,适合老年代回收,

回收后,会产生内存碎片 

效率高

  标记-压缩算法

将存活对象重新进行排列,排列到内存一端,将其他区域空间进行清理

进行标记 - 清除 -压缩

移动对象,适合老年代回收

回收后,进来压缩, 不会产生内存碎片 

效率低

   分代收集:

根据不同的区域特点进行各自的回收

年轻代,对象生命周期短,存活对象少,回收频繁,采用复制算法

老年代,对象生命周期长,存活对象多,回收频率低,

可以采用清除和压缩两种算法混合使用.

垃圾回收器:

        垃圾回收算法是理论,垃圾回收器是真正进行回收的实践者,

        不同厂商,不同版本各自实现方式都有不同.

垃圾回收器分类:
从线程数量上分:

  单线程: 适用于一些小的设备,只有一个线程进行垃圾回收

  多线程: 有多个线程进行垃圾回收  

按照工作模式分:

   独占式: 垃圾回收线程执行时,其他用户线程暂停执行

   并发式: 垃圾回收线程可以和用户线程同时执行

按工作的内存区间分:

  年轻代垃圾回收器

 老年代垃圾回收器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/642555.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入分析 Linux 网络丢包问题

热门IT课程【视频教程】-华为/思科/红帽/oraclehttps://xmws-it.blog.csdn.net/article/details/134398330 所谓丢包,是指在网络数据的收发过程中,由于种种原因,数据包还没传输到应用程序中,就被丢弃了。这些被丢弃包的数量&#…

C语言初学9:数组

一、数组初始化和访问元素 1. 数组声明语句 type arrayName [ arraySize ]; double balance[5]; /* 声明一个长度为5的数组 */ 2. 数组初始化语句 double balance[5] {1000.0, 2.0, 3.4, 7.0, 50.0}; /*或者 double balance[] {1000.0, 2.0, 3.4, 7.0, 50.0};*/ …

C++进阶:多态(下)

1、多态的原理 多态之所以可以实现,主要是因为虚函数表的存在,虚函数表用于记录虚函数的地址,他是一个函数指针数组,在类中用一个函数指针数组指针来指向数组,子类继承了父类的虚函数表,当有重写的情况发生…

基于SAM的视频标注

在本文中,我们将演示基础模型的应用,例如 Meta 的 Segment Anything 和 YOLOv8,以自动检测、分类和绘制视频中感兴趣对象的蒙版。这是之前指南的后续:使用 Meta 的 Segment Anything 和 YOLOv8 自动分类掩码。在本指南中&#xff…

【RabbitMQ】快速入门及基本使用

一、引言 1、、消息队列 Ⅰ、什么是消息队列? 消息队列是一种进程间通信或同一进程的不同线程间的通信方式,软件的贮列用来处理一系列的输入,通常是来自用户。消息队列提供了异步的通信协议,每一个贮列中的纪录包含详细说明的数据…

PySimpleGUI:让spin支持循环

需求 自己用PySimpleGUI写了个小工具,但是发现它的spin不支持循环。 Tkinter本身的Spinbox有wrap这个开关可以觉得是否支持循环,但是没看到PySimpleGUI也支持这个特性。 代码实现 所谓spin的循环,是指当值变换到最大最小值时,可…

移动开发行业——鸿蒙OS NEXT开出繁花

1月18日,华为宣布HarmonyOS NEXT开发者预览版开放申请,根据官方注解,这个版本的鸿蒙系统有个更通俗易懂的名字——“星河版”,也被称为“纯血”鸿蒙。 根据官方解释,之所以取名星河版,寓意鸿蒙OS NEXT就像…

Screen 简介

目录 1. screen 简介2. screen 基本命令 1. screen 简介 screen 是一个在 Unix 和类 Unix 系统上的 终端复用 工具。它允许用户在单个终端窗口中运行多个终端会话,并提供了一些其他功能,如会话断开后的恢复和远程连接的分离。以下是 screen 的一些主要特…

hyperf 和 laravel、lumen防止xss攻击中间件封装

hyperf 防止xss攻击自定义中间件封装 <?phpdeclare(strict_types1);namespace App\Middleware;use Psr\Container\ContainerInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Message\ServerRequestInterface;…

【C语言】扫雷游戏完整代码实现

目录 1.game.h 2.game.c 3.progress.c 4.运行结果 1.game.h #define _CRT_SECURE_NO_WARNINGS#include <string.h> #include <stdio.h> #include <time.h> #include<stdlib.h>#define ROW 9 #define COL 9 #define ROWS 11 #define COLS 11 #defin…

SpringBoot 中配置处理

1、简介 本文介绍一些 springboot 配置管理相关的内容&#xff0c;如何自定义配置&#xff0c;导入配置&#xff0c;配置绑定和基于 profiles 的配置。 2、springboot 配置管理 2.1、自定义配置类 在 spring 中使用 Configuration 注解定义配置类&#xff0c;在 springboot 中…

904. 虫洞(spfa判断负环模板题)

904. 虫洞 - AcWing题库 农夫约翰在巡视他的众多农场时&#xff0c;发现了很多令人惊叹的虫洞。 虫洞非常奇特&#xff0c;它可以看作是一条 单向 路径&#xff0c;通过它可以使你回到过去的某个时刻&#xff08;相对于你进入虫洞之前&#xff09;。 农夫约翰的每个农场中包…

进程线程知识

一 初识linux线程 1 线程由来 我们之前说创建一个进程&#xff0c;要创建进程控制块pcb&#xff0c;进程地址空间&#xff0c;页表&#xff0c;而且我之前的博客中都有意无意的说明这个pcb是描述进程的&#xff0c;是os用来管理进程的&#xff0c;而有了线程后&#xff0c;就要…

Python基础第八篇(Python异常处理,模块与包)

文章目录 一、了解异常二、捕获异常&#xff08;1&#xff09;.异常案例代码&#xff08;2&#xff09;.读出结果 三、异常的传递&#xff08;1&#xff09;.异常传递案例代码&#xff08;2&#xff09;.读出结果 四、Python模块&#xff08;1&#xff09;.模块的导入&#xff…

大模型+自动驾驶

论文&#xff1a;https://arxiv.org/pdf/2401.08045.pdf 大型基础模型的兴起&#xff0c;它们基于广泛的数据集进行训练&#xff0c;正在彻底改变人工智能领域的面貌。例如SAM、DALL-E2和GPT-4这样的模型通过提取复杂的模式&#xff0c;并在不同任务中有效地执行&#xff0c;从…

k8s使用ingress实现应用的灰度发布升级

v1是1.14.0版本nginx ,实操时候升级到v2是1.20.0版本nginx&#xff0c;来测试灰度发布实现过程 一、方案&#xff1a;使用ingress实现应用的灰度发布 1、服务端&#xff1a;正常版本v1&#xff0c;灰度升级版本v2 2、客户端&#xff1a;带有请求头versionv2标识的请求访问版…

【MySQL】一文总结MVCC多版本并发控制

目录 MVCC 介绍当前读和快照读当前读快照读 MVCC 原理解析隐式字段Undo Log版本链Read ViewRead View 可见性原则 RC 和 RR 下的 Read ViewRC 下的 Read ViewRR 下的 Read View小结RR 级别下能否防止幻读总结 MVCC 介绍 在当今高度并发的数据库环境中&#xff0c;有效的并发控…

Element中的el-table中如何获取每一行的id

只需要用<template slot-scope"scope"></template >标签包裹起来即可 使用scope.row.列名&#xff0c;的方式获取当前行对应列的值 可以通过使用作用域插槽的方式获取每一行的id。以下是一个示例代码&#xff1a; <el-table-column prop"statu…

超级管理员权限绕过windows登录windows命令

文章目录 一、设置超级管理员权限二、绕过windows登录界面三、windows命令 一、设置超级管理员权限 查看本机的用户列表&#xff1a;net user激活超级用户&#xff1a;net user administrator /active:yes为超级用户设置密码&#xff1a;net user administrator 123(password)…

Redis 高可用之主从复制

1、简介 在 Redis 中&#xff0c;主从复制就是多个节点进行数据同步&#xff0c;在这些节点中&#xff0c;有 Master 和 slave 两个角色&#xff0c;Master 以写为主&#xff0c;slave 以读为主&#xff0c;当 Master 数据变化的时候&#xff0c;会自动将新的数据同步到其他的 …