Java GC:GC算法、GC回收器、GC日志

news2024/9/27 11:43:59

文章目录

  • 基本概念
    • 垃圾回收类型
    • 垃圾回收算法
    • 垃圾回收器
  • VM参数设置
    • 控制vm参数
    • 内存参数
    • GC参数
  • GC实例分析

基本概念

垃圾回收类型

  1. Minor GC:对新生代进行的垃圾回收,所以也叫Young GC
  2. Major GC:对老年代进行的垃圾回收,所以也叫Old GC
  3. Full GC:对整个Java堆和元空间进行的垃圾回收
  4. Mixed GC:混合GC,新生代、老年代进行垃圾回收,目前只有G1支持

Young = Eden + Survivor0 + Survivor1

gc

垃圾回收算法

  1. 标记-清除算法:会产生内存碎片
  2. 标记-复制算法:大量对象复制开销大,需要预留额外的内存空间用来做复制的目标空间(如果要保证空间足够至少要50%(1/2),但实际不会预留那么多,所以需要空间担保,例如默认的Eden:Survivor=8:1,2个S区就只有1/10)
  3. 标记-整理算法:整理算法是复制算法的进阶版,将内存一端复制到另一端,这样不需要浪费1/2的空间,也不用空间担保,但是整个内存的地址引用都可能变化,所以必须STW(复制算法要么有1/2空间浪费,要么需要空间担保,Old显然接受不了1/2的空间浪费,也不想Eden有Old空间做空间担保,所以只能使用整理算法)

垃圾回收器

gc回收器

  1. Serial:新生代,标记复制算法,-XX:+UseSerialGC
  2. . Parallel Scavenge:新生代,使用标记复制算法,-XX:+UseParallelGC,-XX:MaxGCPauseMillis(大于0,最大停顿),-XX:GCTimeRatio(垃圾回收时间占比,[0,100],默认19,表示垃圾回收时间不超过1/1+19=1/20=5%)
  3. ParNew,新生代,标记复制算法,-XX:+UseParNewGC,配合CMS使用
  4. Serial Old,老年代,标记整理算法,-XX:+UseSerialGC
  5. Parallel Old,老年代,标记整理算法,-XX:+UseParallelOldGC,-XX:ParallelGCThreads=n(设置回收器线程数量)
  6. CMS,老年代
  7. G1,整个堆

JDK9已经默认使用G1了,所以这里再重点介绍一下:

  1. G1将整个Java堆划分成多个大小不等的Region
  2. 每个Region可以根据需要扮演Eden区、Survivor区、或者Old

G1回收阶段1:

  1. Eden内存不足,触发新生代GC开始回收Eden区和Survivor区
  2. GC后,Eden区会被清空,Survivor区至少会保留一个,其余的对象要么被清理,要么被晋升到老年代

这次回收,新生代的大小会根据实际运行情况调整

G1回收阶段2:并发标记周期

  1. 初始标记:STW,仅标记GC Roots直接关联的对象,会伴随一次新生代GC,非常快
  2. S0扫描:非STW,扫描初始标记存活的Survivor区直接可达的老年代区域,并标记
  3. 并发标记:非STW,扫描并查找整个堆内存活的对象并标记
  4. 重新标记:STW,修正并发标记期间因为用户线程继续执行而导致对象间的引用被改变
  5. 独占清理:STW,计算各个Region的回收价值,对Region进行排序,识别可供混合回收的区域
  6. 并发清理:识别并清理完全空闲的Region,不会造成停顿

G1回收阶段3:混合回收

阶段2回收了部分空间,但是比例还是相当低的,不过G1已经知道各个Region的回收情况了。

因此可以优先回收垃圾最多的Region,这些Region既包含了新生代,也包含了老年代

被清理的Region内的存活对象会被移动到其他Region,避免内存碎片。

VM参数设置

控制vm参数

