Java 垃圾收集器

Java 的七种垃圾收集器 用C或C++这样的编程语言写一个应用时,需要编写代码来销毁内存中不再需要的对象。当应用程序扩展得越来越复杂时,未使用对象被忽略释放的可能性就越大。这会导致内存泄露,最终内存耗尽,在某个时刻将没有更多的内存可以分配。结果就是应用程序运行失败并出现OutOfMemoryError错误。但在Java中,垃圾收集器GarbageCollection(GC)会在程序执行过程中自动运行,减轻了手动分配内存和可能的内存泄漏的任务。... 阅读详情


原创天涯问路 最后发布于2019-12-05 14:46:21 阅读数 32  已收藏
展开
面试 GC 相关的问题有:

垃圾回收算法有哪些:引用计数、复制、标清、标压
垃圾收集器有哪些:Serial、Parallel、CMS、G1、ZGC
垃圾回收的方式有哪些:串行、并行、并发标记清理、分区并发------分别对应上方垃圾收集器
GC 算法(引用计数、复制、标清、标压)是理论,垃圾收集器是具体实现

主要垃圾收集器:

串行垃圾收集器-Serial:为单线程环境设计且只使用一个线程进行回收,会暂停所有的用户线程。所以不适合服务器环境
并行垃圾收集器-Parallel:多个垃圾回收线程并行工作,此时用户线程是暂停的,适用于科学计算、大数据处理、首台处理等弱交互场景
并发垃圾收集器-CMS(ConcMarkSweep):并发标记清除。用户线程和垃圾收集器线程同时执行(不一定是并行,也可能是交替执行),不需要暂停用户线程。互联网公司多用它,适用于对响应时间有要求的场景
G1-GarbageFirst:将对内存分割成不同的区域然后并发的进行垃圾回收
ZGC ( java11 之后新增 ) 
如何查看默认的垃圾收集器:

Terminal 输入命令:java -XX:+PrintCommandLineFlags -version

java -XX:+PrintCommandLineFlags -version
-XX:InitialHeapSize=267121280 
-XX:MaxHeapSize=4273940480 
-XX:+PrintCommandLineFlags 
-XX:+UseCompressedClassPointers 
-XX:+UseCompressedOops 
-XX:-UseLargePagesIndividualAllocation 
-XX:+UseParallelGC
java version "1.8.0_162"
Java(TM) SE Runtime Environment (build 1.8.0_162-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.162-b12, mixed mode)
可以看到 -XX:+UseParallelGC ,即使用的是并行垃圾收集器

默认垃圾收集器有:

UseSerialGC
UseSerialOldGC(已弃用)
UseConcMarkSweepGC
UseParNewGC
UseParallelGC
UseParallelOldGC
UseG1GC


     由上图可知,新生代(Young Gen)用 Serial、Parallel、ParNew这三种垃圾收集器;老年代(Old Gen)用SerialOld、ParallelOld、ConcMarkSweep这三种垃圾收集器。而G1两者都可用。

项目中如何选择垃圾收集器

单 CPU 或小内存,单机程序: -XX:+UseSerialGC
多 CPU ,需要大吞吐量,如后台计算型应用:-XX:+UseParallelGC 或者 -XX:+UseParallelOldGC
多 CPU,追求低停顿时间,需快速响应如互联网应用:-XX:+UseConcMarkSweepGC 或者 -XX:+UseParNewGC


如何查看当前用的是哪个垃圾收集器:

Terminal输入命令:jps -l ,获取进程编号
Terminal输入命令:jinfo -flag UseParallelGC 进程编号,输出 -XX:+UseParallelGC 说明是用的该类收集器;输出                -XX:-UseParallelGC 说明不是该类收集器。+相当于是,-相当于不是。
G1垃圾收集器

       G1-GarbageFirst 是一种服务器端的垃圾收集器,应用在多处理器和大容量内存环境中,在实现高吞吐量的同时,尽可能满足垃圾收集暂停时间的要求。另外还有以下特性:

与 CMS 收集器一样,可以和应用程序并发执行
整理空闲空间更快
需要更多的时间来预测 GC 的停顿时间
不希望牺牲大量的吞吐性能
不需要大量的 Java Heap
相比之下,以前收集器的特点:

