jvm学习笔记(二) ----- 垃圾回收

GC

  • 一、判定对象是否是垃圾
    • 1.引用计数法
    • 2.可达性分析算法
  • 二、垃圾回收算法
    • 1.标记清除
    • 2.标记整理
    • 3. 复制
    • 4. 分代垃圾回收
      • 1.尝试在伊甸园分配
      • 2.大对象直接晋升至老年代
      • 3.多次存活的对象
      • 4.老年代连续空间不足,触发 Full GC

链接: jvm学习笔记(一) ----- JAVA 内存
链接: jvm学习笔记(三) ----- 垃圾回收器

一、判定对象是否是垃圾

1.引用计数法

  • 有一个地方引用对象,计数加一,当计数为零表示可以回收
  • 缺点是难以解决对象之间的循环引用问题

2.可达性分析算法

  • java 虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象。它从一系列 GC Roots 出发,边标记边探索所有被引用的对象
  • 从 GC Root对象 为起点,看是否能沿着引用链找到该对象,找不到,表示可以回收
  • GC Root对象 包括栈帧中的局部变量、方法区中的静态变量、方法区中的常量、本地方法栈中JNI引用的对象
  • 为了防止在标记过程中堆栈的状态发生改变,Java 虚拟机采取安全点机制来实现 Stop-the-world (应用程序的线程全部停止) 操作,暂停其他非垃圾回收线程
  • 当然,安全点的初始目的并不是让其他线程停下,而是找到一个稳定的执行状态。在这个执行状态下,Java 虚拟机的堆栈不会发生变化。这么一来,垃圾回收器便能够“安全”地执行可达性分析

二、垃圾回收算法

1.标记清除

第一遍标记、第二遍收集。缺点是会产生内存碎片,碎片过多,仍会使得连续空间少
在这里插入图片描述

2.标记整理

第一遍标记、第二遍整理,整理是指存活对象向一端移动来减少内存碎片,相对效率较低
在这里插入图片描述

3. 复制

开辟两份大小相等空间,一份空间始终空着,垃圾回收时,将存活对象拷贝进入空闲空间,优点是不会有内存碎片,但占用空间多。
在这里插入图片描述

4. 分代垃圾回收

  1. 大部分的 Java 对象只存活一小段时间,而存活下来的小部分 Java 对象则会存活很长一段时间。
  2. 根据对象的特点分代(分区域)来进行,分为新生代和老年代,新生代对象一般很少存活,采用『复制算法』、老年代对象生存时间长,适合采用『标记-清除算法』或『标记-整理算法』
  3. 堆内存分为『新生代』和『老年代』,『新生代』又分为『伊甸园』和两个『幸存区』。新生代内存不足触发的 GC 称为 Minor GC ,暂停时间很短,老年代内存不足触发的 GC 称为 Full GC 暂停时间较长,一般是新生代 GC 的几十倍,它们使用的垃圾回收算法不同,见之前的介绍。

1.尝试在伊甸园分配

对象优先在『伊甸园』分配,当『伊甸园』没有足够的空间时,触发 Minor GC ,将『伊甸园』和『幸存区 From』中仍然存活的对象利用 复制算法 移入『幸存区 To』,然后交换『幸存区 From』和『幸存区 To』的位置。

默认情况下,Java 虚拟机采取的是一种动态分配的策略(对应 Java 虚拟机参数 -XX:+UsePSAdaptiveSurvivorSizePolicy),根据生成对象的速率,以及 Survivor区的使用情况动态调整 Eden 区和 Survivor 区的比例。当然,你也可以通过参数 -XX:SurvivorRatio 来固定这个比例。但是需要注意的是,其中一个 Survivor 区会一直为空,因此比例越低浪费的堆空间将越高。

情况1:伊甸园空间还够,新对象在伊甸园能够存储的下,这时候不会发生GC。图中白色区域是空闲空间、蓝色矩形表示已创建对象。
在这里插入图片描述
情况2:伊甸园空间不够了。

在这里插入图片描述
标记可回收的对象,图中用黄色表示,这时候会用户线程会被暂停(Stop The World)。

