JVM面试真题总结(三)

news2024/11/13 21:59:52

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

解释-下Full GC?

Full GC,也被称为Major GC,是Java中垃圾收集器的一种

  • 主要负责清理整个Java堆内存,包括年轻代(Young Generation)和老年代(Old Generation)。

在Java的内存模型中,堆内存被分为年轻代和老年代。

  • 年轻代主要用于存放新创建的对象,老年代主要用于存放生命周期较长的对象。
    • 当年轻代和老年代的空间都不足时,就会触发Full GC

Full GC的工作流程如下:

  • 首先,垃圾收集器会暂停应用程序的运行

    • 这个过程被称为Stop-The-World
  • 然后,垃圾收集器会标记出所有堆内存中无用(即不再被引用)的对象。

  • 最后,垃圾收集器会清理掉这些无用的对象,从而回收内存空间。

Full GC的特点是能够清理整个堆内存中的无用对象,但是运行速度较慢,因为它需要处理整个堆内存。

  • 此外,Full GC会暂停应用程序的运行,如果Full GC发生的频率过高,那么可能会严重影响程序的性能。

为了避免频繁触发Full GC,我们可以通过调整堆内存的大小

  • 或者优化程序的内存使用情况(例如,避免创建大量短生命周期的对象)来降低Full GC的频率。

在什么样的场景下,JVM会执行Ful GC?

Full GC,也被称为全局垃圾收集,主要是对Java堆内存中的新生代和老年代进行的垃圾收集。

  • Full GC通常会比Minor GC花费更多的时间,因为它需要检查整个堆空间。

以下是一些可能触发Full GC的情况:

老年代空间不足:

  • 如果新生代中存活的对象空间大于老年代的连续空闲空间
  • 或者Minor GC后老年代的空间利用率超过了某个阈值,就会触发Full GC

永久代(PermGen)或元空间(Metaspace)空间不足:

  • 如果要加载新的类,但是PermGen或Metaspace的空间不足,就会触发Full GC。
  • 这种情况在Java 8之前更为常见,因为Java 8已经移除了永久代
    • 使用元空间来存储类的元数据,并且元空间的大小默认只受限于系统内存。

手动触发:

  • 如果调用了System.gc()方法,或者使用了一些工具来请求垃圾收集,也会触发Full GC。

使用了某些JVM参数:

  • 例如,如果使用了-XX:+UseSerialGC参数,每次Minor GC后都会进行Full GC。

尽管Full GC可以清理整个堆空间,但是由于它的开销较大

  • 所以一般来说我们会尽量避免Full GC的发生。

通过合理的内存设置和垃圾收集器选择,可以降低Full GC的频率,从而提高应用的性能。

JVM如何判断一个对象是否可以被回收?

JVM主要通过两种方式来判断一个对象是否可以被回收:

引用计数法:

  • 这是一种简单的垃圾收集算法。
  • 每个对象都有一个引用计数器,当有一个地方引用它时,计数器就加1
  • 当引用失效时,计数器就减1。当计数器为0时,就表示该对象不可能再被使用,因此可以被回收。
  • 然而,引用计数法有一个明显的缺点,就是无法处理循环引用的情况。
  • 例如,对象A和对象B互相引用,但是没有其他地方引用它们,尽管它们已经无法被访问
    • 但是它们的引用计数器都不为0,因此无法被回收。
    • 由于这个原因,Java的垃圾收集器并没有采用引用计数法。

