JVM(4)

垃圾回收问题

垃圾回收算法

通过之前的学习我们可以将死亡对象标记出来了,标记出来后我们就可以进行垃圾回收操作了,在正式学习垃圾处理器之前,我们先来看一下垃圾回收器使用的几种算法.

标记-清除算法

"标记-清除"算法是基础的收集算法.算法分为"标记"和"清除"两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收所有被标记的对象.后续的收集算法都是基于这种思路加以改造并对其不足加以改进而已:

"标记-清除"算法的不足主要有两个:
1.效率问题:标记和清除这两个过程的效率都不高.

2.空间问题:标记清除后会产生大量不连续的内存碎片,内存碎片太多可能会导致以后在程序运行中需要分配较大对象时,无法找到足够连续内存而不得不提前触发另一次垃圾收集.

 

 复制算法

 "复制算法是为了解决"标记-清理"的效率问题.它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块.当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉.这样做的好处是每次都对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂的情况,只需要移动堆顶指针,按顺序分配即可.此算法实现简单,运行高效.算法的执行流程如下图:

通过复制算法这种机制确实能在一定程度上规避内存问题,但也有一定缺陷.

1.总的可用内存,变少了.

2.如果每次要复制的对象比较多,此时复制的开销比较大,需要的是当前一轮(当中,大部分对象被释放,少数对象存活,在这个时候最适合复制). 

现在的商用虚拟机(包括HotSpot都是采用这种收集算法来回收新生代)

引入概念:对象的年龄.JVM有专门的线程负责扫描/释放一个对象,如果被线程扫描的时候,可达了(不是垃圾), 年龄+1 =>在对象类中存储年龄.

 新生代中98%的对象都是"朝生暮死"的,所以不需要按照1:1的比例来划分内存空间,而是将内存(新生代内存)分为一块较大的Eden(伊甸园)空间和两块较小的Survivor(幸存者空间),每次使用Eden和其中一块Survivor(两个Survivor区域一个称为from区,另一个称为To区).当回收时,将Eden和Survivor中还存活的对象一次性复制到另一块Survivor空间上,最后清理掉Eden和刚才用过的Survivor的空间.

当Survivor空间不够用的时候,需要依赖其它内存(老年代)机型分配担保.

HotSpot默认Eden与Survivor的大小比例是8:1,也就是说:Eden : Survivor From : Survivor To = 8:1:1.所以每次新生代的可用空间为整个新生代容量的90%,而剩下的10%用来存放回收后存活的对象.

下面来看一下具体的算法执行流程:

(1)当代码中new出一个对象,这个对象就是被创建在伊甸区的,伊甸区能有很多对象.一个经验规律:伊甸区的对象都是"朝生暮死"的,生命周期非常短.

(2)第一轮GC扫描完成之后,少数伊甸区中幸存的对象就会通过算法拷贝到生存区,后续GC扫描线程还会持续进行扫描,不仅会扫描伊甸区,也会扫描生存区的对象,生存区中也有大量对象被标记为垃圾,少数存活的,就会使用算法,拷贝到另一个生存区中.只要这个能够在生存区中继续存活,就会被复制算法,拷贝到另一个生存区中,每经过一次GC扫描,对象年龄+1

(3) 如果该对象存储在生存区中,经历了若干轮GC依然健在,JVM就会认为,这个对象生命周期大概率会很长,就把这个对象从生存区拷贝到老年代.

(4)老年代对象,也会被GC扫描,但是扫描的频次大大降低.

(5)当对象在老年代中寿终正寝的时候,JVM按标记整理的方式,进行清除.

标记-整理算法

复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低.因此老年代一般不能使用复制算法.

针对老年代的特点,提出了一种称之为"标记-整理算法".标记过程仍与"标记-清除"的过程一致,但后续的步骤不是直接对可回收对象进行整理,而是让所有存活对象都向一端移动,然后清理掉边界以外的内存.流程图如下:

 

 分代算法

分代算法和上面讲的三种算法不同,分代算法是通过区域的划分,实现不同区域和不同的垃圾回收策略,从而实现更好的垃圾回收.就好比中国的一国两制方针一样,对于不同的情况和地域设置更符合当地的规则,从而实现更好的管理,这就是分代算法的设计思想.