参数说明
-XX:+PrintFlagsInitial打印vm默认选项
-XX:+PrintFlagsFinal打印应用运行时生效的选项
-XX:+PrintCommandLineflags打印启动命令手动设置的vm参数
-XX:+PrintVMOptions打印vm选项

内存参数

参数说明
-Xss128k或-XX:ThreadStackSize=128k设置每个线程栈大小
-Xms2048m或-XX:InitialHeapSize=2048m设置JVM初始堆内存大小
-Xmx2048m或-XX:MaxHeapSize=2048m设置JVM最大堆内存大小
-Xmn1g设置年轻代大小
-XX:NewSize=1024m设置年轻代初始值
-XX:MaxNewSize=1024m设置年轻代最大值
-XX:SurvivorRatio=8设置年轻代中的Eden区与Survivor去的比值,默认为8
-XX:NewRatio=4设置老年代与年轻代(包括1个Eden和2个Survivor区)的比值
-XX:PretenureSizeThreadshold=1024设置让大于此阈值的对象直接分配到老年代,单位为字节,只对Serial,ParNew收集器有效
-XX:MaxTenuringThreshold=15新生代每次MinorGC之后,还存活的对象年龄加1,当对象年龄大于设置的值时就进入老年代
-XX:+PrintTenuringDistribution每次MinorGC之后打印出当前的使用Survivor对象的年龄分布
-XX:TargetSurvivorRatioMinorGC结束后Survivor区域中占用空间期望比例
-XX:PermSize=256m设置永久代初始值大小
-XX:MaxPermSize=256m设置永久代最大值大小
-XX:MetaspaceSize元空间初始大小
-XX:MaxMetaspaceSize元空间最大值
-XX:+HeapDumpOnOutOfMemoryError内存溢出时dump内存文件
-XX:HeapDumpPath=/path/to/dump内存溢出时dump内存文件路径

注意:

  1. SurvivorRatio是年轻代Eden/Survivor的比值,例如默认8,就表示Eden/Survivor=8,因为有2个Survivor所以每个Survivor占1/(8+1+1)=1/10
  2. NewRatio是老年代与年轻代的比值,默认值2=Old/(Eden+S0+S1)=2:1,如果-Xmn1g,那么Old就是2G
  3. JDK8及其以上版本永久代(PermSize、MaxPermSize)已经被元空间(MetaspaceSize、MaxMetaspaceSize)取代

GC参数

参数说明
-XX:+PrintGCDetails打印详细日志
-XX:+PrintGCTimeStamps打印GC时jvm启动时间
-XX:+PrintGCDateStamps打印GC日志时间
-XX:+DisableExplicitGC在程序代码中不允许调用System.gc()
-Xloggc:F:/tmp/gc.log将GC日志输出到指定文件
-XX:+PrintHeapAtGC每次GC时都打印堆信息
-XX:+PrintGC打印GC的简要信息,高版本使用-Xlog:gc
-verbose:gc等价-XX:+PrintGC,标准的选项

GC实例分析

我们可以通过下面的代码和vm参数来简单看一下垃圾回收。

import java.util.ArrayDeque;
import java.util.Queue;

public class Start {

    private static final Queue<byte[]> queue = new ArrayDeque<>();

    /**
     * -Xms1g -Xmx1g -XX:+PrintGC
     *
     * @param args
     */
    public static void main(String[] args) {
        mem();
    }

    public static void mem() {
        while (true) {
            byte[] kb = new byte[1024 * 1024];
            if (queue.size() >= 100) {
                queue.poll();
            }
            queue.offer(kb);
        }
    }
}

在这里插入图片描述

不同的垃圾回收器日志不一样,但是内存的关键信息大差不差:

G1回收日志

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

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

相关文章

无人机的作战指挥中心-地面站!

无人机与地面站的关系 指挥与控制&#xff1a;地面站是无人机系统的核心控制部分&#xff0c;负责对无人机进行远程指挥和控制。无人机根据地面站下达的任务自主完成飞行任务&#xff0c;并实时向地面站反馈飞行状态和任务执行情况。 任务规划与执行&#xff1a;地面站具备任…