在这里插入图片描述
触发新生代的垃圾回收,称为 Minor GC ,幸存对象移入『幸存区 To』,注意这里用的是复制算法,因此在幸存区没有碎片。
在这里插入图片描述
最后的结果,注意 GC 完成后,From 和 To 交换了位置,另外幸存区的对象开始记录寿命。
在这里插入图片描述

2.大对象直接晋升至老年代

当对象太大,伊甸园包括幸存区都存放不下时,这时候老年代的连续空间足够,此对象会直接晋升至老年代,不会发生 GC

在这里插入图片描述
结果:
在这里插入图片描述
测试:

  1. 预先定义一组大小
    private static final int _512KB = 512 * 1024;private static final int _1MB = 1024 * 1024;private static final int _6MB = 6 * 1024 * 1024;private static final int _7MB = 7 * 1024 * 1024;private static final int _8MB = 8 * 1024 * 1024;

在运行时添加如下 JVM 参数:

-XX:+UseSerialGC -XX:+PrintGCDetails -verbose:gc -Xms20M -Xmx20M -Xmn10M -XX:SurvivorRatio=8

参数含义 :

-XX:+UseSerialGC 是指使用 Serial + SerialOld 回收器组合
-XX:+PrintGCDetails -verbose:gc 是指打印 GC 详细信息
-Xms20M -Xmx20M -Xmn10M 是指分配给 JVM 的最小,最大以及新生代内存
-XX:SurvivorRatio=8 是指『伊甸园』与『幸存区 From』和『幸存区 To』比例为 8:1:1

  1. 最开始,没什么对象:
public static void main(String[] args) {}

测试结果:
在这里插入图片描述

  1. 当代码改为
    public static void main(String[] args) {byte[] obj1 = new byte[_7MB];}

可以预料到,因为「eden space 8192K, 30% used」已经放不下 7MB 的对象,必然会触发新生代的 GC:
在这里插入图片描述

  1. 可以看到,结果是一部分旧的对象进入了幸存区「from space 1024K, 73% used」,而伊甸园里放入了 7MB 的对象「eden space 8192K, 88% used」再放入一个 512KB 的对象
public static void main(String[] args) {byte[] obj1 = new byte[_7MB];byte[] obj2 = new byte[_512KB];
}

在这里插入图片描述
可以看到,伊甸园几乎被放满了「eden space 8192K, 98% used」,但毕竟没有满,所以没有触发第二次 GC继续放入一个 512KB 的对象.

  1. 果然触发了第二次 GC,其中一个 512KB 的对象进入了幸存区「from space 1024K, 52% used」而那个 7MB 的对象晋升至了老年代「tenured generation total 10240K, used 7848K」
public static void main(String[] args) {byte[] obj1 = new byte[_7MB];byte[] obj2 = new byte[_512KB];byte[] obj3 = new byte[_512KB];
}

在这里插入图片描述

3.多次存活的对象

在幸存区历经多次 GC 还存活的对象会晋升至老年代,默认晋升的阈值是 15,也就是说只要经历 15 次回收不死,肯定晋升,但注意如果目标 survivor 空间紧张,也不必等足 15 次,可以提前晋升

-XX:MaxTenuringThreshold=thresholdSets the maximum tenuring threshold for use in adaptive GC sizing. The largest value is 15. The default value is 15 for the parallel (throughput) collector, and 6 for the CMS collector.-XX:TargetSurvivorRatio=percentSets the desired percentage of survivor space (0 to 100) used after young garbage collection. By default, this option is set to 50%.

4.老年代连续空间不足,触发 Full GC

public static void main(String[] args) {byte[] obj1 = new byte[_8MB];byte[] obj2 = new byte[_8MB];
}

第一个 8MB 直接进入老年代,第二个 8MB 对象在分配时发现老年代空间不足,只好尝试先进行一次 Minor GC ,结果发现新生代没有连续空间,只好触发一次 Full GC ,最后发现老年代也没有连续空间,这时出现 OutOfMemoryError

