JavaEE- JVM八股文(JVM垃圾回收机制GC)

news2024/11/18 10:42:49

JVM垃圾回收的目标:主要针对内存中的堆空间进行垃圾回收。

Java中,大量的内存都在堆中。

程序计数器:固定大小,不涉及释放
栈:函数执行完毕,对应栈的空间就自动释放了,不需要垃圾回收
方法区:类对象加载时申请内存,类卸载时释放内存。操作低频,不涉及垃圾回收。


JVM将堆分为三块空间

  1. 正在使用的内存。
  2. 不在使用,但是尚未回收的内存
  3. 未分配的内存。

正在使用的内存一定不能释放。
而不在使用,但是尚未回收的内存中,一定需要回收。
一部分仍在使用的对象,一部分不在使用的对象,不进行回收。
垃圾回收的基本单位是对象而不是字节。


垃圾回收的步骤:

  1. 判定不使用的内存:

    Ⅰ基于引用计数:非Java中采用方案(Python)

     针对每个对象,额外引入一块内存,保存这个对象有多少个引用指向它。
     当引用计数为0是就需要释放这块内存。
    
     缺点:
     1. 空间利用率低每个对象都有计数器,对象比较小时,计数器占用空间比例大
     2. 会出现类似C++智能指针的循环引用问题。
    
     优点:简单容易实现。
    

    Ⅱ基于可达性分析:JVM采取的方案

     通过额外的线程,定期针对整个内存空间进行扫描。
     从GCRoots,类似深度优先遍历,将可以访问的对象进行标记。没有被标记的对象就是不可达,需要释放的空间。
     
     GCRoots包括:
     	1. 栈上的局部变量
     	2. 常量池中引用指向的对象.
     	3. 方法区中的静态成员指向的对象.
    
     缺点:如果内存中的对象特别多,这个遍历会很慢。系统开销大
     
     优点:克服了引用计数的两个缺点。
    
  2. 释放垃圾内存:三种基本策略

    Ⅰ标记-清除:可达性分析+直接释放内存

     注意:如果直接释放内存,不同对象被释放可能会导致内存碎片。
     
     为了解决内存碎片,引入了复制算法:
     将整体内存分为两部分,释放内存时,将需要保存的数据连续复制到另一半内存上,释放内存直接释放一般内存。这样解决了内存碎片。
     复制算法问题:
     	1. 内存利用率低
     	2. 复制开销大
    

    Ⅱ 标记-整理:类似于顺序表删除中间元素,会将后面的元素拷贝到中间的内存碎片,从而解决内存碎片

     缺点:
     1. 搬运元素开销大。
    

    Ⅲ分代回收:对上述方案就行结合

     根据垃圾回收周期将对象进行分类:
     
     	一个对象经过一轮GC扫描,这个对象的垃圾回收周期+1
    
     针对不同时间周期的对象进行不同的处理:首先将内存分为下图
    

    在这里插入图片描述

     1. 刚创建的对象放到Eden区
     2. Eden区的对象经过一轮GC扫描,会被拷贝到幸存区(应用复制算法)
     	大部分对象会在经过一轮GC扫描后被销毁,很少一部分会被拷贝到幸存区。
     3. 后序的几轮GC中,幸存区之间的对象在两个幸存区之间来回拷贝
     4. 持续若干轮后,进入内存老年区。(这个对象不会释放的概率很大)
     	老年代的GC扫描概率比较低
     	老年代内存使用标记-整理的方式进行内存回收。
     	
     在分代回收中,有个特殊情况:占用内存大的对象会直接进入老年区。
     因为大对象拷贝成本大,不适合使用拷贝算法。
    

JVM垃圾回收器:在JVM中,真正实现上数算法的模块,称为垃圾回收器。

历史的垃圾回收器:

  1. Serial回收器:串行垃圾回收器(扫描时业务线需要停止工作)

  2. Parallel old回收器:引入多线程,并发垃圾回收器(垃圾扫描时,业务线不需要停止)

  3. CMS回收器:尽可能让STW时间短

    可达性分析阶段:
    ①初始标记:找GCRoots速度快,STW短
    ②并发标记:速度慢,但是于业务线并发执行,无STW
    ③重新标记:业务代码可能重新影响并发标记结果,这里进行微调

    内存释放阶段:使用标记整理法。

  4. G1垃圾回收器:

    给内存分成很多区域Region,给这些Region进行不同标记,给这些区域不同标记区分不同区域。在扫描中,一次扫描若干区域,不全部扫描。这样基本不影响业务代码

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

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

相关文章

07-Golang中标识符的命名规则

Golang中标识符的命名规则标识符概念标识符的命名规则保留关键字介绍预定义标识符介绍标识符命名注意事项标识符概念 1.Golang对各种变量、方法等命名时使用的字符序列称为标识符 2.凡是自己可以起名字的地方都叫标识符 标识符的命名规则 1.由26个英文字母大小写&#xff0…

华为云桌面之下的“冰山”:技术底座x繁荣生态加速模式进化

在新兴技术迭代升级持续加速的背景下,很多产品类别的内涵和外延都在不断演进——虽然名字没什么变化,但实际所指已有云泥之别。 “云桌面”即是如此。从早期的无盘工作站,到VDI、IDV和VOI等技术流派的群雄并起,云桌面的江湖总是“…

linux第七章---管道、环境变量、常用命令

1.管道 1.1概念: 管道类似于文件重定向,可以将前一个命令的stdout重定向到下一个命令的stdin。 1.2要点: 管道命令仅处理stdout,会忽略stdeer。管道右边的命令必须要能接受stdin.多个管道命令可以串联。 1.3与文件重定向的区…

Java平衡树之查找树的详解(1)