Laravel部署后,CPU 使用率过高

我在部署 Laravel 应用程序时遇到严重问题。当访问量稍微大一点的时候&#xff0c;cpu马上就到100%了&#xff0c; 找了一大堆文档和说明&#xff0c;都是说明laravel处理并发的能力太弱&#xff0c;还不如原生的php。最后找到swoole解决问题。 1、php下载swoole插件&#xff0…

智能监控,守护绿色能源:EasyCVR在电站视频监控中心的一站式解决方案

随着科技的飞速发展&#xff0c;视频监控技术在社会安全、企业管理及智慧城市建设等领域中扮演着越来越重要的角色。特别是在电力行业中&#xff0c;电站作为能源供应的关键设施&#xff0c;其安全性和稳定性至关重要。传统的人工监控方式已难以满足现代电站复杂多变的运行需求…

Sql Server时间转换之查询时间格式不对--CONVERT(NVARCHAR,CreateTime,23) 转换出来有时分秒

错误&#xff1a;CONVERT(NVARCHAR,CreateTime,23) 转换出来有时分秒 SELECT TOP 10 CONVERT(NVARCHAR,CreateTime,23) FROM table A 解决办法&#xff1a;限制转换的字符串长度 SELECT TOP 10 CONVERT(NVARCHAR(10),CreateTime,23) FROM table A

Android 通过自定义注解实现Activity间跳转时登录路由的自动拦截

应用场景 在Android 中部分软件需要登录才能使用&#xff0c;但是有的页面又不需要登录&#xff0c;Android不同于Web可以直接拦截重定向路由&#xff0c;因此如果在Android中如果需要检测是否登录&#xff0c;如果没登录跳转登录的话就需要再每个页面中判断&#xff0c;当然也…

不会写SD WebUI 的负面提示词?用这几款Embedding模型一键搞定!效果好到爆炸!

文章目录 一、Embedding 模型简介二、负面提示词 Embedding三、Embedding 资源下载四、Embedding 安装与使用关于AI绘画技术储备零基础AI绘画学习资源介绍&#x1f449;stable diffusion新手0基础入门PDF&#x1f448;&#x1f449;AI绘画必备工具&#x1f448;&#x1f449;AI…

MySQL重点,面试题

一、 聚合函数 分类 COUNT&#xff1a;统计行数量SUM&#xff1a;获取单个列的合计值AVG&#xff1a;计算某个列的平均值MAX&#xff1a;计算列的最大值MIN&#xff1a;计算列的最小值 二、SQL关键字 分页&#xff1a;limit SELECT * FROM student limit 100,6; 倒序 desc s…

数据结构 ——— 移除 nums 数组中的 val 元素(快慢指针)

目录 题目要求 代码实现&#xff08;快慢指针&#xff09; 题目要求 编写函数&#xff0c;给你一个数组 nums 和一个值 val&#xff0c;你需要在 nums 数组 原地 移除所有数值等于 val 的元素&#xff0c;并且返回移除后数组的新长度 不能使用额外的数组空间&#xff0c;要…

11.全面学习面向对象技术

面向对象开发 相关概念 对象&#xff1a;由数据及其操作所构成的封装体&#xff0c;是系统中用来描述客观事务的一个实体&#xff0c;是构成系统的一个基本单位。一个对象通常可以由对象名、属性和方法3个部分组成。类&#xff1a;现实世界中实体的形式化描述&#xff0c;类…

MySQL_插入、更新和删除数据

课 程 推 荐我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448;入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448;虚 拟 环 境 搭 建 &#xff1a;&#x1…

如何禁止电脑蓝牙?五个有效方法教给你!小白必看!

在生活和工作中&#xff0c;蓝牙是一种非常方便的无线技术&#xff0c;可以连接鼠标、键盘、耳机等设备。 然而&#xff0c;蓝牙同时也是信息泄露的潜在渠道&#xff0c;特别是在公共场所或公司内部环境中&#xff0c;可能会带来安全隐患。 想要保护隐私或防止电脑与未经授权…

