首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
昨天 09:09
浙江大学 算法工程师
京东 C++ 一面,聊了一个小时,问得又广又杂
投的是京东基础架构部门的 C++ 后端开发岗,一面是电话面试,面试官语速很快,上来先聊了十分钟背景,然后直接进技术。整体风格是广度优先,覆盖面很宽,C++ 基础、内存管理、并发、网络、项目都有,但每道题不会问得特别深,感觉是在快速扫描知识面。项目聊了将近二十分钟,他对项目里用到的技术选型很感兴趣,问了不少为什么这么选。最后有一道手撕,难度不高,时间也够。总时长刚好一个小时,整体节奏很快,没有太多思考时间。1. 自我介绍,介绍一下你的实习经历和做过的项目2. 你提到用过消息队列,为什么要引入 MQ,解决了什么问题,选型上为什么选这个而不是其他的?答:引入 MQ 主要解决三个问题:解耦、异步、削峰...
C++八股文全集
点赞
评论
收藏
分享
03-24 12:31
河南理工大学 后端工程师
佬们帮看看简历啊
焦虑中,不知道怎么办了。。。
西北上单:
应该放俩项目合理一些 我是一个业务开发项目 一个AI项目和你这个写的亮点差不多
你的简历改到第几版了
点赞
评论
收藏
分享
03-04 09:01
门头沟学院 Java
26学院本春招
牛友们,都说春招对于我们这种学院本会更友好,为什么boss上都是直接回复不合适,连简历都没机会发出去,牛友们能看看这个简历有什么问题吗。
点赞
评论
收藏
分享
02-28 13:25
已编辑
门头沟学院 Java
这种简历可以吗,大四
大四学院本 想冲刺一下春招但是学历直接被刷不知道是不是简历问题有没有牛油帮忙锐评一下
怎么起名字:
学历问题,学院别碰后端,测试和前端运维实施可以看看
你的秋招简历被谁挂了?
点赞
评论
收藏
分享
03-26 09:23
厦门大学 驱动开发
先定方向再投简历,事半功倍
一、单片机工程师单片机工程师负责设计、开发与维护基于单片机的电子系统,需具备扎实的电子技术基础及编程技能。他们负责设计、开发和维护基于单片机的电子系统,确保系统的稳定性、可靠性和性能。单片机工程师需要具备扎实的电子技术基础,熟悉各种单片机型号及其应用,同时还需要掌握相关的编程和调试技能。薪资待遇方面, 单片机工程师的薪资水平因地区和公司而异。一般来说,大型科技公司或知名高校提供的薪资水平相对较高。此外,随着经验的积累和技能的提升,单片机工程师的薪资也有望逐步增长。发展前景方面, 单片机工程师在嵌入式开发领域具有广阔的发展空间。随着物联网、智能制造等新兴领域的快速发展,单片机工程师的需求量也在不...
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
双非选手的求职的感悟
2758
2
...
美团暑期实习一面
2735
美团笔试好难
热聊中
3
...
阿里笔试竟然考了AI提示词。。。
2108
4
...
暑期结束,拥抱腾讯了
1683
中国电信328笔试
热聊中
5
...
双非两段大厂实习0offer,我做对了什么
1620
6
...
携程3.25Java开发二面面经
1596
7
...
字节一面-飞书后端暑期实习
1507
8
...
京东零售暑期一面
1329
9
...
快手暑期前端一面 3.25
1162
10
...
感谢信
1099
创作者周榜
更多
正在热议
更多
#
AI面会问哪些问题?
#
25451次浏览
503人参与
#
中国电信笔试
#
31261次浏览
283人参与
#
开放七大实习专项,百度暑期实习值得冲吗
#
14283次浏览
210人参与
#
你的实习产出是真实的还是包装的?
#
19009次浏览
331人参与
#
如果秋招能重来,我会____
#
96755次浏览
500人参与
#
春招至今,你的战绩如何?
#
60845次浏览
553人参与
#
厦门银行科技岗值不值得投
#
7574次浏览
186人参与
#
i人适合做什么工作
#
36960次浏览
124人参与
#
我是面试官,请用一句话让我破防
#
79579次浏览
219人参与
#
金三银四,你的春招进行到哪个阶段了?
#
21613次浏览
277人参与
#
哪些公司真双非友好?
#
69287次浏览
287人参与
#
投递几十家公司,到现在0offer,大家都一样吗
#
340090次浏览
2167人参与
#
找AI工作可以去哪些公司?
#
7931次浏览
194人参与
#
从事AI岗需要掌握哪些技术栈?
#
7916次浏览
258人参与
#
面试尴尬现场
#
220823次浏览
861人参与
#
五一之后,实习真的很难找吗?
#
102824次浏览
584人参与
#
你做过最难的笔试是哪家公司
#
30816次浏览
197人参与
#
应届生第一份工资要多少合适
#
20537次浏览
84人参与
#
聊聊你的职场新体验
#
336119次浏览
1893人参与
#
你小时候最想从事什么职业
#
159859次浏览
2072人参与
#
阿里笔试
#
176790次浏览
1303人参与
#
一张图晒出你司的标语
#
3925次浏览
72人参与
牛客网
牛客网在线编程
牛客网题解
牛客企业服务