果把代码改为下面的样子,则只会触发 Minor GC ,之后,老年代能够容纳 obj2,所以不会触发 Full GC

public static void main(String[] args) {byte[] obj1 = new byte[_8MB];obj1 = null;;byte[] obj2 = new byte[_8MB];
}

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

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

相关文章

Spigot开发中的事件与监听器的关系

介绍Spigot开发中的监听器 在Spigot插件开发中,监听器(Listener)是一个非常重要的概念。它们允许你捕捉和处理各种游戏事件,使你的插件能够对玩家的行为、游戏环境的变化等做出响应。本文将详细介绍监听器是什么、它们的用途&…

select模块

Python标准库中的select模块,这个模块提供了select函数,它能够监视文件描述符,等待它们变得“就绪”(即可读、可写或发生异常)。这在处理I/O、网络通信或异步操作时非常有用。 select模块的基本使用 导入模块 impor…

能打印出一条虚线的程序

目录 开头程序程序输入与打印的效果输入输入1输入2 打印打印1打印2 流程图结尾 开头 大家好&#xff0c;我叫这是我58&#xff0c;现在&#xff0c;请你先看一下下面的程序。 程序 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> int main() {int i 0;int ia…

解析智慧机场系统的架构与未来发展趋势

在全球航空业快速发展的背景下&#xff0c;智慧机场系统已经成为提升机场运营效率、优化旅客体验的重要手段。智慧机场系统的架构设计涵盖了多个方面&#xff0c;从航班管理到安全检查&#xff0c;从旅客服务到数据分析&#xff0c;都有着精心设计和完善的技术支持。本文将深入…

Apipost安装教程

&#x1f4d6;Apipost安装教程 ✅1. 下载✅2. 安装 ✅1. 下载 官网地址&#xff1a;https://www.apipost.cn/ 选择免费版&#xff0c;下载对应系统的安装包即可。 ✅2. 安装 1.点击运行apipost_win_x64_8.0.11.exe安装包&#xff0c;并选择用户安装&#xff0c;下一步 2.选…

【Kubernetes】Ingress 对外服务、ingress-controlle

Ingress 简介 service的作用体现在两个方面&#xff1a; 对集群内部&#xff0c;它不断跟踪pod的变化&#xff0c;更新endpoint中对应pod的对象&#xff0c;提供了ip不断变化的pod的服务发现机制&#xff1b; 对集群外部&#xff0c;他类似负载均衡器&#xff0c;可以在集群内…

架构演化过程中,如何确保核心功能不受影响?

在架构演化过程中确保核心功能不受影响是至关重要的。以下是一些策略和最佳实践&#xff0c;可以帮助在架构演化时保持核心功能的稳定性和可靠性&#xff1a; 明确核心功能&#xff1a;首先&#xff0c;需要清晰地定义哪些功能是核心的&#xff0c;这些功能对业务至关重要&…

java kotlin python 日志记录

Python中的日志记录 在Python项目中使用日志记录库&#xff0c;并限制日志文件大小为50MB&#xff0c;同时设置日志文件的滚动策略&#xff0c;使用logging库和logging.handlers.RotatingFileHandler。以下是具体步骤&#xff1a; 配置日志记录 创建一个日志配置文件&#x…

adb检测系统是否使用生产秘钥进行签名

系统签名检测 如果发现testkey.x509.pem就是开发版的系统&#xff0c;是不可信的&#xff0c;或者会被检测出来自定义ROM。 adb shell unzip -l /system/etc/security/otacerts.zip Archive: /system/etc/security/otacerts.zipLength Date Time Name --------- …

如何评估pcdn调度算法的优化效果(壹)

评估PCDN&#xff08;Peer-assisted Content Delivery Network&#xff0c;对等网络内容分发网络&#xff09;调度算法的优化效果是一个综合且系统的过程&#xff0c;涉及多个维度的考量。以下是一些建议的步骤和考量因素&#xff0c;以便全面评估优化效果&#xff1a; 一&…

服务部署:解决Docker容器与虚拟机主机之间MySql连接访问问题