基于YOLOv8目标检测与chef-transformer(T5)从图像创建食谱

前言 在本文中&#xff0c;将演示如何使用从Roboflow获得的开源产品数据来训练我的YOLOv8模型&#xff0c;然后将其与从Hugging Face获得的chef-transformer&#xff08;T5&#xff09;模型集成。应用程序的主要目标是将检测到的对象参数化地发送到语言模型&#xff0c;并在NL…

第05-3节:加载流程原理介绍(Done)

我的后端学习大纲 我的Linux学习大纲 本节目标 1.能够说出交互式Shell与非交互式Shell2.能够说出登录Shell与非登录Shell环境 1.1.Shell工作环境介绍 用户进入linux系统就会初始化Shell环境, 这个环境会加载全局配置文件和用户个人配置文件中环境变量.每个脚本文件都有自己的…

STM32嵌入式编程学习到提高:【4】UART串口打印

------------------------------------------------------------------------------------------------------------------------- 工程文件&#xff1a;放在百度云盘里&#xff0c;需要的自行下载&#xff01;&#xff01;&#xff01; 链接: https://pan.baidu.com/s/14gRne…

2万字长文助你快速入门AIGC:包含底层原理、应用场景、热门工具、行业现状…

最近大家热议的ChatGPT和AI绘画工具的底层技术原理是什么&#xff1f;是如何发展到现在的&#xff1f;有哪些应用场景、热门工具&#xff1f;AIGC产业上下游有哪些公司&#xff1f;作为普通用户&#xff0c;我们还能接触哪些应用AI技术打造的商业解决方案&#xff1f;…… 我们…

RK 方案VOP 显示接口的链接关系以及DTS如何配置

这图显示各vp 支持情况 如下图VP0 支持DSI0 DSI1 EDP LVDS HDMI 显示接口&#xff0c;如果我们一方案需要点MIPI 屏 和HDMI out, 如果VP0 链接MIPI DSI0 那么VP0 就不能再选择了&#xff0c;只能VP1 链接HDMI out 了。因为VP2不至此HDMI&#xff0c;所有就只有选择VP1 链接HDMI…

随记——机器学习

前言 本来有个500块钱的单子&#xff0c;用机器学习做一个不知道什么鸟的识别&#xff0c;正好有数据集&#xff0c;跑个小项目&#xff0c;过一下机器学习图像识别的流程&#xff0c;用很短的时间记录下来..... 一、数据预处理 将数据集分为训练集和测试集&#xff0c;直接…

【HarmonyOS】SaveButton保存图片

SaveButton组件把图片显示到相册中的方法demo&#xff0c;支持组件截图、url网络图片、base64格式图片。注意事项&#xff1a; 1、不支持自定义SaveButton样式。 2、下载按钮被遮挡一部分&#xff0c;也无法保存到相册。 import photoAccessHelper from ohos.file.photoAcces…

使用 pypdf 给 PDF 添加目录书签

""" dir.txt的形式 第1章 计算机系统基础知识 1 1.1 嵌入式计算机系统概述 1 1.2 数据表示 4 1.2.1 进位计数制及转换 4 1.2.2 数值型数据的表示 6 第2章 嵌入式系统硬件基础知识 56 2.1 数字电路基础 56 2.1.1 信号特征 56 2.1.2 组合逻辑电路和时序逻辑电路 5…

为什么现在的网站设计大多都非常简洁,越来越扁平化

网站设计趋向简洁和扁平化&#xff0c;反映了现代设计理念的转变和技术的进步。以下是对这一现象的具体分析&#xff1a; 用户体验优先&#xff1a;用户更倾向于简单直接的界面&#xff0c;这有助于快速找到所需信息。扁平化设计通过减少视觉干扰&#xff0c;使得内容更加突出…