1.平衡树 之前我们学习过二叉查找树,发现它的查询效率比单纯的链表和数组的查询效率要高很多,大部分情况下,确实是这样的,但不幸的是,在最坏情况下,二叉查找树的性能还是很糟糕。例如我们依次往二叉查找树中…

c语言预处理(万字解析)

预处理一.总体概述1.注释去除2.宏替换二.宏定义(宏替换类型)1.数值宏常量2.字符串宏常量3.用宏定义注释符号4.用宏定义表达式(难点)1.第一种情况2.第二种情况5.#undef(宏的有效范围)1.两个问题2.#undef的使…

FLStudio2023水果软件哪个版本好用?功能区别对比

FL Studio是一款功能非常强大的音乐创作编辑软件它就是FL Studio(水果软件)。使用FL Studio中文版可以轻松帮我们制作自己的音乐唱片,拥有强大且专业的编曲混音创作工具,有需要的朋友不要错过。 水果,全称Fruity Loop Studio,简称…

量子计算(十六):其他类型体系的量子计算体系

文章目录 其他类型体系的量子计算体系 一、离子阴量子计算 二、原子量子计算 三、核自旋量子计算 四、拓扑量子计算 其他类型体系的量子计算体系 一、离子阴量子计算 离子研量子计算在影响范围方面仅次于超导量子计算。早在2003年,基于离子阴就可以演示两比特…

“转行做程序员”很难?这里有4个重要建议

近几年来,传统行业多处于经济下行,加上互联网行业的赚钱效应,想要转行到这一行的人越来越多,其中程序员这个行业更是很多人梦寐以求的。 但另一方面,我们也发现,这些想要转行的同学们往往会遇到很多困扰。…

推荐今日 火火火火 的开源项目

本期推荐开源项目目录:1. coding-interview-university2. 前端后台管理模板3. 钉钉聊天机器人4. 基于 ChatGPT 的 Neovim 插件5. 开源的分布式社交网络平台6. 分析社交媒体内容7. 用于绘制流程图的库01coding-interview-university这是一个汇集了软件工程师面试中常…

2023跨年代码(烟花+背景音乐)

文章目录前言效果展示使用方法源码学习HTML代码CSS代码前言 时光荏苒,白驹过隙。2022这一年又在忙碌中度过了,过去的一年,我们同努力,我们共欢笑,每一次成功都蕴藏着我们辛勤的劳动。 新的一年即将来到,我…

【linuxgdb】动态链接和静态链接的区别,gdb的基础使用

目录 1.gcc/c动态链接和静态链接的区别 2.gdb的基础使用 2.2使用gdb调试 1.gcc/c动态链接和静态链接的区别 1.1查看可执行文件是动态还是静态的 格式:file文件名 1.2动态链接和静态链接 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的…

ARM S5PV210 串行通信接口详解

一、串行通信接口详解 1 0. 串口的名称 S5PV210 的数据手册中串口控制器在 section8.1串口的官方名称叫:universal asynchronous reciver and transmitter,通用异步收发器 英文缩写是uart,中文简称串口。 1. S5PV210 的串口控制器工作原理…

CSS -- 2D转换各属性讲解(translate,rotate,scale)

文章目录2D转换1 二维坐标系2 2D转换之移动 translate3 2D转换之旋转 rotate4 2D转换中心点 transform-origin5 2D转换之缩放scale6 2D转换综合写法7 2D转换总结2D转换 转换(transform)是CSS3中具有颠覆性的特征之一,可以实现元素的位移、旋转、缩放等效果 转换(t…

[ 常用工具篇 ] 使用 kali 实现网络钓鱼 -- setoolkit 详解实战(一)

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

密码学讲座PPT

来自山大密码学讲座的PPT。 一些密码学领域常用名词术语 Diffie-Hellman 密钥交换;Elgamal 加密和签名;DSA 签名;因相应的离散对数问题难解,大素数的原根可用于密钥交换;RSA加密和签名: 因大整数因子分解难算,合数可成…

JetPack 组件总结

文章目录JetPackLifecycle使用Lifecycle解耦页面和组件使用Lifecycle解耦Service与组件使用ProcessLifecycleOwner监听应用程序生命周期ViewModel 与 LiveDataViewModelLiveDataViewModel LiveData 实现Fragment间通信DataBinding 的意义与应用意义使用前的配置import标签事件…

SWPUCTF 2021 新生赛

😋大家好,我是YAy_17,是一枚爱好网安的小白,自学ing。 本人水平有限,欢迎各位大佬指点,一起学习💗,一起进步⭐️。 ⭐️此后如竟没有炬火,我便是唯一的光。⭐️ 目录 g…

Kotlin + Jpa + Querydsl

Kotlin Jpa Querydsl 本篇主要介绍一下 kotlin jpa querydsl . jpa querydsl 是我很喜欢的一种搭配,它能够让你写sql语句一样的去写代码 , 以前我也写过关于 java版本的, 本篇就来看看kotlin中如何去使用 1.引入插件 主要引入jpa插件 和 kapt Kotlin annotation processi…

【剧前爆米花--爪哇岛寻宝】Cloneable接口和深浅拷贝

作者:困了电视剧 专栏:《JavaSE语法与底层详解》 文章分布:这是一篇关于接口的文章,在本篇文章中我会分享Cloneable接口的用法和机制,同时从底层分析深拷贝和浅拷贝的区别。 Cloneable接口 Cloneable这类接口可以说是…

ZigBee硬件平台小记(CC2530)

文章目录1.CC2530射频模块特征2.CC2530射频模块主要技术指标3.调试器输出接口特点输出引脚排列1.CC2530射频模块特征 基于CC2530F256单芯片ZigBee SOC(System On Chip),集成8051内核模块尺寸:36mm x 26mmSMA底座,外接…