JVM新生代/老年代垃圾回收器、内存分配与回收策略

新生代垃圾收集器

1. Serial收集器

serial收集器即串行收集器,是一个单线程收集器。

串行收集器在进行垃圾回收时只使用一个CPU或一条收集线程去完成垃圾回收工作,并且会暂停其他的工作线程(stop the world),直至回收完成。适用于运行在client模式下的JVM。

在单CPU年代,串行收集器是默认的垃圾回收器,minor GC和major GC的过程都是用一个线程去处理的。

启用方式:-XX: +UseSerialGC

2. ParNew收集器

parNew收集器即并行收集器,采用的是多线程方式进行垃圾回收,可以理解为Serial收集器的多线程版本,吞吐量要比串行高很多,是服务器级别的虚拟机默认使用的,用来处理新生代的垃圾回收器。

因为采用的是并行多线程方式,建议在多CPU环境下使用,否则和Serial没有区别。

启用方式:-XX: +UseParNewGC

3. Parallel Scavenge收集器

并行的多线程垃圾收集器,采用复制算法进行垃圾回收,非常适合服务器做计算任务时使用。

一般的垃圾回收器是在尽量短的时间内进行垃圾回收,这样程序与用户交互的时间间隔比较小,不会出现长时间的卡顿现象。但是Parallel Scavenge更侧重于系统的吞吐量,高效的利用CPU,优先处理计算任务,适合交互少、运算多的场景。

通过参数-XX: MaxGcPauseMills设置GC最大停顿时间,通过参数-XX: GCTimeRatio设置吞吐量大小。

启用方式:-XX: +UseParallelGC

老年代垃圾收集器

1. Serial Old收集器

serial收集器的老年代版本,同样是单线程收集器、stop the world,使用标记整理算法。

一般启用方式:
UseSerialGC是Serial + Serial Old
UseParNewGC是ParNew + Serial Old
UseParallelGC是Parallel Scavenge + Serial Old

2. Parallel Old收集器

老年代版本的Parallel Scavenge,使用多线程 + 标记整理算法。
启用方式:-XX: +UseParallelOldGC

3. CMS垃圾收集器

CMS收集器的主要目的是使垃圾回收造成的停顿时间最短,提高服务响应速度,使用标记清除算法,具有并发收集(用户线程与垃圾收集并发执行)、低停顿的特点。运行过程分为以下四个步骤:

1.初始标记:stop the world,只是标记一下GC Roots能直接关联到的对象,速度快

2.并发标记:进行GC RootsTracing过程

3.重新标记:stop the world,修正并发标记期间因用户程序继续运行而导致的标记产生变动的那部分对象的标记记录。这个阶段停顿时间相对初始标记时间长,比并发标记时间短

4.并发清除

注意:

1.CMS收集器对CPU资源敏感,这是面向并发程序设计的共性

2.无法处理浮动垃圾(CMS垃圾收集阶段,用户线程仍在运行,因此会有新的垃圾生成,这部分垃圾只能在下一次GC时再清理,即浮动垃圾),可能出现"Concurrent Mode Failure"失败导致另一次full GC

启用方式:-XX:+UseConcMarkSweepGC

G1收集器

G1收集器是基于标记整理算法实现的收集器,所以它不会产生内存空间碎片,并且可以精确的控制停顿时间。能让使用者明确指定在一个长度为M毫秒的时间片段内,消耗在垃圾收集上的时间不得超过N毫秒。

G1的设计原则就是简单可行的性能调优,只需声明以下参数即可:
-XX:+UseG1GC -Xmx16g -XX:MaxGCPauseMills=300

其中,-XX:+UseG1GC表明开启G1收集器,-Xmx16g设置堆内存为16g,-XX:MaxGCPauseMills=300设置GC停顿最大时间为300ms。如果我们需要调优,在内存一定的情况下,可以考虑修改该参数,当然还要根据实际业务场景来处理。

G1取消了堆内结构的新生代、老年代的物理空间划分,将整个Java堆划分为大小固定的独立区域,后台维护一个优先列表来跟踪这些区域的垃圾堆积程度,每次根据允许收集的时间,优先回收垃圾最多的区域。

G1中的Humongous区域用于存储生命周期较短的巨型对象(一个对象所占空间超过了分区容量的50%),如果一个Humongous区无法装下一个巨型对象,G1会寻找连续的H分区来存储,如果没有连续的H区满足这种情况,有时候会触发full GC。

G1收集器的运作主要划分为以下四个步骤:

初始标记:标记GC Roots能直接关联到的对象,需要停顿线程,但耗时很短

并发标记:从GC Roots开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发执行

最终标记:修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录

筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划

内存分配与回收策略

对象的内存分配主要是指在Java堆上的分配,通常会优先分配在新生代,然后经历一系列GC后仍然存活的对象会进入到老年代。少数情况下,一些对象也会直接进入到老年代。

-Xms:设置初始化堆内存,-Xmx设置最大堆内存,设置为相等可防止内存抖动(剩余内存大于70%、小于40%时,自动触发内存扩大或缩小)