年轻代和老年代是各自独立且连续的内存块
年轻代收集使用单 eden+S0+S1进行复制算法
老年代收集必须扫描整个老年代区域
都是以尽可能少而快速的执行GC为设计原则
       CMS 收集器虽然减少了暂停应用程序的运行时间,但还是存在着内存碎片的问题,于是,为了解决内存碎片的问题,同时又保留低暂停时间的有点,Java7 就发布了一个 G1垃圾收集器。

       G1 收集器的设计,目的就是为了取代 CMS 收集器,G1 与 CMS 相比,有何区别?(面试题)

有整理内存过程,不会产生很多内存碎片
STW(Stop The World)更可控,G1 在停顿时间上添加了预测机制,让用户可以手动配置停顿时间
       G1 是在 2012年才在jdk1.7u4中可用。oracle计划在jdk9中将 G1 变成默认的垃圾收集器以替代 CMS 。它是一款面向服务端应用的收集器,主要应用在多 CPU 和大内存服务器环境下,极大减少垃圾收集的停顿时间,全面提升服务器的性能,逐步替换 java8 以前的 CMS 收集器。

主要改变是 Eden、Survivor和Tenured等内存区域不是连续的了,而是变成了一个个大小一样的 region,每个region从1M到32M不等,一个 region 可能属于 Eden、Survivor 或者 Tenured内存区域。

G1 特点总结:

能充分利用多 CPU、多核环境的硬件优势,尽量缩短 STW
整体上采用 “标记-压缩” 算法,局部使用 “复制” 算法,不会产生内存碎片
宏观上不再区分 “老年代” 和 “新生代” ,把内存划分成独立的子区域 —Region
将整个内存区域混合在一起,但其本身依然在小范围内要进行年轻代和老年代的区分,保留了新生代和老年代,但他们不再是物理隔离的,而是一部分 Region 的集合且不需要 Region是连续的,也就是说依然会采用不同的 GC 方式来处理不同区域
G1 虽然也是分代收集器,但整个内存区不存在物理上的年轻代和老年代的区别,也不需要完全独立的survivor(to space)堆做复制准备。G1 只有逻辑上的分代概念,或者说每一个分区都可能随 G1 的运行在不同的代之间前后切换。
最大的好处是化整为零,避免全内存扫描,只需按照区域扫描。
 
————————————————
版权声明:本文为优快云博主「天涯问路」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.youkuaiyun.com/S_Alics/article/details/103364110

Java JVM 中的垃圾收集器及其配置指南 Serial GC: 单线程,适用于小型应用。: 多线程,适用于需要高吞吐量的应用。是 JDK 8 的默认垃圾收集器。: 并发垃圾收集,适用于低停顿时间需求的应用。: 平衡吞吐量和停顿时间,是 JDK 9+ 的默认垃圾收集器。: 超低延迟垃圾收集器,适用于需要极低停顿时间的大内存应用。: 类似于 ZGC,也是超低延迟垃圾收集器。Epsilon GC: 无操作垃圾收集器,主要用于测试和基准分析。在选择 Java 的垃圾收集器时,应根据应用程序的特点和需求来选择最合适的垃圾收集器。 阅读详情

相关推荐

基于KiCad的STM32最小系统设计实战案例(含PCB布线)

手把手带你用KiCad完成STM32最小系统设计,涵盖原理图绘制、封装匹配、规则约束设置及关键信号PCB布线技巧;全程基于开源EDA工具KiCad,强调实操细节与常见坑点规避。

weixin_42452483的博客 361

Java 流处理之收集器

每一个小流遍历完成之后,都会产生一个小的中间结果,需要将这些小的中间结果合并成一个大的中间结果。Collectors(java.util.stream.Collectors) 是一个工具类,内置若干收集器,我们可以通过调用不同的方法快速获取相应的收集器实例。Java 会在合适的时机自动调用 BinaryOperator.apply() 方法,将小的中间结果合并成大的中间结果。supplier() 方法会返回一个 Supplier 实例,调用该实例的 get() 方法,会创建一个中间结果容器。

Chenhui98的博客 460

Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么)

Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么) 目录 Unity ECS 之 Entitas 的简单介绍,插件下载、导入,和简单使用(一篇文入门搞懂ECS是什么) 一、简单介绍 二、一些专有项简介 Entity Context Group Collector Matcher System Feature 三、注意实现 四、ECS 的下载 Github 上下载 Unity Asset Store 中下载 U...

仙魁XAN 7780

JAVA-收集器

collect顺次收集流中的所有元素,进行某种处理之后得到一个结果,它是一个终端操作。

xjsj62728的博客 1330

【OpenSearch】从零到一:手把手搭建OpenSearch与Dashboard可视化平台

