金三银四面试题(四):Full GC 和 Minor GC

如何触发Full GC?这是面试中的高频题。同样了解Full GC和Minor GC对于理解Java应用程序的性能和内存管理非常重要。

区分 GC

在此之前,我们要搞清楚,什么是Full GC,什么是Minor GC?

Minor GC

Minor GC是Java虚拟机(JVM)中一种部分垃圾回收(Partial Garbage Collection)操作,通常是指对新生代(Young Generation)进行的垃圾回收。

在Java堆内存中,对象通常被划分为新生代和老年代两个部分。新生代用于存放新创建的对象,大部分对象在创建后很快就会变得不可达并被回收。因此,新生代的对象存活时间很短。而老年代则用于存放存活时间较长的对象。

Minor GC主要针对新生代进行回收。它的目标是清理掉不再被引用的对象,并将存活的对象移到老年代。在Minor GC过程中,通常使用的是一种称为“复制”(Copying)的垃圾回收算法。这种算法将新生代分为两个部分:Eden空间和两个Survivor空间。当对象被创建时,它们会被放入Eden空间中。在Minor GC发生时,Eden空间中的存活对象会被移到其中一个Survivor空间中,而非存活对象则被回收。随着垃圾回收的多次迭代,一部分存活对象会被移到另一个Survivor空间中,直到达到一定的阈值后被晋升到老年代。

Minor GC通常会比Full GC快,因为它只关注新生代的对象,而不需要扫描整个堆内存。因此,它的停顿时间通常较短,不会对应用程序造成过大的影响。

Full GC

Full GC(Full Garbage Collection)是Java虚拟机(JVM)中的一种完全垃圾回收操作。与Minor GC只清理新生代(Young Generation)相比,Full GC会清理整个堆内存,包括新生代和老年代。Full GC通常是在新生代和老年代都需要进行垃圾回收时触发的。

Full GC的目标是回收所有未使用的对象,以释放内存空间并减少堆内存的使用。在Full GC过程中,Java虚拟机会暂停应用程序的所有线程,然后扫描整个堆内存,标记和清理所有未使用的对象。Full GC的停顿时间通常比Minor GC长,因为它需要扫描整个堆内存,而不仅仅是一部分。

如何触发Full GC

触发Full GC 执行的情况有如下六种。

1. 旧生代空间不足

只有在新生代对象转入及创建为大对象、大数组时才会出现旧生代空间不足的现象,当执行Full GC 后空间仍然不足,则抛出OutOfMemoryError: Java heap space

所以调优时应尽量做到让对象在Minor GC 阶段被回收、让对象在新生代多存活一段时间及不要创建过大的对象及数组。

2.永久代(Java8之后是元空间)空间满

永久代中存放的一些class 的信息等,当系统中要加载的类、反射的类和调用的方法较多时,永久代可能会被占满,此时会执行Full GC。如果经过Full GC 仍然回收不了,那么JVM 会抛出 OutOfMemoryError: PermGen space ,为避免永久代占满造成Full GC 现象,
可采用的方法为增大永久代空间或转为使用CMS GC。

3.CMS遇到promotion failed 和concurrent mode failure

当使用CMS垃圾收起,注意GC 日志中是否有promotion failed 和concurrent mode failure两种状况,当这两种状况出现时可能会触发Full GC。

  • promotionfailed 是在进行Minor GC 时,
    survivor space 放不下、对象只能放入旧生代,而此时旧生代也放不下造成的;
  • concurrent mode failure 是在执行CMS GC 的过程中同时有对象要放入旧生代,而此时旧生代空间不足造成的。

不过我们可以增大survivorspace、旧生代空间或调低触发并发GC 的比率,并通过设置- XX:CMSMaxAbortablePrecleanTime=5(单位为ms )来设置CMS在标记-清理阶段的最大中止时间。

4.统计得到的Minor GC晋升到旧生代的平均大小大于旧生代的剩余空间

