熟悉GC常用算法,熟悉常见垃圾收集器,具有实际JVM调优实战经验

news2024/11/17 13:57:04

程序的栈和堆

栈先进后出,且里面的数据自动释放,
堆内的空间则需要手动释放

java python go

只管创建,不用像c,c++需要手动释放空间,
因为他们都会开一个进程GC(Garbage Collector),由垃圾回收器来复制回收

如何分辨什么是垃圾?如何定位垃圾

Java使用的方法是RootSearching,例如main方法的根开始,往下走,只要能通的空间,就不是垃圾,走不通的且存在的空间都是垃圾

常用的垃圾回收算法和垃圾回收器

三种垃圾回收算法

Mark-Sweep(标记清除)

原来是垃圾的部分,标记可用(清掉垃圾),则该部分就可以等待使用了,但容易碎片化

Copying(拷贝)

就把与根相关的空间存储到另一片区域,然后这部分区域全部清除,但太浪费内存了

Mark-Compact(标记压缩)

把与根相关的空间,按序排好,其余清掉,效率最低

三种算法的综合运用,产生了各式各样的垃圾回收器

GC

在这里插入图片描述
前6种垃圾回收期应用堆内存分为两代的情况,后四种堆内存分为多块

随着内存大小的不断增长而演进

GC方式一:堆内存逻辑分区,分代(青年代,老年代)

在这里插入图片描述
进程一创建先放入eden,然后进行第一次垃圾清除,如果没有清除,则转入survivor,再一次清除则又放入第二个survivor,两个survivor来回存放和清除且记录次数,当到达某个次数,则可以进入老年代,老年代中的空间不会每次都进行垃圾清除。
新生代大量死去,少量存活,采用赋值算法
老年代存活率高,回收较少,采用MC或MS

垃圾回收器:Serial and Serial Old(GC)(内存只有几兆-几十兆)

STW规则,当要进行垃圾清除时,所有进程停止活动,直到垃圾清除完毕,
Serial(应用在新生代)Serial Old,采用mark-sweep-compact i(也是垃圾回收器,应用在老年代) 都是单垃圾回收进程

垃圾回收器:Parallel Scavenge and Parallel Old(GC)(并行多线程)(几十兆-上百兆)

Parallel Scavenge在新生代 Parallel Old 在老年代
多个线程同时处理垃圾
jdk1.8默认垃圾回收器,就是这两个,简称ps + po

垃圾回收器:Concurrent (GC)

这种情况 GC线程和业务线程可以同时执行
CMS 、ParNew、G1、ZGC、Shenandoah都熟悉Concurrent;

CMS

CMS工作在老年代,可以与初生代中的Serial和ParNew搭配使用
常常CMSParNew(工作在年轻的多线程垃圾回收器,是增强的Parallel Scavenge,就是为了配合CMS使用)

三色标记算法
第一轮垃圾扫描,如果当前节点扫描后且孩子节点也扫描,则标记为黑色,如果只扫描了当前节点,没有扫描它的孩子节点,则标记为灰色,如果当前节点没扫描过,则标记为白色。

CMS方案(Incremental Update):黑色节点,下次垃圾回收线程再扫描时,就不会再扫描了,当黑色节点又指向新节点时,需从黑色改为灰色,这样才能扫描到白色新节点。

Epsilon jdk11产生

什么都不做,只是做内存记录,帮助程序员debug用

G1(摈弃年轻代和老年代,改为分区算法)

物理不分为两个大代,分为多个区,但在逻辑上,存储依然是年轻代和老年代,每个小分区所处的逻辑位置不是固定的,当某个小区域满时,则GC扫描该小区域,把不是垃圾复制到另外一个小区域,清除该小区域。

G1方案(SATB),也是三色标记,但与CMS不同,当第一次扫描后,由于白色没扫到,可能会被当成垃圾,所有把灰色与白色之间的引用做一个记录,放入到GC的堆栈,则下次再扫描时,会看看记录表,这样就不会把区域当成垃圾了

整个区域会有一片区域作为RSET,记录有效的引用

ZGC