本文提供了一份详细的OpenSearch与Dashboard可视化平台从零搭建指南。内容涵盖环境准备、系统调优、核心服务安装配置、Dashboard部署与汉化,以及生产环境安全加固建议,帮助用户快速构建一个功能完整的搜索与分析平台。

devops8pract的博客 617

Ubuntu22.04上如何用Docker一键部署Ragflow+Ollama(附CUDA配置避坑指南)

本文详细介绍了在Ubuntu22.04系统上使用Docker一键部署Ragflow+Ollama的完整流程,特别提供了CUDA配置的避坑指南。从硬件兼容性检查、驱动安装到容器网络配置,手把手教你搭建本地化大模型环境,解决CUDA驱动冲突等常见问题,助力开发者快速构建AI应用开发平台。

weixin_26875109的博客 285

垃圾收集器

垃圾收集器(Garbage Collector, GC)是Java虚拟机(JVM)中的一个关键组件,它自动地管理和释放不再使用的对象所占用的内存空间。这样可以防止内存泄漏,并简化了开发者的编程任务。

斌斌(Java) 1342

virtuoso根据原理图绘制版图并联接_virtuoso画原理图

Virtuoso Schematic Editor 电路仿真一、Virtuoso Schematic Editor 实验目的:掌握电原理图(schematic)设计输入方法。 [1]启动 IC Design 软件 启动 软件: 开机后运行......2.绘制原理图 新建工程后打开的是默认的原理图文件 SCHEMATIC1 PAG...存盘 完成原理图的绘制后,将原理图存盘. 三 . 用 Check...

weixin_33536190的博客 4147

Java 8实战(九)- Collectors收集器

Java 8实战(九)- Collectors收集器

及时当勉励,岁月不待人 2935

【ComfyUI 基础教程】ComfyUI 局部重绘工作流教程

本篇指南将带你了解 ComfyUI 中的局部重绘工作流,并带你完成一个局部重绘的示例,以及遮罩编辑器的使用等。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 303

【生产实践】PostgreSQL高可用Patroni安装(超详细已踩坑)

一 安装Patroni 0 Patroni 对Python的版本要求 我安装的是Patroni最新版本 :4.0.3,Patroni 对Python 版本有要求,没有具体的版本矩阵,但是根据每个版本发布信息可以得到以下信息 Patroni 4.0 需要 Python 3.8 以上(可以根据下面发布版本信息推理出) Version 3.0.2 Version 3.0.2 dropped support of Python older than 3.6. 版本3.0.2不再支持3.6版本以下的P

DBA之路的博客 1742

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

现在市面上充斥着许多对于JVM垃圾收集器教程,有零基础的,有专讲的 ... 这些教程或文章大都长篇大论的细扣字眼,内容繁多且没有重点,看过便会忘,本篇集结了9年老JAVA工作经验,专讲面试和工作中使用到的,一站式讲解,帮助你疏通学习脉络,少走弯路。

猫步轻移,以学求知。余于此方寸之地,如猫观鼠,细察技艺所得,思维所悟。灵思如猫之警觉,日积月累,终成智海; 2153

Linux 下安装 openjdk 17【详细步骤】

JDK17,安装教程。

甘蓝的专栏 7510

Java中的垃圾收集器

java中的垃圾收集器

sugarxxc的博客 3092

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

什么是垃圾收集器?Java中有哪些垃圾收集器?

垃圾收集器(Garbage Collector, GC)是Java虚拟机(JVM)中的一个重要组件,它的主要任务是自动管理内存,回收不再被引用的对象所占用的内存空间。Java中的垃圾收集器使开发者无需手动释放内存,从而减少了内存泄漏和内存管理错误的风险。垃圾收集器的基本原理是通过追踪对象的引用情况,识别出那些不再被引用的对象,并回收它们所占用的内存。标记:标记出所有存活的对象。清除:清除未被标记的对象,释放它们的内存。压缩:将存活的对象压缩到内存的一端,以便腾出连续的内存空间,减少内存碎片。

程序员学习园地。 822

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Java的垃圾收集器

不同的垃圾收集器适用于不同的应用场景和性能需求。选择合适的垃圾收集器可以显著提升应用的性能和响应时间。Serial收集器:适用于单核处理器或小型应用。Parallel收集器:适用于多核处理器,追求高吞吐量的应用。CMS收集器:适用于对响应时间有较高要求的应用。G1收集器:适用于大内存、多处理器的系统,追求高吞吐量和低停顿时间的应用。ZGC收集器:适用于需要极低延迟的应用。Shenandoah收集器:适用于需要极低延迟的应用。Epsilon收集器:适用于特定性能测试或内存分配有限的系统。