这是一个较为复杂的触发情况,Hotspot 为了避免由于新生代对象晋升到旧生代导致旧生代空间不足的现象,在进行Minor GC 时,做了一个判断,如果之前统计所得到的Minor GC 晋升到旧生代的平均大小
大于旧生代的剩余空间,那么就直接触发Full GC。例如程序第一次触发MinorGC 后,有6MB的对象晋升到旧生代,那么当下一次Minor GC 发生时,首先检查旧生代的剩余空间是否大于6MB,如果小于6MB ,则执行Full GC。当新生代采用PSGC 时,方式稍有不同,PS GC 是在Minor GC 后也会检查,例如上面的例子中第一次Minor GC 后,PS GC 会检查此时旧生代的剩余空间是否大于6MB,如小于,则触发对旧生代的回收。

5.RMI 强制定期进行Full GC

对于使用RMI 来进行RPC 或管理的Sun JDK应用而言,默认情况下会一小时执行一次Full GC。可通过在启动时通过-java-Dsun.rmi.dgc.client.gcInterval=3600000 来设置Full GC 执行的间隔时间或通过-XX:+ DisableExplicitGC 来禁止RMI 调用System.gc。

6.手动进行Full GC

通过 System.gc() 或者 Runtime.getRuntime().gc() 的调用触发Full GC。

总结

Full GC和Minor GC是Java应用程序内存管理的重要组成部分,了解它们的工作原理和影响对于优化应用程序的性能、提高稳定性和可靠性至关重要。

往期文章

金三银四面试题(一):JVM类加载与垃圾回收

金三银四面试题(二):数据库缓存的数据一致性

金三银四面试题(三):JVM内存模型

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity构建详解(3)——SBP的依赖计算

