首页
题库
公司真题
专项练习
面试题库
在线编程
面试
面试经验
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
全部评论
推荐
最新
楼层
暂无评论,快来抢首评~
相关推荐
04-26 22:34
新易盛_软开
新易盛春招
不知道大家有没有听过咱们,在成都待遇绝对算中上,国内做光模块市场排名第七,一直在稳步向前,研发生产销售一体,所以平台很大,薪资方面最近连续两年普调,一个字 爽。下面的是内推链接和内推码,投递后简历优先筛选【内推链接】https://eoptolink.zhiye.com/campus/jobs?shareId=143ace7d-8508-42bb-820a-b3bfc52dda8a&shareSource=2&qr=1&memory=%7B%7D&silence=1内推码:ES3430【企业背景】专注耕耘光通信领域20余年AI、数据中心、5G,都是我们的行业标签...
新易盛公司福利 104人发布
点赞
评论
收藏
分享
04-28 15:49
北京邮电大学 Java
救救孩子,暑期offer帮选
java选手,秋招目标国央企银行后端开发选择一:腾讯csig腾讯云-后台开发,组里是做大数据的,害怕进去变成sql boy影响秋招选择二:荣耀通用软件开发,但是还在泡池子,往年经验可能6月份才能有结果腾讯红围脖上写了6月3日入职,现在就是很纠结腾讯title好,但是怕数开实习到时候秋招业务不垂直等于白实习#腾讯##暑期实习##荣耀##国央企##牛客AI配图神器##offer比较##offer帮选##大数据开发##后端#
牛客246793191号:
听说五一之后会开一批奖,不建议等荣耀
投递腾讯等公司10个岗位 >
点赞
评论
收藏
分享
04-14 11:53
河南科技大学 Java
双非本科,简历挂麻了,帮看看吧
😭
点赞
评论
收藏
分享
03-11 02:16
武汉生物工程学院 Java
25 0 offer😭😭😭到底要怎么才能拿到offer啊,深夜emo了
群星之怒:
1.照片可以换更好一点的,可以适量P图,带一些发型,遮住额头,最好穿的正式一点,可以适当P图。2.内容太少。建议添加的:求职意向(随着投递岗位动态更改);项目经历(内容太少了建议添加一些说明,技术栈:用到了什么技术,还有你是怎么实现的,比如如何确保数据传输稳定的,角色注册用到了什么技术等等。)项目经历是大头,没有实习是硬伤,如果项目经理不突出的话基本很难过简历筛。3.有些内容不必要,比如自我评价,校内实践。如果实践和工作无关千万别写,不如多丰富丰富项目。4.排版建议:建议排版是先基础信息,然后教育背景(要突出和工作相关的课程),然后专业技能(一定要简短,不要长篇大论,写你会什么,会的程度就可以),然后是项目经历(一定要详细,占整个简历一定要超过一半,甚至超过百分之70都可以)。最后如果有一部分空白的话可以填补上校内获得的专业相关的奖项,没有就写点校园经历和自我评价。5.技术一定要够硬,禁得住拷打。还有作息尽量保证正常,不要太焦虑。我24双非本科还是非科班,秋招春招各找了一段实习结果都没有转正,当时都想噶了,最后6月份在校的尾巴也找到一份工作干到现在,找工作有时很看运气的不要急着自我否定。 加油
点赞
评论
收藏
分享
04-26 23:36
地平线_运营_HR
地平线内推
其实最难的不是offer,而是进入了公司,发现累的要死,很多同学进入了工作后,朋友圈就没有更新过了,所以大家在签约的时候一定要打听清楚! 目前的重点还是先尽量投,尽量拿到!offer就和抢演唱会票一样,抢完第一波之后等回流了,大佬拿着再多意向书,最后也只能签一个,,越厉害的,拿的offer越多,且都是非线性增长的,只要上面的人释放完意向,紧接着链式反应,大家都会有有offer的另外投递不同岗位需要根据JD准备不同简历。不同岗位对岗位要求不一样,写简历一定要根据JD去更改简历,这样才能做到符合岗位要求,不会连HR筛选都没过;内容要尽量充实,能够反映个人能力或特点; 内推直接看这里【岗位类别】项...
地平线公司福利 424人发布
点赞
评论
收藏
分享
评论
点赞成功,聊一聊 >
点赞
收藏
分享
评论
提到的真题
返回内容
全站热榜
更多
1
...
左手敲代码的程序员,不配拥有offer吗?
5.7W
2
...
暑期后端高频问题汇总
5.7W
3
...
和ai聊天,忍不住爆哭
5553
4
...
给你看看给大学生开10k的前端面经长啥样
4800
5
...
一写代码就哭,因为毕设想退学了
4495
6
...
快手投诉后续- HR把我拉黑了!
4369
7
...
拼多多服务端信息确认
3866
8
...
5.1假期你投不投简历
3649
9
...
毕业之后,大家就会回到自己的阶级
3475
10
...
27 日常实习 蔚来一、二面
3237
创作者周榜
更多
正在热议
更多
#
国企还是互联网,你怎么选?
#
122340次浏览
943人参与
#
找工作,行业重要还是岗位重要?
#
8267次浏览
105人参与
#
五一之后,实习真的很难找吗?
#
46748次浏览
336人参与
#
盲审过后你想做什么?
#
12940次浏览
116人参与
#
应届生进小公司有什么影响吗
#
67208次浏览
984人参与
#
小厂实习有必要去吗
#
42328次浏览
260人参与
#
领导秒批的请假话术
#
10155次浏览
76人参与
#
设计人如何选offer
#
98546次浏览
690人参与
#
外包能不能当跳板?
#
22263次浏览
191人参与
#
五一假期,你打算“躺”还是“卷”?
#
33072次浏览
448人参与
#
考研可以缓解求职焦虑吗
#
21474次浏览
252人参与
#
如果校招重来我最想改变的是
#
245302次浏览
2781人参与
#
面试等了一周没回复,还有戏吗
#
115907次浏览
1078人参与
#
大疆的机械笔试比去年难吗
#
69706次浏览
603人参与
#
硬件人,你被哪些公司给挂了
#
46862次浏览
724人参与
#
如果有时光机,你最想去到哪个年纪?
#
43419次浏览
770人参与
#
找工作前vs找工作后的心路变化
#
7245次浏览
64人参与
#
秋招前后对offer的期望对比
#
271861次浏览
2075人参与
#
一句话证明你在找工作
#
291711次浏览
2391人参与
#
面试中,你被问过哪些奇葩问题?
#
63622次浏览
777人参与
牛客网
牛客企业服务