当前JVM垃圾收集器采用的是"分代收集"算法,这个算法并没有新思想,只是根据对象的存活周期的不同将内存划分为几块.一般是把Java堆分为新生代和老年代.在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高,没有额外空间对它进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法.

哪些对象会进入新生代?哪些对象会进入老年代?

新生代:一般创建的对象都会进入新生代;

老年代:大对象经历了N次(默认情况下是15次)垃圾回收依然存活下来的对象会从新生代移动到老年代.

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【LeetCode】876_链表的中间结点_C

题目描述 给你单链表的头结点 head &#xff0c;请你找出并返回链表的中间结点。 如果有两个中间结点&#xff0c;则返回第二个中间结点。 https://leetcode.cn/problems/middle-of-the-linked-list/description/ 示例 提示&#xff1a; 链表的结点数范围是 [1, 100]1 <…

113.龙芯2k1000-pmon(12)- pmon源码对env的解析

本文回答前文思考的问题 112.龙芯2k1000-pmon&#xff08;11&#xff09;- gzrom-dtb.bin 文件的组成-CSDN博客 env写的位置是ff000 后面的500字节&#xff0c;这个位置能否改动呢&#xff1f; 答案是&#xff1a;不可以&#xff01;&#xff01;&#xff01; 否则需要改源码…

flink下载安装部署说明

下载 下载地址 flink-1.16.2下载安装包&#xff0c;flink-1.16.2-bin-scala-2.12.zip资源-CSDN文库 安装 解压目录 启动集群 ./start-cluster.sh 提交作业 ./bin/flink run examples/streaming/WordCount.jar 查看日志 停止集群 ./bin/stop-cluster.sh 开启webui vim c…

adb下载安装及使用教程

adb下载安装及使用教程 一、ADB的介绍1.ADB是什么&#xff1f;2.内容简介3.ADB常用命令1. ADB查看设备2. ADB安装软件3. ADB卸载软件4. ADB登录设备shell5. ADB从电脑上发送文件到设备6. ADB从设备上下载文件到电脑7. ADB显示帮助信息 4.为什么要用ADB 二、ADB的下载1.Windows版…

Components 概览

Components 概览 Compose 中的组件被声明为 Composable &#xff0c;中文意思是可组成的/可合成&#xff0c;也为了与原来 xml 和 View&#xff08;ViewGroup&#xff09;做出区分。在使用过程中会体会到&#xff0c;使用 Compose 声明 UI 更像是在拼图。 Compose 提供了 Mat…

2024年sCrypt编程马拉松即将开幕

BSV区块链的建设者们&#xff0c;你们在哪&#xff1f;2024年sCrypt编程马拉松即将拉开帷幕&#xff01; 2024年3月16日至17日&#xff0c;我们将在旧金山市举办一场以比特币智能合约&#xff08;即 sCrypt&#xff09;和比特币通证&#xff08;如Ordinals&#xff09;相结合为…

jstat命令查看jvm的GC信息

文章目录 前言jstat命令查看jvm的GC信息1. 概述2. 应用堆内存水位阀值大小怎么确定3. 使用 jps 命令查看 Java 进程的进程号&#xff08;PID&#xff09;![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/5097401443314e9d808a83b694dbc6e5.png)4. jstat用法5. 类加载…

农产品质量追溯系统—简介

概要 农产品质量安全事关广大人民群众的食用安全和身体健康。解决农产品质量安全问题,需要从源头开始抓好、抓实农产品安全监管工作。通过建立从产地到市场的全程质量控制系统和追溯制度,对农产品产地环境、生产过程、产品检测、包装盒标识等关键环节进行监督管理,提高广大…

php 把数字转化为大写中文

1. 120002129.25 转化后壹億贰仟萬贰仟壹佰贰拾玖圆贰角伍分2. 12000.2145 转化后壹萬贰仟圆贰角壹分肆厘伍毫3. 1020001211 转化后壹拾億贰仟萬壹仟贰佰壹拾壹圆整大致思路这样的: 从小数点分割成两部分,整数部分和小数部分分别处理。 整数四个一组进行处理,用substr函数分…

SpringBoot 事务失效及其对应解决办法

