《面试1v1》垃圾回收机制

news2024/9/21 19:09:04

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。

面试官: 小伙子,跟我聊聊垃圾回收机制吧。什么是垃圾?怎么回收?

候选人: 好的面试官,来吧!垃圾就是那些不再被程序使用的对象。Java 通过自动的垃圾回收机制回收这些垃圾对象所占的内存。

面试官: 那Java垃圾收集器都有哪些?各有什么优缺点?

候选人: Java 提供了几种垃圾收集器:

  • Serial 收集器:最基本的收集器,对内存进行复制然后清理,效率low。只使用一个线程,会停顿其他线程,不适用服务器环境。
  • Parallel 收集器:多个线程并行回收,效率高于Serial,适用于微服务等。
  • CMS 收集器:并发标记清除,效率高,并发回收,但会产生碎片。适用于对响应时间有要求的场景。
  • G1 收集器:JDK9默认,基于region分代回收,效率高且不产生碎片。适用于大内存的机器。

面试官: 讲讲G1垃圾收集器的工作流程。

候选人: G1垃圾收集器的工作流程如下:

  1. 初始标记:标记GC Roots能直接关联的对象,速度快,主要为了第2步做准备。
// 代码示例
private void markFromRoots() {
    // classify objects and put them into correct lists
    for (Object obj : strongRefs) {
        G1CollectedHeap.addToMarked(obj);
    }
}
  1. 并发标记:从GC Roots开始对堆中对象进行并发标记,jia部分STW(stop-the-world)
  2. 最终标记:修正并发标记期间并发修改导致的错误标记,需要STW。
  3. 筛选回收:根据标记结果筛选回收区域,回收垃圾对象,需要STW。
  4. 并发清理:与用户线程一起工作,对标记和筛选阶段差异化技术产生的垃圾链进行清理。

以上就是G1收集器的整个工作流程,相比CMS无碎片和高效,适用于大内存服务器。

面试官: 那说说 Java 对象如何判断为“垃圾”?

候选人: Java 对象通过引用计数算法判断是否为垃圾:

  1. 如果一个对象仅被强引用变量引用,并且这个强引用变量为 null,则该对象为垃圾。
// 对象example引用为null,则该对象为垃圾
Example example = new Example();  
example = null;  
  1. 如果一个对象被强引用的变量引用,并且这个强引用变量所在的方法已经弹出栈,则该对象为垃圾。
// 方法退出后,obj为垃圾
public void func() {
    Example obj = new Example();
}  
  1. 如果一个对象仅被软引用、弱引用或虚引用变量引用,则在垃圾回收时这些变量会被清除,该对象为垃圾。
// 使用WeakReference例子 
WeakReference<Example> weakExample = new WeakReference<>(new Example());
// 如果没有其他引用指向Example对象,则该对象可被回收
  1. 如果两个对象彼此引用,但没有任何一个对象被外部强引用,则这两个对象之间形成的循环引用链为垃圾。
// A和B相互引用,构成循环,都为垃圾
A a = new A(b);
B b = new B(a);

面试官: 帮我总结下 Java 垃圾回收的机制?

候选人: 可以这么总结 Java 垃圾回收机制:

  1. 垃圾的判断:通过引用计数算法判断对象是否可达。如被引用变量置null、超出作用域、软引用被清理等,则判断为垃圾。
  2. 垃圾的回收:通过垃圾收集器进行自动回收,如Serial、Parallel、CMS、G1等收集器。使用分代回收、标记-清除、复制算法等进行回收。
  3. 垃圾回收的时机:当堆中垃圾对象达到一定比例或内存不足时,会触发垃圾回收。也可以手动触发System.gc()
  4. 垃圾回收的步骤:1标记阶段标记垃圾 2清除阶段删除垃圾 3整理阶段压缩空间
  5. 如何优化:尽量减少垃圾产生,使用软引用或弱引用存放易变对象,及时回收资源等方式优化。

以上就是 Java 垃圾回收机制的主要内容,希望能对你有所帮助!有任何问题都可以继续问我。

面试官: 那谈谈你了解的JVM内存结构和垃圾回收之间的关系?

候选人: JVM内存结构与垃圾回收有密切关系:

  1. JVM内存结构分为:堆内存、虚拟机栈、方法区、本地方法栈、程序计数器等。堆内存存储对象实例,垃圾回收的主要区域就是堆内存。