一、场景&#xff1a; 虚拟机上Ubuntu系统安装了Mysql&#xff0c;现在有一个服务应用需要使用docker来部署&#xff0c;服务应用需要连接mysql做数据库基础使用&#xff0c;配置文件中配置了虚拟主机的IP和端口&#xff0c;但是还是无法连接到Mysql&#xff0c;报错无法连接超…

stm32MP135裸机编程:修改基于SD卡的FSBL-A用户程序引导程序(boot)

0 参考资料 轻松使用STM32MP13x - 如MCU般在cortex A核上裸跑应用程序.pdf stm32mp135官方开发板原理图&#xff08;mb1635-bdp-v1-0.zip&#xff09; STM32Cube_FW_MP13_V1.0.0 STM32CubeIDE v1.15 1 为什么需要修改FSBL-A用户程序引导程序 FSBL-A用户程序引导程序的作用在《…

v-for

v-for 是 Vue.js 框架中的一个重要指令&#xff0c;用于渲染列表或数组元素。它允许你在 HTML 元素上迭代一个数据集合&#xff0c;将每个数据项映射到一个或多个 DOM 元素中。使用 v-for 的基本语法如下&#xff1a; html <template> <ul> <li v-for&qu…

Spark 面试题(二)

1. 简述Spark的作业运行流程是怎么样的 &#xff1f; Apache Spark的作业运行流程涉及从作业提交到执行完成的一系列步骤&#xff0c;具体如下&#xff1a; 作业提交&#xff1a;用户编写的Spark应用程序通过Spark API提交给集群。这通常涉及到创建一个SparkContext对象&#…

03-240605-Spark笔记

03-240605 1. 行动算子-1 reduce 聚合 格式: def reduce(f: (T, T) > T): T 例子&#xff1a; val sparkConf new SparkConf().setMaster("local[*]").setAppName("Operator")val sc new SparkContext(sparkConf) ​val rdd sc.makeRDD(List(1…

基础IO (Linux文件操作)

目录 1.文件操作 2.文件描述符 3.缓冲区 4.系统的缓冲区 1.文件操作 在C语言学习中&#xff0c;我们就已经使用了一些文件操作相关的接口&#xff0c;在学习IO之前&#xff0c;我们首先要复习一些以前讲过的概念&#xff0c; 1. 空文件也要在磁盘中占用空间&#xff0c;因为…

OBS 录屏软件 for Mac 视频录制和视频实时交流软件 安装

Mac分享吧 文章目录 效果一、准备工作二、开始安装注意事项&#xff1a;包内有两个版本及圆形图片&#xff0c;请根据自身需要版本进行安装演示为&#xff1a;MacBook Pro M3芯片1、双击运行软件&#xff0c;将其从左侧拖入右侧文件夹中&#xff08;最终目的&#xff1a;安装进…

python教程

python解释器的安装 https://www.python.org/ftp/python/3.12.4/python-3.12.4-amd64.exe jetbrains官网 英文 PyCharm 专业的版本 Thank you for downloading PyCharm! 社区 Thank you for downloading PyCharm! 中文 PyCharm 专业的版本 感谢您下载PyCharm&#xff01…

[大模型]GLM-4-9B-Chat WebDemo 部署

环境准备 在autodl平台中租一个4090等24G显存的显卡机器&#xff0c;如下图所示镜像选择PyTorch–>2.1.0–>3.10(ubuntu22.04)–>12.1 接下来打开刚刚租用服务器的JupyterLab&#xff0c; 图像 并且打开其中的终端开始环境配置、模型下载和运行演示。 pip换源和安装…

#12 深入Stable Diffusion模型微调与个性化

文章目录 前言1. 模型微调的重要性2. 微调前的准备2.1 数据收集2.2 环境配置 3. 实施微调3.1 参数设置3.2 训练过程 4. 个性化定制4.1 风格定制4.2 功能扩展 5. 微调后的评估与应用5.1 性能评估5.2 部署应用 结论 前言 Stable Diffusion作为一种先进的AI图像生成技术&#xff…