简介 本文主要讲述Spring事务会去什么情况下失效及其解决办法 Spring 通过AOP 进行事务控制&#xff0c;如果操作数据库报异常&#xff0c;则会进行回滚&#xff1b;如果没有报异常则会提交事务&#xff1b;但是&#xff0c;如果Spring 事务失效&#xff0c;会导致数据缺失/重…

几个原创文章自动生成软件推荐

在数字化时代&#xff0c;原创文章的重要性越来越被重视&#xff0c;但是频繁的写作工作却也耗费大量时间和精力。原创文章自动生成软件能够帮助大家快速生成各种类型的原创文章&#xff0c;节省时间和精力。本文将介绍6款不同的原创文章自动生成软件&#xff0c;并介绍一款知名…

mysql 常用命令练习

管理表格从表中查询数据从多个表查询修改数据sql变量类型 管理表格 创建一个包含三列的新表 CREATE TABLE products (id INT,name VARCHAR(255) NOT NULL,price INT DEFAULT 0,PRIMARY KEY(id) // 自增 ); 从数据库中删除表 DROP TABLE product; 向表中添加新列 ALTER TAB…

WPF中如何设置自定义控件

1.圆角按钮的设置&#xff1a; 众所周知在WPF中自带有提示信息&#xff0c;当我问创建Button时&#xff0c;点击空格出现如下可选设置 带有小扳手&#x1f527;图标为相应的属性&#xff0c;如果Button有CornerRadius&#xff08;角半径&#xff09;属性就能够直接设置Button实…

记录 android studio 通过安装NDK 编译C文件,得到需要的so文件

只怪自己太健忘&#xff0c;每次网上查了一圈&#xff0c;搞定后&#xff0c;再遇到又发现不会操作了&#xff0c;特此记下 不废话直接上步骤 &#xff08;1&#xff09; 进入AS的settinging如下界面 &#xff08;2&#xff09;选中图片箭头两个文件 进行下载 &#xff08;…

Jmeter分布式部署

前期准备&#xff1a; 1. 控制机一台&#xff0c;代理机一台&#xff0c;Jmeter安装包 操作步骤&#xff1a; 1. Linux安装Jmeter&#xff08;windows安装教程自己搜一下&#xff09; 1.1创建一个单独的文件夹(jmeter)&#xff0c;用来存放Jmeter的安装包 mkdir jmeter 1.2…

docker安装使用基础

一、镜像安装 我的docker安装在centos7虚拟机上&#xff08;关于虚拟机网络设置此前已有总结VMware 搭建centos虚拟机网络设置_vmware centos 网络配置-CSDN博客&#xff09;&#xff0c;现在默认操作系统和网络已就位。 1、安装工具包 # 安装操作一般都需要管理员权限&…

【leetcode】 剑指 Offer学习计划(java版本含注释)(下)

目录 前言第十六天&#xff08;排序&#xff09;剑指 Offer 45. 把数组排成最小的数&#xff08;中等&#xff09;剑指 Offer 61. 扑克牌中的顺子&#xff08;简单&#xff09; 第十七天&#xff08;排序&#xff09;剑指 Offer 40. 最小的k个数&#xff08;简单&#xff09; 第…

STL常见容器(set/multiset)---C++

STL常见容器目录&#xff1a; 7. set/multiset 容器7.1 set/multiset 基本概念7.2 set构造和赋值7.3 set大小和交换7.4 set插入和删除7.5 set查找和统计7.6 set和multiset区别7.6.1 pair对组创建7.6.2 set和multiset区别 7.7 set容器排序7.7.1 内置数据类型7.7.2 自定义数据类型…

记录 关于navicat连接数据库报错1045的问题

重装数据库之后就连接不上了 报错1045 而网上的解决方案大都是更改数据库密码&#xff0c;但是我在第一步就被卡住无法更改密码&#xff0c;输入指令也报错&#xff0c;检查的环境变量也没错&#xff0c;经过长时间的试错终于找到解决了办法 解决办法 删除data文件夹 如果无法…

吸引用户购买产品的文案技巧,媒介盒子揭秘

在营销过程中&#xff0c;想要吸引用户购买产品&#xff0c;文案是重中之重&#xff0c;需要一定的技巧才能将文案写好&#xff0c;今天媒介盒子就来和大家聊聊&#xff1a;在品牌推广中如何通过一些小技巧吸引用户购买产品&#xff1a; 一、 少说专业术语 少说行话、黑话。多…