JVM-垃圾回收

一、概念

垃圾回收是JVM的堆中管理内存的一种办法。JVM会在特定条件下回收无用的对象占用的内存空间。

二、判断垃圾的方法
1、引用计数法

这种判断某一对象是否是垃圾的方法的原理是:记录某个对象被引用的次数,如果引用次数是0说明是垃圾。但是有漏洞:如果两个对象互相引用,实际上这两个都是垃圾,但是由于引用次数大于0,因此永远都不会被回收。

2、可达性分析算法

原理是:从一组根对象作为起点,按照从上至下的方式搜索被根对象连接的对象是否可达。如果不可达,说明该对象是垃圾。可以作为根对象的是:虚拟机栈中引用的对象(如方法参数、局部变量等)、方法区中类静态属性引用的对象、常量引用的对象等。

三、五种引用
  1. 强引用:只要一个对象有强引用,那么就不会被垃圾回收
  2. 软引用:如果一个对象没有强引用,只有软引用。那么这个对象在发生垃圾回收且内存不足时会被垃圾回收
  3. 弱引用:如果一个对象没有强引用,只有弱引用。那么这个对象只要发生了垃圾回收就会被回收
  4. 虚引用:和弱引用的区别在于,虚引用必须配合引用队列使用。主要配合ByteBuffer使用,当被引用对象被回收时,会将虚引用入队,由Reference Handler线程调用虚引用相关方法释放直接内存。
  5. 终结器引用:无需手动编码,但其内部配合引用队列使用。在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结器引用找到被引用对象并调用他的finalize方法,第二次GC时才能回收被引用对象。
四、回收算法
1、标记清除算法

两个阶段:第一阶段先标记(根据上述的判断垃圾的算法),第二阶段再清除。优点是速度较片;缺点:会造成内存不连续,容易产生内存碎片。

2、标记整理法

也是先标记(根据上述的判断垃圾的算法),然后再整理,会将占用的内存移动到连续的位置。使剩下未使用的内存连续。整理这个动作涉及到内存的复制,以及地址的修改,所以会消耗一定的时间。

3、复制算法

把内存划分成FROM和TO两个区域,每次垃圾回收会把存活的对象由FROM区复制到TO区,然后会交换FROM和TO区。不会造成内存碎片,但是移动也需要消耗一定的时间。而且只能使用一半的内存。

五、分代回收

会将内存分为新生代和老年代,其中新生代又分为伊甸园,FROM区,TO区。当新生代内存空间不足时会发生一次Minor GC,会将伊甸园区存活的对象和FROM区的对象复制到TO区,这些存活的对象的年龄会加1,并交换FROM区和TO区。当一个对象在新生代存活的时间超过某个阈值后,会转移到老年代。

Minor GC会触发一次stop the world,即暂停其它线程,等待垃圾回收线程完成再启用其它线程。(因为垃圾回收涉及到对象的复制、移动)。当老年代空间不足时,会先触发Minor GC,如果之后空间仍然不足时,那么会触发Full GC,这种情况下STW的时间会更长。

六、垃圾回收器
  • 串行回收器:是单线程的回收器,适合堆内存比较小的,CPU核数少的个人电脑;若开启串行回收器,在新生代采用的是复制算法;在老年代采用的标记整理法;

        串行垃圾回收器主要分为两种:

  1. Serial收集器:这是Java虚拟机中最基本、发展历史最悠久的收集器。它是单线程的收集器,只使用一个CPU或一条收集线程去执行垃圾回收。在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。Serial收集器是客户端模式下的默认新生代收集器。

  2. Serial Old收集器:它是Serial收集器的老年代版本,也是单线程的。它同样在垃圾收集过程中需要暂停所有的应用线程。

  • 吞吐量优先的回收器:是多核的回收器,适合堆内存较大的,CPU核数多的机器;单位时间内STW的时间少;如0.2 0.2
  • 响应时间优先的回收器:是多核的回收器,适合堆内存较大的,CPU核数多的机器;尽可能让单次的STW的时间少;如0.1 0.1 0.1 0.1 0.1

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

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

相关文章

GameObject类API学习

GameObject类 GameObject类是Unity场景中所有实体的基类。一个GameObject对象通常由多个组件组成,且至少含有一个Transform组件。 1、GameObject类实例属性 在GameObject类中,实例属性有activeSelf和activeInHierarchy。 activeSelf属性:…

Spring与SpringBoot入门

Spring入门 要使用Spring最起码需要引入两个依赖: <!-- Spring Core&#xff08;核心&#xff09; --><dependency><groupId>org.springframework</groupId><artifactId>spring-core</artifactId><version>5.3.20</version>…

Linux内核定时器ioctrl实现对Led灯的控制

一. 简介 前面文章学习了 Linux内核提供的定时器来实现 Led灯的定时亮灭。文章地址如下: Linux内核定时器实现Led灯的定时亮灭说明二-CSDN博客 本文学习通过 应用程序调用 驱动,从而实现对 Led灯的控制。具体实现 ioctrl函数的驱动代码,从而控制 Led灯。 二. Linux内核定…

Unity3D 光照计算方向与法线贴图详解

前言 在Unity3D中&#xff0c;光照计算方向与法线贴图是实现高质量光照效果的重要技术之一。本文将详细介绍光照计算方向与法线贴图的原理和实现方法&#xff0c;并给出相应的代码示例。 对惹&#xff0c;这里有一个游戏开发交流小组&#xff0c;希望大家可以点击进来一起交流…

密码学系列(四)——对称密码2

一、RC4 RC4&#xff08;Rivest Cipher 4&#xff09;是一种对称流密码算法&#xff0c;由Ron Rivest于1987年设计。它以其简单性和高速性而闻名&#xff0c;并广泛应用于网络通信和安全协议中。下面是对RC4的详细介绍&#xff1a; 密钥长度&#xff1a; RC4的密钥长度可变&am…