1. 对象会优先分配在新生代

新生代划分为一个eden区和两个survivor区(from survivor、to survivor)。初始阶段,新创建的对象会分配给eden区。

新生代发生的GC成为minor GC即Young GC,主要分为以下几个过程:

  1. 随着eden区存储的对象不断增多,当eden区剩余空间无法存储新生成的对象时会触发GC

  2. 经过minor GC后仍然存活的对象会进入from survivor区

  3. 当再次触发GC时,会扫描eden区和from survivor区,对这两个区域进行垃圾回收,仍然存活的对象会被复制到to survivor区,同时这些存活的对象年龄加1

  4. 清空eden、from survivor区中的对象,并将from survivor和to survivor区互换

  5. 频繁执行上述过程,当剩余存活对象年龄达到15(默认)时,这些对象会进入老年代,通过参数-XX:MaxTenuringThreshold控制

-Xmn用来设置新生代大小,一般设置为整个堆内存的3/1或者1/4
-XX:NewRatio设置新生代与老年代的堆内存比例
-XX:SurvivorRatio设置eden区和survivor区之间的比例

2. 老年代存储的对象

发生在老年代的GC是major GC,回收速度会比minor GC慢。

上文已经说明了对象进入老年代的一种情况即长期存活的对象会进入老年代,这里再来看看其他情况:

  1. 大对象直接进入老年代

    大对象需要的连续存储空间(如数组)大于新生代剩余空间时,会直接进入老年代。

    通过参数-XX:PretenureSizeThreshold设置,大于该参数值的对象会直接进入老年代(避免新生代中大量对象的拷贝,效率低)

    注意:PretenureSizeThreshold参数只对部分垃圾回收器有效,比如Serial和ParNew

  2. 如果survivor区相同年龄所有对象大小的总和大于survivor空间的一半,年龄大于或等于该年龄的对象可以直接进入老年代,无需等到MaxTenuringThreshold设置的年龄

    注意:永久代不属于堆空间,通过参数-XX:PermSize,-XX:MaxPermSize控制大小

  3. Full GC
    full GC是针对整个Java堆空间进行垃圾回收,包括新生代和老年代,会造成stop world。要尽量避免full GC,它会影响程序的稳定性。

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

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

相关文章

Unity Mirror 多人同步 基础教程

Unity Mirror 多人同步 基础教程MirrorNetworkManager(网络管理器)Configuration:配置Auto-Start Options:自动启动Scene Management:场景管理Network Info:网络信息Authentication:身份验证Pla…

基于红尾鹰优化的LSTM深度学习网络模型(RTH-LSTM)的一维时间序列预测算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.部分程序 4.算法理论概述 5.完整程序 1.程序功能描述 红尾鹰优化的LSTM(RTH-LSTM)算法,是将红尾鹰优化算法(Red-Tailed Hawk Optimization, RTHO)与长短期…

深度学习“调参”黑话手册:学习率、Batch Size、Epoch都是啥?

点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,注册即送-H卡级别算力,80G大显存,按量计费,灵活弹性,顶级配置,学生更享专属优惠。 引言:从"炼丹"到科学,…

【网络实验】-MUX-VLAN

实验拓扑实验要求: 在企业网络中,企业员工和企业客户可以访问企业的服务器,对于企业来说,希望员工之间可以互相交流,但是企业用户之间相互隔离,不能够访问。为了实现所有用户都可以访问企业服务器&#xff…

Java泛型:类型安全的艺术与实践指南

Java泛型&#xff1a;类型安全的艺术与实践指南 前言&#xff1a;一个常见的编译错误 最近在开发中遇到了这样一个编译错误&#xff1a; Required type: Callable<Object> Provided: SalesPitchTask这个看似简单的错误背后&#xff0c;隐藏着Java泛型设计的深层哲学。今天…

UMI企业智脑 2.1.0:智能营销新引擎,图文矩阵引领内容创作新潮流

在数字营销日益激烈的今天&#xff0c;企业如何在信息洪流中脱颖而出&#xff1f;UMI企业智脑 2.1.0 的发布为企业提供了全新的解决方案。这款智能营销工具结合了先进的AI技术与数据驱动策略&#xff0c;帮助企业优化营销流程、提升效率&#xff0c;并通过图文矩阵实现内容创作…

Lustre Ceph GlusterFS NAS 需要挂载在k8s容器上,数据量少,选择哪一个存储较好

在 K8s 容器环境中&#xff0c;数据量 不大的 规模下&#xff0c;Lustre、Ceph、GlusterFS 和 NAS 的选择需结合性能需求、运维成本、扩展性和K8s 适配性综合判断。以下是针对性分析及推荐&#xff1a;一、核心对比与适用场景二、关键决策因素1. 性能需求高并发 / 高吞吐&#…

深入解析 Apache Doris 写入原理:一条数据的“落地之旅”

在日常的数据分析场景中&#xff0c;我们经常会向 Apache Doris 写入大量数据&#xff0c;无论是实时导入、批量导入&#xff0c;还是通过流式写入。但你是否想过&#xff1a;一条数据从客户端发出&#xff0c;到最终稳定落盘&#xff0c;中间到底经历了哪些步骤&#xff1f; …

