首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
AI 模拟面试
简历
求职
学习
基础学习课
实战项目课
求职辅导课
专栏&文章
竞赛
搜索
我要招人
发布职位
发布职位、邀约牛人
更多企业解决方案
AI面试、笔试、校招、雇品
HR免费试用AI面试
最新面试提效必备
登录
/
注册
李培培201907311922894
合肥工业大学
发布于江苏
关注
已关注
取消关注
@AAA网络大牛:
Java 垃圾回收机制
面试必问:Java 垃圾回收机制 介绍 在 C/C++ 中,程序员负责对象的创建和销毁。通常程序员会忽略无用对象的销毁。由于这种疏忽,在某些时候,为了创建新对象,可能没有足够的内存可用,整个程序将异常终止,导致 OutOfMemoryErrors。 但是在 Java 中,程序员不需要关心所有不再使用的对象。垃圾回收机制自动销毁这些对象。 垃圾回收机制是守护线程的最佳示例,因为它始终在后台运行。 垃圾回收机制的主要目标是通过销毁无法访问的对象来释放堆内存。 重要条款: 无法访问的对象: 如果一个对象不包含对它的任何引用,则称其为无法访问的对象。另请注意,属于隔离岛的对象也无法访问。 Integer i = new Integer(4);// 新的 Integer 对象可通过 'i' 中的引用访问i = null;// Integer 对象不再可用。 垃圾回收的资格: 如果对象无法访问,则称该对象有资格进行 GC(垃圾回收)。在上图中,在 i = null 之后; 堆区域中的整数对象 4 有资格进行垃圾回收。 使对象符合 GC 条件的方法 即使程序员不负责销毁无用的对象,但如果不再需要,强烈建议使对象不可访问(因此有资格进行 GC)。 通常有四种不同的方法可以使对象适合垃圾回收。 取消引用变量 重新分配引用变量 在方法内部创建的对象 隔离岛 以上所有带有示例的方法都在单独的文章中讨论:如何使对象符合垃圾收集条件 请求 JVM 运行垃圾收集器的方式 一旦我们使对象符合垃圾收集条件,垃圾收集器可能不会立即销毁它。每当 JVM 运行垃圾收集器程序时,只会销毁对象。但是当 JVM 运行 Garbage Collector 时,我们无法预料。 我们还可以请求 JVM 运行垃圾收集器。有两种方法可以做到: 使用 *System.gc()* 方法:系统类包含静态方法 gc() 用于请求 JVM 运行垃圾收集器。 使用 *Runtime.getRuntime().gc()* 方法:运行时类允许应用程序与运行应用程序的 JVM 交互。因此,通过使用其 gc () 方法,我们可以请求 JVM 运行垃圾收集器。 // 演示请求 JVM 运行垃圾收集器的 Java 程序public class Test{ public static void main(String[] args) throws InterruptedException { Test t1 = new Test(); Test t2 = new Test(); // 取消引用变量 t1 = null; // 请求 JVM 来运行垃圾收集器 System.gc(); // 取消引用变量 t2 = null; // 请求 JVM 来运行垃圾收集器 Runtime.getRuntime().gc(); } @Override(992988) // 在垃圾回收之前,在对象上调用一次 finalize 方法 protected void finalize() throws Throwable { System.out.println("垃圾收集器调用"); System.out.println("对象垃圾收集:" + this); }} 输出: 垃圾收集器调用对象垃圾收集:haiyong.Test@7ad74083垃圾收集器调用对象垃圾收集:haiyong.Test@7410a1a9 笔记 : 不能保证以上两种方法中的任何一种都一定会运行垃圾收集器。 调用 System.gc() 等效于调用:Runtime.getRuntime().gc() 定稿 就在销毁对象之前,垃圾收集器调用对象的 finalize() 方法来执行清理活动。一旦 finalize() 方法完成,垃圾收集器就会销毁该对象。 finalize() 方法存在于具有以下原型的 Object 类中。 protected void finalize() throws Throwable 根据我们的要求,我们可以覆盖 finalize() 方法来执行我们的清理活动,例如关闭数据库连接。 笔记 : 垃圾收集器而不是 JVM 调用的 finalize() 方法。虽然垃圾收集器是 JVM 的模块之一。 对象类 finalize() 方法有空实现,因此建议覆盖 finalize() 方法来处理系统资源或执行其他清理。 对于任何给定的对象,finalize() 方法永远不会被多次调用。 如果 finalize() 方法抛出未捕获的异常,则忽略该异常并终止该对象的终结。 以上环境博主都是部署在cnaaa服务器 上的,感兴趣的伙伴可以自己部署相关的环境进行测试。有关 finalize() 方法的示例,请参阅 Java 程序的输出第十套之垃圾收集 让我们举一个真实的例子,在那里我们使用垃圾收集器的概念。 假设你去字节跳动实习,他们告诉你写一个程序,计算在公司工作的员工人数(不包括实习生)。要制作这个程序,你必须使用垃圾收集器的概念。 这是您在公司获得的实际任务:- 问: 编写一个程序来创建一个名为 Employee 的类,该类具有以下数据成员。\1. 一个 ID,用于存储分配给每个员工的唯一 ID。\2. 员工姓名。\3. 员工年龄。 另外,提供以下方法 - 用于初始化名称和年龄的参数化构造函数。ID 应在此构造函数中初始化。 显示 ID、姓名和年龄的方法 show ()。 显示下一个员工的 ID 的方法 showNextId ()。 现在对垃圾回收机制不了解的初学者可能会这样编写代码: //计算在公司工作的员工人数的程序class Employee{ private int ID; private String name; private int age; private static int nextId=1; //它是静态的,因为它在所有对象之间保持通用并由所有对象共享 public Employee(String name,int age) { this.name = name; this.age = age; this.ID = nextId++; } public void show() { System.out.println ("Id="+ID+"\nName="+name+"\nAge="+age); } public void showNextId() { System.out.println ("Next employee id will be="+nextId); }}class UseEmployee{ public static void main(String []args) { Employee E=new Employee("GFG1",33); Employee F=new Employee("GFG2",45); Employee G=new Employee("GFG3",25); E.show(); F.show(); G.show(); E.showNextId(); F.showNextId(); G.showNextId(); { //这是保留所有实习生的子块。 Employee X=new Employee("GFG4",23); Employee Y=new Employee("GFG5",21); X.show(); Y.show(); X.showNextId(); Y.showNextId(); } //这个大括号之后,X 和 Y 将被移除。因此现在它应该显示 nextId 为 4。 E.showNextId();//这一行的输出应该是 4,但它会给出 6 作为输出。 }} 现在获得正确的输出: 现在垃圾收集器(gc)将看到 2 个空闲的对象。现在递减 nextId,gc (garbage collector) 只会在我们的程序员在我们的类中覆盖它时调用方法 finalize () 。如前所述,我们必须请求 gc (garbage collector),为此,我们必须在关闭子块的大括号之前编写以下 3 个步骤。 将引用设置为 null(即 X = Y = null;) 调用,System.gc (); 调用,System.runFinalization (); 现在计算员工人数的正确代码(不包括实习生) // 计算不包括实习生的员工人数的正确代码class Employee{ private int ID; private String name; private int age; private static int nextId=1; //它是静态的,因为它在所有对象之间保持通用并由所有对象共享 public Employee(String name,int age) { this.name = name; this.age = age; this.ID = nextId++; } public void show() { System.out.println ("Id="+ID+"\nName="+name+"\nAge="+age); } public void showNextId() { System.out.println ("Next employee id will be="+nextId); } protected void finalize() { --nextId; //在这种情况下,gc 会为 2 个对象调用 finalize() 两次。 }}// 它是 Employee 类的右括号class UseEmployee{ public static void main(String []args) { Employee E=new Employee("GFG1",33); Employee F=new Employee("GFG2",45); Employee G=new Employee("GFG3",25); E.show(); F.show(); G.show(); E.showNextId(); F.showNextId(); G.showNextId(); { //这是保留所有实习生的子块。 Employee X=new Employee("GFG4",23); Employee Y=new Employee("GFG5",21); X.show(); Y.show(); X.showNextId(); Y.showNextId(); X = Y = null; System.gc(); System.runFinalization(); } E.showNextId(); }}
点赞 2
评论 1
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
03-21 16:31
门头沟学院 Java
Redis哨兵模式
ps:如果这篇帖子对于还在找工作和找实习的你有所帮助,可以关注我,给本贴点赞、评论、收藏并订阅专栏;同时不要吝啬您的花花Redis哨兵(Sentinel)是Redis官方推出的高可用解决方案,本质是一组独立运行的分布式监控进程,专为弥补Redis主从复制架构的单点故障短板而生。在主从模式中,主节点宕机后需人工切换主从、更新配置,无法保障服务连续性;而哨兵模式可实现自动监控、故障判断、主从切换、配置推送,让Redis集群在主节点故障时无感恢复服务,是生产环境Redis高可用部署的核心方案。一、哨兵模式核心四大功能哨兵集群并非单纯的监控工具,而是集监控、决策、切换、通知于一体的高可用组件,核心功能...
Redis集群
点赞
评论
收藏
分享
03-24 19:57
已编辑
哈尔滨工业大学 Python
硕士应届生求职,请大佬们指点
我是27年毕业,现在还没毕业在准备阶段,为9月校招先做准备,简历只有本科投硕士的,还没太改就不放了,我先介绍下自己。本科在吉林大学 仪器系 测控技术与仪器专业,毕业综测第二名,绩点3.895/4.0,保研硕士目前在哈工大本部 仪器系 仪器科学与技术英语比较差,擦边过的四级,六级还没考过,计算机拿了二级WPS和三级网络技术证拿过的奖,本科3次一等1次国励,还有个小社会奖学金,研一拿的入学特等。本科实践课很多很多很多,数电、模电、信号与系统、嵌入式、控制系统、微机原理这些理论课都有对应的实践课,要做小项目的,对应的学的东西是VHDL、焊接技术和画PCB板、MATLAB、单片机、PID算法、汇编语言...
点赞
评论
收藏
分享
02-26 11:47
大连科技学院 测试工程师
26届本科,这样的简历春招能拿到offer吗
明明就不饿:
看不懂你到底会啥,什么岗位
点赞
评论
收藏
分享
03-10 19:00
未填写教育信息 Java
2027届Java后端简历
求大佬指点,想找一份日常实习,可是投了快1000份,只有40个要了我的简历,只有两个面试机会,而且其中一个上来就要我签劳动合同我没同意,怎么办,出路在哪!!!
点赞
评论
收藏
分享
03-26 23:35
门头沟学院 Java
比心一面
一面:1.agent会话中redis是怎么存储的?key是怎么设置的?2.skills是具体是怎么设计的?3.工具是通过什么样的方式暴露给ai的?4.为什么没有选择使用mcp暴露?5.如果工作量特别大的话,把所有工具都塞给提示词会出现什么问题?6.在工具调用的情况下,比如说大模型调了一个不存在的工具,或者调用的时候参数传错了怎么办?你是怎么降低这个情况的?7.讲解一下ReAct框架8.ReAct框架有没有什么优缺点?9.说一下langchain和langgraph的区别?分别的痛点10讲一下项目中的langgraph的状态转移机制11.大模型产生幻觉的原因有哪些??有什么手段可以缓解这个问题1...
查看17道真题和解析
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
双非选手的求职的感悟
2758
2
...
美团暑期实习一面
2735
美团笔试好难
热聊中
3
...
阿里笔试竟然考了AI提示词。。。
2108
4
...
暑期结束,拥抱腾讯了
1683
中国电信328笔试
热聊中
5
...
双非两段大厂实习0offer,我做对了什么
1620
6
...
携程3.25Java开发二面面经
1596
7
...
字节一面-飞书后端暑期实习
1507
8
...
9本暑期实习完全没面试,哪里有问题?
1432
9
...
京东零售暑期一面
1329
10
...
快手暑期前端一面 3.25
1162
创作者周榜
更多
正在热议
更多
#
AI面会问哪些问题?
#
23595次浏览
467人参与
#
中国电信笔试
#
30373次浏览
278人参与
#
厦门银行科技岗值不值得投
#
7273次浏览
183人参与
#
你的实习产出是真实的还是包装的?
#
18200次浏览
325人参与
#
找AI工作可以去哪些公司?
#
7162次浏览
174人参与
#
春招至今,你的战绩如何?
#
57986次浏览
523人参与
#
米连集团26产品管培生项目
#
12864次浏览
284人参与
#
从事AI岗需要掌握哪些技术栈?
#
7177次浏览
229人参与
#
你做过最难的笔试是哪家公司
#
28256次浏览
172人参与
#
哪些公司真双非友好?
#
69051次浏览
286人参与
#
投递几十家公司,到现在0offer,大家都一样吗
#
339282次浏览
2159人参与
#
阿里笔试
#
174690次浏览
1292人参与
#
面试被问期望薪资时该如何回答
#
382382次浏览
2163人参与
#
一张图晒出你司的标语
#
3705次浏览
67人参与
#
晶盛机电求职进展汇总
#
35191次浏览
318人参与
#
面试尴尬现场
#
220577次浏览
860人参与
#
五一之后,实习真的很难找吗?
#
102761次浏览
583人参与
#
沪漂/北漂你觉得哪个更苦?
#
8839次浏览
183人参与
#
___岗狗都不干,我干!
#
77743次浏览
309人参与
#
HR最不可信的一句话是__
#
5361次浏览
109人参与
#
AI时代,哪个岗位还有“活路”
#
10383次浏览
318人参与
#
长得好看会提高面试通过率吗?
#
21160次浏览
245人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务