Git,GitHub与GitLab分别是什么?有什么关系和区别?

Git 定义&#xff1a;Git 是一个分布式版本控制系统&#xff0c;用于跟踪文件的变化&#xff0c;并协助多人协作开发软件项目。作用&#xff1a;Git 可以在本地存储完整的项目历史记录&#xff0c;并允许开发者在不同的分支上进行独立的开发&#xff0c;最后将它们合并到主干分…

GPT 的基础 - T(Transformer)

我们知道GPT的含义是&#xff1a; Generative - 生成下一个词 Pre-trained - 文本预训练 Transformer - 基于Transformer架构 我们看到Transformer模型是GPT的基础&#xff0c;这篇博客梳理了一下Transformer的知识点。 BERT: 用于语言理解。&#xff08;Transformer的Encoder…

九州金榜|父亲在教育中的作用及重要性

随着社会进步&#xff0c;对比以前教育&#xff0c;现在父亲在教育中的作用越来越明显&#xff0c;孩子的教育离不开父亲&#xff0c;父亲在孩子教育中有什么作用&#xff1f;重要性又是什么呢&#xff1f;下面九州金榜家庭教育就带大家一起分析一下作为父亲&#xff0c;在孩子…

VUE3搭载到服务器

1.搭建服务器 使用 Windows 自带的 IIS 作为服务器。 步骤如下&#xff1a;https://blog.csdn.net/qq_62464995/article/details/130140673 同时&#xff0c;上面的步骤中&#xff0c;还使用了 cpolar 将 IIS 本地网址映射到公共网址。 注&#xff1a; cpolar客户端&#xf…

python模块百科_为高效而生_itertools【三】

python模块百科_为高效而生_itertools【三】 一、itertools --- 为高效而生二、无穷迭代器三、根据最短输入序列长度停止的迭代器3.6 groupby()3.7 islice()3.8 starmap()3.9 takewhile()3.10 tee() 一、itertools — 为高效而生 itertools — 为高效而生。itertools模块实现一…

Ant for Blazor做单个表的增删查改

Ant for Blazor做单个表的增删查改 2024年02月27日花了一天时间弄出来了&#xff0c;基本弄好了&#xff0c;vs2022blazor servernet8,引用的AntDesign版本是0.17.4 代码里的model和repository是用自己牛腩代码生成器生成的东西&#xff0c;sqlsugar的&#xff0c;记得在prog…

括号生成(力扣题目22)

题目描述&#xff1a; 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()&q…

Modern C++ std::any的实现原理

1. 前言 std::any 是 C17 中引入的一个新特性&#xff0c;它是一个类型安全的容器&#xff0c;可以在其中存储任何类型(但此类型必须可拷贝构造)的值&#xff0c;包括基本类型、自定义类型、指针等。相比于void* 指针&#xff0c;std::any 更为类型安全&#xff0c;可以避免由…

NC65 rest接口 开发 NC65接口开发

一、在对应模块META-INF下编写 xxx.rest 文件,也要放在Home里对应的目录下。 二、开发接口&#xff0c;继承extends AbstractUAPRestResource&#xff0c;&#xff08;有的项目会继承别的方法如&#xff1a;AbstractNCCRestResource&#xff0c;MTFRestResource&#xff1b;有…

网络安全面试题

1. Http 状态码&#xff0c;Http2 是什么 答案&#xff1a; 200 欢迎回来&#xff0c;主人 &#xff08;正常&#xff1b;请求已完成。&#xff09; 301 人家搬家了 &#xff08;已移动 — 请求的数据具有新的位置且更改是永久的。&#xff09; 307 不是这里&#xff0c;换个…

使用 kubeadm 部署k8s集群

一、所有节点系统初始化 1、常规初始化 2、内核版本升级以及内核限制文件参数修改 还可以考虑将旧版本的内核卸载 二、准备nginx负载均衡器和keepalived nginx四层代理&#xff1a; keepalived配置&#xff1a; nginx检测脚本&#xff1a; 三、所有节点部署docker&#xff0c…

SQL函数学习记录

聚合函数 函数是编程语言的基础之一&#xff0c;在对数字的运算中&#xff0c;我们用的最多的就是聚合函数&#xff0c;本篇接下来就详细阐述下SQL中聚合函数的运用。 什么是聚合函数&#xff08;aggregate function&#xff09;&#xff1f; 聚合函数指的是对一组值执行计算…

2023秋季飞书未来无限大会--随笔

这个时代的飞书 数字时代 工作协同平台 AI时代 帮助企业和个人用好AI 企业如何引用大模型能力&#xff1f; 智慧体— 接近人&#xff0c;有进步空间智能伙伴 用时代的科技打造爱不释手的好产品 移动互联网 – 改变信息分发方式 大模型 –自然的人机交互方式 业务协同 …

如何使用便签快速分类工作待办事项

在日常工作和生活中&#xff0c;我们经常需要处理各种各样的待办事项。而有效地分类这些任务&#xff0c;可以帮助我们更好地管理时间和提高工作效率。使用便签是一种简单而实用的方法&#xff0c;下面将介绍如何利用好用便签来快速分类工作待办事项。 首先&#xff0c;你可以…

【数据结构和算法初阶(C语言)】链表-单链表(手撕详讲单链表增删查改)

目录 1.前言&#xff1a;顺序表回顾&#xff1a; 1.1顺序表的优缺点 2.主角----链表 2.1链表的概念 2.2定义一个单链表的具体实现代码方式 3.单链表对数据的管理----增删查改 3.1单链表的创建 3.2单链表的遍历实现 3.2.1利用遍历实现一个打印我们链表内容的函数的函数…