xycxycooo的博客 1223

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Java常见的垃圾收集器

Java的垃圾收集器是JVM的重要组成部分,它负责自动管理不再使用的对象的内存。然而,在一些内存较小的环境中,Serial Old收集器仍然是一个不错的选择,因为它可以有效地管理内存,避免内存泄漏。G1收集器是Java 7引入的一个新的垃圾收集器,它被设计为满足具有大量内存的多核处理器的需求。G1收集器将堆内存划分为多个独立的块,并根据每个块中垃圾的数量和回收的预计时间,优先回收垃圾最多的块。它是一个单线程的收集器,在进行垃圾收集时,必须暂停其他所有的工作线程,直到它收集结束。

让每一行代码都有改变世界的力量 1406

Java常用的垃圾收集器

在上一篇文章中,我们介绍了Java的垃圾回收机制,包括什么时候回收垃圾,标记垃圾的算法以及回收垃圾的算法。这篇文章我们主要来介绍Java的垃圾收集器。 在介绍垃圾收集器之前,我们首先需要知道一些必要的概念。 Stop the world 顾名思义,“Stop the world”就是  JVM 由于要执行 GC 而停止了其他应用程序的运行,在任何 GC 算法中都可能会发生。假设有这么一个场景,你的...

weixin_34212189的博客 191

Java垃圾收集器

java垃圾收集器主要分为两种,串行和并行。 顾名思义,串行是单线程的,并行是多线程的。当垃圾收集器回收时,程序会停止运行,并行回收适合吞吐量大的系统。什么是吞吐量:吞吐量表示在单位时间内通过某个网络或接口的数据量 ,包括全部上传和下载的流量。 Serial收集器 Serial(串行)垃圾收集器是最基本、发展历史最悠久的收集器; JDK1.3.1前是HotSpot新生代收集的唯一选择,最稳定效率...

qq_28631935的博客 342

java 查看垃圾收集器_查看JVM使用的默认的垃圾收集器

一、查看步骤cmd执行命令:java -XX:+PrintCommandLineFlags -version输出如下(举例):针对上述的-XX:UseParallelGC,这边我们引用《深入理解Java虚拟机:JVM高级特性与最佳实践》的介绍:也就是说,打开此开关,使用的垃圾收集器是:新生代(Parallel Scavenge),老年代(Ps MarkSweep)组合。二、更新于2020-07-1...

weixin_36269709的博客 1017

Java8 默认的垃圾收集器

在Java中使用Metaspace(元空间)而移除了PermGenspace(永久区)。设置JVM的参数PermSize和MaxPermSize时会被忽略并给出警告。但是类的元数据信息(metadata)还在,只是不再存储在连续的堆空间中,而是移动到了被称为”Metaspace(元空间)”的本地内存(Native memory)中。结果分析:由结果可以看出Java8的GC情况是:-XX:+UseParallelGC,即Parallel Scavenge(新生代) + Parallel Old(老生代)。

26857259 483

java 查看垃圾收集器_Java 查看垃圾收集器命令

常见收集器1、UseParNewGC:并发串行收集器,它是工作在新生代的垃圾收集器,它只是将串行收集器多线程化,除了这个并没有太多创新之处,而且它们共用了相当多的代码。它与串行收集器一样,也是独占式收集器,在收集过程中,应用程序会全部暂停。但它却是许多运行在Server模式下的虚拟机中首选的新生代收集器,其中有一个与性能无关但很重要的原因是,除了Serial收集器外,目前只有它能与CMS收集器配合...

weixin_39529128的博客 684

java垃圾收集器总结

java垃圾收集器总结1.Serial收集器2.ParNew收集器3.Parallel Scavenge4.Serial Old收集器5 Parallel Old收集器6.CMS收集器G1收集器导入 如果说手机算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。内存回收如何进行是由虚拟机所采用的GC收集器决定的,而通常虚拟机中往往不止有一种GC收集器,这里记录一下HotSpot中有哪些G...

qq_35148758的博客 294
上一篇: JVM系列三:JVM参数设置、分析
下一篇: 设置仅仅是在高压力, 多CPU, 高内存环境下设置
王树民
博客等级 码龄10年 912粉丝 560原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值