颜色指针
分页,不分老年代和年轻代,所有分区都一样,快要满的分区则清除

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

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

相关文章

从早吃到晚,才是我对旅行目的地最大的尊重

点击文末“阅读原文”即可收听本期节目剪辑、音频 / 卷圈 编辑 / SandLiu 卷圈 监制 / 姝琦 文案 / 粒粒 封面 / midjourney 产品统筹 / bobo 场地支持 / 声湃轩北京录音间摊牌吧,承认吧,有些地方,你就是冲着吃东西才去的,旅…

【python】main方法教程

嗨害大家好鸭! 我是小熊猫~ 首先 if name "main": 可以看成是python程序的入口, 就像java中的main()方法, 但不完全正确。 事实上python程序是从上而下逐行运行的, 在.py文件中, 除…

CSS数据类型以及符号

css数据类型定义的是css属性中具有代表性的值&#xff0c;在规范的语法格式中&#xff0c;使用关键字外加一对 <和>表示&#xff0c;例如数值类型<number>、色值类型<color>等。 举个例子&#xff1a;background-image这个css属性语法结构如下&#xff1a; …

【汇编】二、预备知识(一只 Assember 的成长史)

嗨~你好呀&#xff01; 我是一名初二学生&#xff0c;热爱计算机&#xff0c;码龄两年。最近开始学习汇编&#xff0c;希望通过 Blog 的形式记录下自己的学习过程&#xff0c;也和更多人分享。 这篇文章主要讲述学习汇编所需的基础知识。 话不多说~我们开始吧&#xff01; 目…

电信网上用户自管理系统的设计与实现

技术&#xff1a;Java等摘要&#xff1a;当今时代随着科技的飞速发展&#xff0c;用户信息的收集处理变得非常重要&#xff0c;因此用户自管理系统模式正迅猛发展并深入到各行各业中。在这个新的时代下&#xff0c;要求程序设计员能根据不同行业、不同需求的特点&#xff0c;来…

Spring MVC 源码- RequestToViewNameTranslator 组件

RequestToViewNameTranslator 组件RequestToViewNameTranslator 组件&#xff0c;视图名称转换器&#xff0c;用于解析出请求的默认视图名。就是说当 ModelAndView 对象不为 null&#xff0c;但是它的 View 对象为 null&#xff0c;则需要通过 RequestToViewNameTranslator 组件…

Flink高手之路1一Flink的简介

文章目录一、Flink简介1. Fink的引入2.Flink简介3.支持的编程语言4.Flink的特性5.Flink四大基石6.批处理和流处理二、Flink的架构1.Flink的角色2.编程模型一、Flink简介 1. Fink的引入 大数据的计算引擎&#xff0c;发展过程有四个阶段 第一代&#xff1a;Hadoop的MapReduce…

如何确定RocketMQ中消费者的线程大小

背景 随着物联网行业的发展、智能设备数量越来越多&#xff0c;随着设备活跃量过大&#xff0c;常常存在一些高并发的请求&#xff0c;形成了流量尖峰&#xff0c;过多的请求会压垮服务器&#xff0c;影响其他服务运行。因此&#xff0c;为了保护云端服务&#xff0c;需要对请求…

KALOS.art AI 作品每周精选 006

KALOS.art —— AI 和 数字艺术作品展示及销售平台。创作者们可以在这创建自己的主页和画廊&#xff0c;收取充电打赏、以图库模式出售作品。爱好者们可以在这里探索发现&#xff0c;购买作品图片&#xff08;带商用授权&#xff09;&#xff0c;跟艺术家们开启私信通道交流。具…

在外包公司熬了 3 年终于进了字节,竭尽全力....

其实两年前校招的时候就往字节投了一次简历&#xff0c;结果很明显凉了&#xff0c;随后这个理想就被暂时放下了&#xff0c;但是这个种子一直埋在心里这两年除了工作以外&#xff0c;也会坚持写博客&#xff0c;也因此结识了很多优秀的小伙伴&#xff0c;从他们身上学到了特别…

云镜CVE-2021-44983复现