基于MATLAB的视频动态目标跟踪检测实现方案

一、系统架构设计 视频动态目标跟踪系统包含以下核心模块&#xff1a; 视频输入模块&#xff1a;支持摄像头实时采集或视频文件读取预处理模块&#xff1a;灰度转换、降噪、光照补偿目标检测模块&#xff1a;背景建模、运动区域提取跟踪算法模块&#xff1a;卡尔曼滤波、粒子滤…

【Python】Python文件操作

Python文件操作 文章目录Python文件操作[toc]1.文件的编码2.文件打开、读取&#xff08;r模式&#xff09;、关闭3.文件的写入&#xff08;w模式&#xff09;4.文件的追加写入&#xff08;a模式&#xff09;5.综合案例1.文件的编码 意义&#xff1a;计算机只能识别0和1&#x…

CES Asia的“五年计划”:打造与北美展比肩的科技影响力

在全球科技产业版图中&#xff0c;展会一直是前沿技术展示、行业趋势探讨以及商业合作达成的关键平台。CES Asia&#xff08;亚洲消费电子技术展&#xff09;作为亚洲科技领域的重要展会&#xff0c;近日明确提出其“五年计划”&#xff0c;目标是打造与北美展会比肩的科技影响…

【计算机网络 | 第16篇】DNS域名工作原理

文章目录3.5 域名系统工作原理主机的标识方式&#xff1a;域名 vs IP 地址标识转换机制&#xff1a;DNS系统因特网的域名系统&#xff1a;层次域名空间&#x1f426;‍&#x1f525;顶级域名分类低级域名与管理域名与IP的区别因特网的域名系统&#xff1a;域名服务器&#x1f9…

YASKAWA安川机器人铝材焊接节气之道

在铝材焊接领域&#xff0c;保护气体的合理使用对焊接质量与成本控制至关重要。安川焊接机器人凭借高精度与稳定性成为行业常用设备&#xff0c;而WGFACS节气装置的应用&#xff0c;则为其在铝材焊接过程中实现高效节气提供了创新路径。掌握二者结合的节气之道&#xff0c;对提…

GooseDB,一款实现服务器客户端模式的DuckDB

在网上看到韩国公司开发的一款GooseDB&#xff0c; 官方网站对它的介绍是DuckDB™ 的功能扩展分支&#xff0c;具有服务器/客户端、多会话和并发写入支持&#xff0c;使用 PostgreSQL 有线协议&#xff08;DuckDB™是 DuckDB 基金会的商标&#xff09; 使用也很简单&#xff…

lesson62:JavaScript对象进化:ES2025新特性深度解析与实战指南

目录 一、迭代器辅助方法&#xff1a;对象数据处理的优雅革命 1.1 核心方法与语法 1.2 对象属性处理实战 1.3 性能与兼容性考量 二、JSON模块原生支持&#xff1a;对象加载的范式转变 2.1 静态与动态导入语法 2.2 与传统方案的对比优势 2.3 典型应用场景 三、Set集合增…

设计模式学习笔记(一)

设计模式学习笔记&#xff08;一&#xff09; 一般说设计模式都是指面向对象的设计模式&#xff0c;因为面向对象语言可以借助封装、继承、多态等特性更好的达到复用性、可拓展性、可维护性。 面向对象一般指以类、对象为组织代码的基本单元&#xff0c;并将封装、继承、多态、…

【CSS】一个自适应大小的父元素,如何让子元素的宽高比一直是2:1

父元素是自适应大小的容器&#xff08;比如 width:100%&#xff09;&#xff0c;我们希望子元素 始终保持 2:1 宽高比&#xff08;比如宽 200px → 高 100px&#xff0c;宽 300px → 高 150px&#xff09;。 有几种常见解法&#xff1a;✅ 方法一&#xff1a;CSS aspect-ratio&…

如何搭建redis集群(docker方式非哨兵)

1、redis的配置文件这里要注意&#xff0c;主从的ip不需要我们去设置&#xff0c;只需要设置主从的密码就可以&#xff0c;然后就是protect-mode&#xff0c;我设置的是no&#xff0c;一定注意不能设置主从。客户端要访问&#xff0c;一定要加# 每个节点的 redis.conf 中 clust…

如何学习VBA_3.3.9:利用“搭积木”思想,快速有效地完成你的代码

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的劳动效率&#xff0c;而且可以提高数据处理的准确度。我推出的VBA系列教程共九套和一部VBA汉英手册&#xff0c;现在已经全部完成&#xff0c;希望大家利用、学习。如果您…

JSP程序设计之输入/输出对象 — response对象

response对象1.概述2.实例&#xff1a;response对象方法运用&#xff08;1&#xff09;实例一&#xff1a;页面自动刷新&#xff08;2&#xff09;实例二&#xff1a;实现页面重定向&#xff0c;具体的代码&#xff08;3&#xff09;综合实例&#xff1a;实现登录并记录用户名1…