初步认识Java垃圾回收算法

GCRoot指被栈上直接或间接引用的对象,或被本地方法栈直接或间接引用的对象,或被方法区引用的对象。
被引用的对象是不能被删除的。
如果对象跟GCRoot并没有直接或间接相连的关系,那么这些对象就可以被删除了。

标记-清理:将需要删除的对象标记一下,标记完了再扫描一遍,把含有标记的对象删掉。缺点:内存碎片
标记-整理:在清除这个位置的垃圾之后,后面的对象要补上来。缺点:对象前移,代价大
复制:将内存一分为二,假设叫一区,二区。首先在一区创建这些对象,然后去打标记,标记是否需要被删除,等到一区快满了的时候,并不将标记对象删除,而是将不需要删除的对象复制到二区,并且是紧凑复制,这样避免了内存碎片,需要删除的就不复制到二区了。这样开销也不大,因为每次只需要复制一个对象,不需要移动所有对象。缺点:2倍内存

GC过程是怎样的呢?

Young区:
对象都会在E区出生,当E区快满的时候就会触发GC,这个GC只是Young区域的GC,所以也叫Young GC。
Young GC采用复制算法,当E区快满的时候会把需要删除的对象打上标记,不需要删除的依次复制到S0区。

S区和E区的大小比例是S0:S1:E=1:1:8,这是因为对象朝生夕死,幸存下来的比较少。

两块S区是交替工作的。等到E区快满了之后,对E区对象进行打标,将不需要删除的对象复制到S0区,之后将E区和S1区的对象全部删除。
等下次E区快满了之后,再将S0区和E区的对象全部打标,将不需要删除的对象全部复制到S1区。
S0和S1交替使用作为幸存下来的区域,它比直接将内存一分为二的利用率高一些。
E+S1复制到S0,E+S0复制到S1,E+S1复制到S0,… 如此往复

Old区:
每一次Young GC,如果对象活下来了,它的年龄就会加1,直到它满了6岁,就不往S区复制了,直接到Old区了。原因是如果一个对象6次Young GC都没清理掉,那它可能存在很长一段时间,直接把它放到Old区来维护,省的每次都在S区复制了。
Old区除了存一些年龄大的对象,还会存一些大对象,大对象指的是对象占用的内存大。
等到Old区快满了,也会触发GC,这个GC叫做Old GC,Old GC同时会伴随着Young GC,所以它又叫Full GC。Full GC会引起 Stop The World,Stop The World就是整个Java程序暂停,全力的来进行垃圾回收,垃圾回收主要使用标记-清理 或 标记-整理 的算法。
现在我们明确了,标记-清理、标记-整理 主要用于Full GC,复制 主要用于Young GC。
年轻代比较有名的垃圾收集器是ParNew,老年代是CMS,他们分别用了复制算法和标记-清理算法来进行垃圾回收。新版的jdk已经不建议用以前的垃圾收集器了,而是使用了全新的G1垃圾收集器

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

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

相关文章

基于FPGA的RC滤波器设计实现

目录 简介: 传递函数 FPGA代码实现 总结 简介: RC滤波器的特性基本情况介绍 RC一阶低通滤波介绍;RC滤波器电路简单,抗干扰性强,有较好的低频性能,并且选用标准的阻容元件易得,所以在工程测…

GAMES101 笔记 Lecture08 Shading 2(Shading, Pipeline and Texture Mapping)

目录 Specular Term(高光项)Ambient Term(环境光照项)Blinn-Phong Reflection ModelShading Frequencies(着色频率)Shade each triangle(flat shading)在每个三角形上进行着色Shade each vertex (Gouraud shading)(顶点着色)Shade each pixel (Phong shading)Defining Per-Vert…

ES基本操作(JavaAPI篇)

引入jar包依赖 <dependencies><dependency><groupId>org.elasticsearch</groupId><artifactId>elasticsearch</artifactId><version>7.8.0</version></dependency><!-- es客户端 --><dependency><groupI…

Loadrunner怎么实现MD5加密

目录 前言&#xff1a; 1、写一个md5.h文件&#xff0c;将其放入脚本路径下 2、在globals.h中加入#include “md5.h” 3、在Action中写脚本&#xff0c;脚本示例如下&#xff1a; 前言&#xff1a; 在 LoadRunner 中实现 MD5 加密可以通过使用 LoadRunner 提供的函数来完成…

【FPGA零基础学习之旅#9】状态机基础知识

&#x1f389;欢迎来到FPGA专栏~状态机基础知识 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指正…

macOS Ventura 13.5beta4(22G5059d)发布

系统介绍 黑果魏叔 6 月 28 日消息&#xff0c;苹果今日向 Mac 电脑用户推送了 macOS 13.5 开发者预览版 Beta 4 更新&#xff08;内部版本号&#xff1a;22G5059d&#xff09;&#xff0c;本次更新距离上次发布隔了 12 天。 macOS Ventura 带来了台前调度、连续互通相机、F…

TypeScript ~ 掌握基本类型 ②

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; TypeScript ~ TS &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &…

SQL-每日一题【182.查找重复的电子邮箱】

题目 表: Person 编写一个 SQL 查询来报告所有重复的电子邮件。 请注意&#xff0c;可以保证电子邮件字段不为 NULL。 以 任意顺序 返回结果表。 查询结果格式如下例。 示例 1: 解题思路 前置知识 count&#xff08;&#xff09; 1.count(*) &#xff1a;统计所有的行数&a…

软考01进制转换

文章目录 前言一、二进制1.二进制转十进制2.二进制转十六进制 二、十进制1.十进制转二进制2.十进制转十六进制 二、十六进制1.十六进制转二进制2.十六进制转十进制 总结 前言 比较常用的进制有二进制、十进制、十六进制这是我们的主要学习目标。 一、二进制 二进制由0和1组成&…

单表-DQL

注意&#xff1a;这张图还包含了对于的顺序&#xff0c;先分组再排序&#xff0c;再分页&#xff0c;顺序不能乱 基本查询 # 1.基本查询 # 查询全部行 select * from tb_emp; select id, user_name, password, name, gender, image, job, entry_date, create_time, update_ti…

ZLMediaKit 的安装及使用介绍

ZLMediaKit 介绍 ZLMediaKit是一个基于C开发的开源流媒体服务器。它提供了高性能的音视频处理能力&#xff0c;支持常见的流媒体协议&#xff0c;如RTSP、RTMP、HLS和HTTP-FLV&#xff0c;并且具有低延迟和高并发处理能力。 开源地址&#xff1a;https://github.com/xia-chu/…

【JAVA】十分钟带你了解java的前世今生

个人主页&#xff1a;【&#x1f60a;个人主页】 系列专栏&#xff1a;【初始JAVA】 文章目录 前言JAVA介绍诞生&#x1f52c;名字与图标&#x1f916;发展&#x1f6e9;️未来&#x1fa84; 前言 玩过我的世界的朋友想必对JAVA以及它的图标都很熟悉&#xff0c;在游戏开始画面…