可达性分析算法:

  • 这是Java垃圾收集器采用的主要算法。
  • 在这种算法中,从一组称为GC Roots的对象(如类静态属性、常量、本地变量等)开始
  • 通过这些对象的引用,引用的引用,依次找出所有从GC Roots开始可达的对象
    • 未被找到的对象即为不再使用的,因此可以被回收。
    • 这种算法可以有效处理循环引用的问题,但是需要暂停应用程序的运行(Stop-The-World
    • 因此可能会影响应用程序的性能。

GC Roots是什么?请举例

GC Roots,或者说垃圾回收根,是垃圾收集器进行垃圾回收时的起始点。

在Java中,垃圾回收器通过跟踪GC Roots,找到所有从GC Roots开始的可达对象

  • 这些对象被认为是存活的,应该被保留。

无法从 GC Roots 达到的对象则认为是死亡的,可能会被垃圾回收器回收。

在 Java 中,可以作为 GC Roots 的对象包括以下几种:

虚拟机栈(栈帧中的本地变量表)中引用的对象

  • 也就是说,当前线程中的局部变量和输入参数。

方法区中类静态属性引用的对象

  • 也就是说,所有的静态变量。

方法区中常量引用的对象

  • 也就是说,所有被 final 修饰的常量。

本地方法栈中 JNI(即一般说的 Native 方法)引用的对象。

举个例子,假设你有一个类A,类A有一个静态变量B,B引用了一个对象C。

在垃圾回收时,类A就是一个GC Roots,因为它是一个包含静态变量的类。

  • 垃圾回收器会从类A开始,找到B,然后找到C,因此,C是从GC Roots可达的,不会被垃圾回收器回收。

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

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

相关文章

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…

string字符会调用new分配堆内存吗

gcc的string默认大小是32个字节,字符串小于等于15直接保存在栈上,超过之后才会使用new分配。

网络学习-eNSP配置多交换机VLAN

实验环境 通过华为eNSP软件实现 1.两台S3700交换机 2.四台电脑PC1:192.168.0.1PC2:192.168.0.2PC3:192.168.0.3PC4:192.168.0.4PC11:192.168.0.11PC22:192.168.0.22PC33:192.168.0.33PC44&…

SpringBoot开启多端口探究--基于多ApplicationContext

文章目录 前情提要一、思路概要二、具体实现三、其他问题父子关系部分依赖 总结 前情提要 前面探讨了management端口开启,grpc端口开启,本文继续探讨在SpringApplication中开启多个端口的方式之多ApplicationContext, 相比management端口基于多WebServe…

AI绘画工具排行榜:探索最受欢迎的AI绘图软件特点与选择指南

AI绘画工具各有优势,从开放性到对特定语言和文化的支持,以及对图像细节和艺术性的不同关注点,根据具体需求选择合适的工具 MidJourney 图片品质卓越,充满独特创意,初期能够免费获取数十账高质量图片,整个生…

uuid.js 使用

相关代码 import { NIL } from "uuid";/** 验证UUID* 为空 则返回 false* param uuid* returns {boolean}*/ export function MyUUIDValidate(uuid: any): boolean {if (typeof uuid "string" && uuid ! NIL) { //uuid ! NIL 判断是否是默认值00…

C++笔记---vector

1. vector的介绍 vector其实就是我们所熟知的顺序表,但其是作为STL中的一个类模板而存在。 也就是说,vector是可以用来存储任意类型数据的顺序表,既可以是内置类型,也可以是自定义类型,或是STL中的其他容器。 vecto…

学习算法的类型

学习算法的类型 一、说明 嘿,好奇的伙伴们!今天,让我们踏上一段激动人心的机器学习算法领域之旅。🚀 如果你和我一样,你可能会发现机器学习的世界非常迷人,有时甚至有点让人不知所措。但不要害怕&#xf…

Qt Widget核心属性

文章目录 前言enabledgeometrywindowTitlewindowIconwindowOpacitycursorfonttoolTipfocusPolicystyleSheet 前言 Qt中的各种控件,都是继承自QWidget类,了解这个类的属性方法之后,后续的控件也通用 enabled enabled描述了一个控件是否处于…

未来工作趋势:零工小程序在共享经济中的作用

经济在不断发展的同时,科技也在飞速发展。零工经济作为一种新兴的工作模式,正在全球范围内迅速崛起。特别是在中国,随着数字经济的蓬勃发展和共享经济模式的深入推广,零工小程序在促进就业、提升资源利用效率方面显示出了巨大的潜…

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和…

FreeRTOS学习笔记—②RTOS的认识及任务管理篇

由于正在学习韦东山老师的RTOS课程,结合了网上的一些资料,整理记录了下自己的感悟,用于以后自己的回顾。如有不对的地方请各位大佬纠正。 文章目录 一、RTOS的优势二、RTOS的核心功能2.1 任务管理2.1.1 任务的创建2.1.2 任务的删除*2.1.3 任…

Windows系统安装node.js环境并创建本地服务使用内网穿透发布至公网

目录 前言 1.安装Node.js环境 2.创建node.js服务 3. 访问node.js 服务 4.内网穿透 4.1 安装配置cpolar内网穿透 4.2 创建隧道映射本地端口 5.固定公网地址 前言 作者简介: 懒大王敲代码,计算机专业应届生 今天给大家聊聊Windows系统安装node.js环…

Arch - 架构安全性_认证(Authentication)的标准和实现

文章目录 OverView认证的标准认证的基础认证的范围认证的标准与实践HTTP认证框架Web认证(表单认证)WebAuthn标准认证流程示例:WebAuthn 小结 认证的实现JAASSpring Security 和 Shiro小结 OverView 即使只限定在“软件架构设计”这个语境下&…

MonoHuman: Animatable Human Neural Field from Monocular Video 精读

一、共享双向变形模块 1. 模块的核心思想 共享双向变形模块的核心目标是解决从单目视频中生成不同姿态下的3D人体形状问题。因为视频中的人物可能处于各种动态姿态下,模型需要能够将这些不同姿态的几何形状进行变形处理,以适应标准的姿态表示并生成新的…

# VMware 共享文件

VMware tools快速安装 VMware 提供了 open-vm-tools,这是 VMware 官方推荐的开源工具包,通常不需要手动安装 VMware Tools,因为大多数 Linux 发行版(包括 Ubuntu、CentOS 等)都包含了 open-vm-tools,并且已…

FreeRTOS内部机制学习02(消息队列深度学习)

文章目录 队列的核心以及好处队列的核心队列的好处 深入源码了解队列机制深入队列读取操作深入队列写入操作读写队列出超时时间 信号量深入信号量获取以及释放操作 互斥量互斥量和信号量的不同深入源码看优先级继承是怎么操作到的 队列的核心以及好处 队列的核心 队列的核心就…

如何打造高效办公楼物业管理系统?Java SpringBoot+Vue架构详解,实现智能化管理,提升工作效率

🍊作者:计算机毕设匠心工作室 🍊简介:毕业后就一直专业从事计算机软件程序开发,至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长:按照需求定制化开发项目…

GraphPad Prism 10 for Mac/Win:高效统计分析与精美绘图的科学利器

GraphPad Prism 10 是一款专为科研工作者设计的强大统计分析与绘图软件,无论是Mac还是Windows用户,都能享受到其带来的便捷与高效。该软件广泛应用于生物医学研究、实验设计和数据分析领域,以其直观的操作界面、丰富的统计方法和多样化的图表…

Redis中使用布隆过滤器解决缓存穿透问题

一、缓存穿透(失效)问题 缓存穿透是指查询一个一定不存在的数据,由于缓存中没有命中,会去数据库中查询,而数据库中也没有该数据,并且每次查询都不会命中缓存,从而每次请求都直接打到了数据库上,这会给数据…