// JVM内存结构图示
   +--------------------+
   |      方法区        |  
   +--------------------+
   |     程序计数器      |
   +--------------------+  
   |        JVM栈        |      
   +--------------------+  
   |                     |  
   |     堆内存           |    
   |                     |  
   +--------------------+  

  1. 堆内存中又分为几个区域,主要有两个:新生代和老年代。新生代用于存储新创建的对象,老年代中存放老化对象。
   +--------------------+
   |     方法区        |  
   +--------------------+
   |     程序计数器      |
   +--------------------+  
   |        JVM栈        |      
   +--------------------+  
   |  新生代            |  
   |                     |  
   |     堆内存           | 
   |                     |  
   |   老年代             |    
   +--------------------+  
  1. 垃圾收集器会根据这些内存区域中的对象进行回收,比如新生代使用Copying算法,老年代使用Mark-Sweep算法。

  2. 情景举例:

  • 对象在Eden出生,经过第一次Minor GC后未死亡进入Survivor,多次MinorGC后仍存活进入老年代。
  • 老年代空间不足触发Major GC,回收部分垃圾对象。
  • 老年代的对象通过晋升至永久代,如果永久代填满,会抛出OOM异常。

面试官: 嗯!啊。

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!

🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

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

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

相关文章

Spring Boot定时任务

目录 1.概述 2.Spring Boot定时任务 2.1.快速使用 2.2.cron表达式 3.业务示例 3.1.业务描述 3.2.业务实现 4.实现原理 5.自定义线程池 1.概述 在某些业务场景中&#xff0c;需要定时执行一些任务&#xff0c;有可能是定时统计然后生成报表&#xff0c;有可能是定时发…

Python自定义函数

目录 1. 语法 2. 常见用法 2.1. 函数的返回值 2.2. 函数互相调用 3. 实战练习 3.1. 定义执行Linux命令的函数 1. 语法 #定义函数 def 函数名(参数1, 参数2):函数体(代码块)......#调用函数(定义函数时使用了参数&#xff0c;调用也必须使用参数) 函数名(参数1, 参数2) 定…

React学习6 路由

SPA的理解 单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 什么是路由? 一个路由就是一个…

网络连接管理除了TCP三次握手,还有TCP四次挥手

网络连接管理除了TCP三次握手&#xff0c;还有TCP四次挥手 TCP三次握手&#xff0c;TCP四次挥手 网络连接管理除了TCP三次握手&#xff0c;还有TCP四次挥手TCP三次握手TCP四次挥手总结 TCP三次握手 网络通信建立连接&#xff0c;TCP会进行三次握手&#xff0c;三次握手主要是两…

【叠高高】叠蛋糕游戏的微信小程序开发流程详解

记得小时候玩过的搭积木游戏吗&#xff0c;和叠高高游戏原理差不多的&#xff0c;与之类似的还有盖高楼游戏&#xff0c;就是看谁盖的&#xff08;叠的&#xff09;最高&#xff0c;这里讲一下比较基础的叠高高游戏小程序实现过程&#xff0c;对编程感兴趣的同学可以参考学习一…

Linux Shell 实现一键部署Rust1.69

rust 前言 一门赋予每个人&#xff0c;构建可靠且高效软件能力的语言。 全世界已有数百家公司在生产环境中使用 Rust&#xff0c;以达到快速、跨平台、低资源占用的目的。很多著名且受欢迎的软件&#xff0c;例如 Firefox、 Dropbox 和 Cloudflare 都在使用 Rust。从初创公司…

网络安全工程师的入门学习路径,年薪30W不是梦!

最近看到网上有很多人在问诸如&#xff1a;“怎样成为网络信息安全工程师”等相关问题&#xff0c;这可能与近几年网络安全事件频发&#xff0c;国家对于互联网信息安全和互联网舆情的重视程度不断提升有关&#xff0c;网络信息安全工程师随之成为炙手可热的职业。 首先&#…

Web的基本漏洞--文件包含漏洞

目录 一、文件包含漏洞的介绍 1.文件包含漏洞的原理 2.常见的文件包含函数 3.文件包含漏洞的分类 本地文件包含漏洞 远程文件包含漏洞 3.文件包含漏洞的危害 4.文件包含漏洞的防范措施 5.文件包含漏洞的绕过手法 空字符绕过 超长字符绕过 一、文件包含漏洞的介绍 1…