CVE-2021-44983复现漏洞信息漏洞复现读取flag&#x1f349; shell来源&#xff1a;https://yunjing.ichunqiu.com/cve/detail/967?type1&pay2漏洞信息 漏洞名称taocms 3.0.1 登陆后台后文件管理处存在任意文件下载漏洞漏洞编号CVE-2021-44983危害等级中危漏洞类型任意文…

大学毕业后,送了2个月外卖,哭了一整晚

先简单介绍一下自己&#xff0c;我来自湛江&#xff0c;大学学的的物流管理专业&#xff0c;现在就职于一家互联网公司&#xff0c;从事软件测试工作。 我来自湛江的一个偏远农村&#xff0c;家里兄弟姐妹多&#xff0c;父母无力负担我的学费&#xff0c;很多时候学费都是靠姐…

戴尔Latitude 3410电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。硬件型号驱动情况主板戴尔Latitude 3410处理器英特尔酷睿i7-10510U已驱动内存8GB已驱动硬盘SK hynix BC511 NVMe SSD已驱动显卡Intel UHD 620Nvidia GeForce MX230(屏蔽)无法驱动声卡Realtek ALC236已驱动网卡Realtek RTL81…

哈希表以及哈希冲突

目录 哈希表 哈希冲突 1. 冲突发生 2. 比较常见的哈希函数 3. 负载因子调节(重点) 散列表的载荷因子概念 负载因子和冲突率的关系 冲突-解决-闭散列 线性探测 二次探测 冲突-解决-开散列 结尾 我们在前面讲解了TerrMap&#xff08;Set&#xff09;的底层是一个搜索…

雅思经验(十四)

剑10 test3 阅读p3这篇阅读比较难做下来&#xff0c;主要是这个题材我们不太熟悉&#xff0c;介绍了一种成为拉皮塔人&#xff0c;他们在太平洋上航行&#xff0c;很多岛屿上都有他们足迹&#xff0c;后来人们发掘、探索他们的历史的故事。1.derelict 与 abandoned 主要是前面的…

Mysql 语句优化 (Explain)

Mysql 语句优化 &#xff08;Explain&#xff09; 1. 概述 ​ 在 select 语句之前增加 explain 关键字&#xff0c; mysql 会在查询上设置一个标记&#xff0c;返回查询执行计划信息&#xff0c;而不是执行这条sql 字段formatjson时的名称含义idselect_id该语句的唯一标识sel…

图形编辑器:拖拽阻塞优化

大家好&#xff0c;我是前端西瓜哥。在图形编辑器中&#xff0c;想象这么一个场景&#xff0c;我们撤销了一些重要的操作&#xff0c;然后想选中一个图形&#xff0c;看看它的属性。你点了上去&#xff0c;然后你发现你再也无法重做了。 你以为你点了一下&#xff0c;但其实你…

Java知识复习(七)常见的设计模式(装饰、代理、观察、策略、建造)

前言 参考书籍&#xff1a;《秒懂设计模式》 1、装饰器模式&#xff08;Decorator&#xff09; 1、装饰器模式&#xff1a;对原始对象动态地进行“包装”&#xff0c;是对类实例“装饰”的结果&#xff1b;类似于继承的效果&#xff0c;但这个过程是动态的&#xff0c;是可设…

Java基础常见面试题-异常-泛型-反射-注解-SPI-序列化-IO流

Java基础常见面试题-异常-泛型 1 Exception 和 Error 有什么区别&#xff1f; 1**Exception** :程序本身可以处理的异常&#xff0c;可以通过 catch 来进行捕获。Exception 又可以分为 Checked Exception (受检查异常&#xff0c;必须处理) 和 Unchecked Exception (不受检查异…

构建系统发育树简述

1. 要点 系统发育树代表了关于一组生物之间的进化关系的假设。可以使用物种或其他群体的形态学&#xff08;体型&#xff09;、生化、行为或分子特征来构建系统发育树。在构建树时&#xff0c;我们根据共享的派生特征&#xff08;不同于该组祖先的特征&#xff09;将物种组织成…