【前置知识】 先要搞清楚Asset和Object的关系,可以简单理解为一个Asset对应多个Object。 unity自定义的Asset也要有一个存储的标准,其采用的是YAML,我们看到的所有Unity自定义的Asset格式,例如.prefab(预制体&#x…

基于SSM框架的酒店预订系统

基于SSM框架的酒店预订系统的设计与实现 摘要 当今世界的互联网信息技术飞速发展,网络化的工作模式已经几乎覆盖到各个工作领域中的业务内,人们的日常生活也渐渐离不开互联网。因此,在当下全国各处的酒店都开始构建起了自己的网络预订系统。…

Win11文件右键菜单栏完整显示教程

近日公司电脑升级了win11,发现了一个小麻烦事,如下图: 当我想使用svn或git的时候必须要多点一下,这忍不了,无形之中加大了工作量! 于是,菜单全显示教程如下: 第一步:管…

Java前端控制器模式

文章目录 以下是Java前端控制器模式的主要组成部分和工作原理:组件与角色:工作流程:应用场景与优势: Java Web应用程序示例 Java前端控制器模式是一种软件设计模式,它在构建基于Java的Web应用程序时特别有用&#xff0…

基于springboot实现在线拍卖系统项目【项目源码+论文说明】

基于springboot实现在线拍卖系统演示 摘要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍…

2024/3/23打卡数组分割(第14届蓝桥杯)——二项式+快速幂

题目 思路 分析该题,要将集合 划分成两个子集 ,且两个子集的和都是偶数。 可知:偶数 偶数 偶数;偶数 奇数 奇数;奇数 奇数 偶数; 分析可得:如果该集合的和为奇数,就不能分…

jQuery实现的会员中心安全修改表单特效代码

jQuery实现的会员中心安全修改表单特效代码是一款实现了可以修改登录密码,交易密码,手机号码,实名认证,电子邮箱,安全设置表单,会员表单等设置效果的代码 下载地址 https://www.qqmu.com/2635.html

卡行领航家用户端是怎么拼团怎么挣钱的?

#领航家代理政策/怎么代理/奖金制度/双2.0模式# 全国V:ok1234vip 领航家用户端:0.52费率 一次拼团0.44费率 两次拼团0.36费率 三次拼团0.2费率 ………… 十次拼团,客户每月挣20480 领航家代理端:无押激活返现高达166/台 分润万5-万…

智慧公厕的全域感知、全网协同、全业务融合和全场景智慧赋能

公共厕所是城市的重要组成部分,为市民提供基本的生活服务。然而,传统的公厕管理模式存在诸多问题,如排队等候时间长、卫生状况差、空气质量差等,严重影响市民的出行和生活质量。为了解决这些问题,智慧公厕应运而生&…

Spring IOC 容器的加载过程(bean 的创建过程)

Spring IOC 容器的加载过程(bean 的创建过程) 配置Bean 通过xml或者是Component Bean 等进行配置 解析Bean,得到BeanDefinition定义对象 通过 BeanDefintionReader 将 bean 进行解析,准备要创建的bean对象的定义对象BeanDefinition,存放到Be…

ATA-2048高压放大器在医疗中的作用是什么

高压放大器在医疗设备和医学应用中发挥着至关重要的作用。它们是一种专用的电子设备,用于放大医学图像和信号,以便医生能够更准确地诊断和治疗病患。下面西安安泰将详细介绍高压放大器的作用、原理和应用领域。 高压放大器是专门设计用于处理医学图像和信…

CrossOver虚拟机软件2024中文版最新功能介绍

CrossOver是一款由CodeWeavers公司开发的,运行在Mac和Linux操作系统下,能够模拟Windows系统应用运行环境的软件。它不需要用户单独安装Windows操作系统,就能让Windows平台上的应用程序在Mac和Linux上顺畅运行。CrossOver在技术上使用了Wine&a…

【数据存储】TIDB和MySQL的区别

1.TIDB和MySQL对比 对比内容MySQLTiDB架构设计一个传统的单机数据库系统,采用主从复制和分区表等方式来实现水平扩展一个分布式的 NewSQL 数据库,采用分布式存储和分布式事务等技术,支持水平扩展和高可用性事务支持 InnoDB 存储引擎来支持事…

一篇文章给你讲清楚正常卷积与深度可分离卷积

文章目录 正常卷积深度可分离卷积深度卷积逐点卷积 对比代码实现查看(torch实现)结果 正常卷积 也就是我们平常用的比较普遍的卷积: 它的参数量是:112,即: ( 卷积核大小) ∗ 输入通道 ∗ 输出…

【JavaEE】_Spring MVC项目获取URL中的参数

目录 1. 单参数 2. 多参数 1. 单参数 .java文件如下: package com.example.demo.controller;import com.example.demo.Person; import org.springframework.web.bind.annotation.*;import java.util.Arrays; import java.util.List;RequestMapping("/Para&…

MFC 打开类向导中方法时提示对com组件的调用返回了错误 HRESULT E_FAIL

解决:头文件中要分类,把virtual和afx_msg等放在一起,不要交叉错开。 MFC(Microsoft Foundation Class)中的virtual关键字用于声明虚函数。虚函数是C中实现多态的一种机制,它允许派生类重新定义基类中的虚函…

FreeRtos学习笔记(12)systemView 分析任务调度情况

FreeRtos学习笔记(12)systemView 分析任务调度情况 使用stm32f429 freertosV10.5.1 systemView 3.5 keil AC5 systemView 移植 从官网下载 systemView 软件 将下面文件添加到工程中 freertos 修改 systemView 需要 FreeRTOSConfig.h 开启如下宏, …

UE小:CesiumForUnreal使用教程

联网模式(需要翻墙) 直接打开工程并点击Cesium插件图标然后点击connect to Cesium ion进行账号注册即可使用 见到如界面后点击Allow并返回UE编辑器(如果无法打开认证界面请先访问https://ion.cesium.com/并且不要关闭,再次点击co…

Fendi Club啤酒:畅享时尚的味蕾之旅

在这个追求个性与品味的时代,Fendi Club啤酒以其时尚的魅力,领着时尚潮流与味蕾的完善结合。它不仅是一款啤酒,更是一种生活态度的象征,让我们一起踏上这场畅享时尚的味蕾之旅。 Fendi Club啤酒的特别之处在于它对品质的别致追求。…

SQL映射文件

一、SQL映射的xml文件 1.1 mapper元素 二、select 三、别名与Java映射 四、resultMap 啊