5年经验之谈:月薪3000到30000,测试工程师的变“行”记

自我介绍下&#xff0c;我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触…

你需要知道的 Selenium4 新特性

前言 最近又用到了Selneium&#xff0c;发现已经来到了 4.9 版本了。本篇文章来介绍下它较比 Selenium3 的一些新特性。 记录下&#xff0c;当是做笔记了。 最令人惊喜的是&#xff0c;Selenium4 会自动回收浏览器资源。 本文所使用的 Selenium 版本为 4.9.9 知识点&#x1f4…

开发一个收废品小程序步骤

随着环保意识的提升和可持续发展的迫切需求&#xff0c;废品回收成为了一个重要的议题。预约上门回收小程序的开发为用户提供了方便、快捷的废品回收服务&#xff0c;促进了废品资源的再利用和环保行动的推进。本文将介绍开发预约上门回收小程序的流程&#xff0c;以帮助开发人…

java12--本章作业

1. 第1题 public class Hello{public static void main(String[] args){Person[] persons new Person[3];persons[0] new Person("zsq", 18, "学生");persons[1] new Person("zzq", 19, "大学生");persons[2] new Person("zq…

【leetcode】1130. 叶值的最小代价生成树

1130. 叶值的最小代价生成树 1、问题描述2、解决方案2.1、动态规划2.1.1、问题分析2.1.2、代码实现 2.2、单调栈 1、问题描述 1130. 叶值的最小代价生成树 给你一个正整数数组 arr&#xff0c;考虑所有满足以下条件的二叉树&#xff1a; 每个节点都有 0 个或是 2 个子节点。数…

一文3000字实现基于Selenium+Python的web自动化测试框架

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefo…

2.4 IDEA开发词频统计项目

一、词频统计准备工作 &#xff08;一&#xff09;启动集群的HDFS与Spark 启动HDFS服务 启动Spark集群 &#xff08;二&#xff09;在HDFS上准备单词文件 在master虚拟机上创建单词文件 - words.txt 将单词文件上传到HDFS指定目录/wordcount/input 二、本地模式运行Sp…

RCE漏洞演示,墨者靶场

#案列演示 打开墨者靶场&#xff0c;黑盒#命令注入执行分析 这个功能点有这么个功能&#xff0c;进行类似的像我们电脑上ping命令&#xff0c;这相当于就满足了命令&#xff0c;明显可能出现命令执行漏洞&#xff0c;可控变量和漏洞函数都存在。第一要去分析是什么操作系统&am…

批量 ping 网段的终极方法

我们分析和判定网络故障&#xff0c;如果有 10 设备&#xff0c;100 台设备&#xff0c;1000 台设备怎么办&#xff1f;一个个 ping 过去人都要疯掉了&#xff0c;这种情况在大型网络中我们有可能遇到&#xff0c;那怎么办呢&#xff1f;来听听海翎光电小编的一点看法吧&#x…

Spark写入Hive报错Mkdir failed on :com.alibaba.jfs.JindoRequestPath

1. 报错内容 23/05/31 14:32:13 INFO [Driver] FsStats: cmdmkdirs, srcoss://sync-to-bi.[马赛克].aliyuncs.com/tmp/hive, dstnull, size0, parameterFsPermission:rwx-wx-wx, time-in-ms32, version3.5.0 23/05/31 14:32:13 ERROR [Driver] ApplicationMaster: User class …

八大技术架构——升级之路

目录 一、单机架构 简介 工作原理 架构优缺点 相关软件 二、应用数据分离架构 简介 工作原理 架构优缺点 三、应用服务集群架构 简介 出现原因 工作原理 架构优缺点 相关软件 四、读写分离/主从分离架构 简介 工作原理 架构优缺点 相关软件 五、冷热分离架…

JMeter数据库性能测试指南:全面掌握基础操作

1.网络请求时间 2.数据库查询的时间 数据库性能指标 TPS:每秒事务数&#xff08;一秒钟服务器处理的事务数&#xff0c;事务指&#xff0c;请求出去到响应回来的整个过程的时间&#xff09; QPS:每秒查询量&#xff08;就是数据库每秒执行的SQL数量&#xff0c;包含insert/…