[java基础] 写给大忙人的垃圾回收机制

JavaGC,基本上是两年以上经验面试必问的面试题,今天咱们来扒一扒他。
Java GC就是所谓的垃圾回收.今天来通过5w1h法,你如果记住这六个点,对于垃圾回收你就算基本掌握了。

  • 什么是GC
  • GC所作用的空间
  • GC的执行时间
  • GC的都执行了什么
一.什么是GC?

GC就是我们平常所说的垃圾回收。在程序运行过程中,会有很多的对象不再使用但是还占用着内存,这些就是内存里的垃圾,如果不及时清除就会造成内存溢出,那么怎样及时的把内存的垃圾清理出来,就是GC要做的事情。

二.GC所作用的空间是哪?

jvm中,程序计数器、栈区和方法区的生命周期都是与线程一致的,是随线程生而生,随线程灭而灭的,栈区会随方法的开始和结束进行入栈和出栈,所以栈区实现了自动清理,因此垃圾回收主要是在堆区和方法区进行垃圾回收。

三.GC什么时候执行呢?

1.system.gc()
2.系统自身决定GC触发的时机,主要是在年轻代和老年代部分,他们分别有不同的执行时间。
GC分为Minor GC(年轻代GC)和Full GC(老年代GC)
Minor GC的触发条件:当Eden区满时,触发Minor GC。
Full GC 的触发条件:
a.老年代空间不足时;
b.年轻代GC完成后,老年代盛不下时;
c.方法区空间不足时;

四.GC都执行了什么

要想进行垃圾回收,咱们得先垃圾的标准定义出来,现在有两个垃圾定义的标准。

1.怎么判断一个对象可以被可以被回收呢(成为垃圾呢)?

1)引用计数:每个对象,都有一个计数属性,每增加一个引用对象,就会对计数加1,当计数属性为0时,就代表这个对象不再被使用,可以回收了。这个方法不能解决对象之间相互引用的问题。
2)可达性分析算法:GC root开始向下搜索,搜索走过的路径即为引用链,当这个对象到root没有引用链时,就代表这个对象不可用,这也是jvm当前使用就是该算法。

2.常用的垃圾回收算法

GC常用算法有:标记-清除算法,标记-压缩算法,复制算法,分代收集算法。
目前主流的JVM(HotSpot)采用的是分代收集算法。

(1)标记-清除算法

在标记阶段,给每一个对象记录一个是否清除的标记,记录对象的存活状态(活着or死亡);在清除阶段,把标记为死亡的对象清除掉,也就是执行GC。只是该方法因为不会移动对象,所以会产生大量的垃圾碎片。会造成内存的浪费。
在这里插入图片描述

(2)标记-整理算法

标记整理是标记清除的改进版,在标记阶段,给每个对象记录是否清除的标记,记录对象的存活状态(活着or死亡)。在整理阶段,把已使用所有存活的对象整理一下,然后把其他对象都清除掉。这就是标记-整理算法。该算法解决了内存碎片的问题,但是如果存活对象比较多的话,效率会降低。
在这里插入图片描述

(3) 复制算法

该算法把内存分为两块,每次只使用一半,暂叫它A区和B区,假如当前使用的是A区,回收时,
会把A区的存活的对象都复制到B区,然后把A区清空,如果清空B区,再把存活对象复制到A区,B区清空。这种算法既解决了内存碎片问题,也解决了效率问题,但是该算法会浪费一半的内存空间。
在这里插入图片描述

(4)分代收集法

现在虚拟机垃圾收集大多采取这种方式,jvm就是之一。它根据对象的存活时间分为 年轻代(Young)和老年代(Tenure)。因为在年轻代的对象生存周期短,所以使用了复制算法,而老年代对象存活率较高,所以使用标记-清除或者标记-整理算法。
具体来说,年轻代(Young)又分为 伊甸园区(Eden区)和From区和To区
在这里插入图片描述
当系统创建新对象时,总是在Eden区,当Eden区被占满时,就会触发一次YoungGC,即年轻代的垃圾回收。它会把Eden区存活的对象复制到From区。
在这里插入图片描述
这时,Eden区已经被清空了,可以继续创建新对象了,当Eden再次满时,就触发youngGC,注意,这个次不太一样哦,这次GC,它会把Eden区和From区的存活对象都复制到To区。
在这里插入图片描述
再下次YoungGC时,就会把To区和Eden区的都复制到From区。
在这里插入图片描述
经过若干次YoungGC后,在From区和To区搬了游荡了几圈后,(Jvm是15次,因为美国是15岁成年)jvm就不耐烦了,既然他们还没挂掉,那就直接丢到老年代吧。这样就省去了这部分对象每次YoungGC的重复的复制(从from到to)。
在这里插入图片描述
老年代经过几次折腾,也扛不住了(空间被用完),那就来一次大扫除吧(FullGC),这是全量清除,会暂停程序运行的,所以如果频繁的FullGC,无疑就是程序断断续续的运行,会极大的影响它的性能,所以要合理的设置年轻代和老年代的大小 ,尽量减少FullGC的操作。

五.总结

根据GC的工作原理,我们可以通过一些技巧,让GC 运行的更有效率,更加符合程序的需要。一些小建议:
1.就是尽早的释放无用对象的引用。因为大的对象和数组比较占用内存,引用相对比较复杂,对于这些对象,GC对他们的回收效率一般比较低。所以如果程序允许,尽早将不用的对象赋值为null。这样可以让GC更有效率,减少无故的程序停止。
2.当程序有一定的等待时间,程序员可以手动执行System.gc(),通知GC运行,但是Java语言规范并不能保证GC一定会执行。使用增量式GC可以缩短Java程序的暂停时间。

看完三件事

如果你觉得这篇内容对你挺有启发,我想邀请你帮我三个小忙:
1.点赞,让更多的人也能看到这篇内容(收藏不点赞,都是耍流氓 -_-)
2.关注我,我会不定期分享原创知识。
3.也看看其它文章

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Java核心技术是计算机科学领域中最重要的编程语言之一,广泛应用于软件开发、云计算和大数据处理等领域。为了方便大忙人下载学习,以下是关于Java核心技术的一些下载建议。 首先,您可以在Oracle官方网站上获取Java开发工具包(JDK)。JDK提供了编译和运行Java程序所需的各种工具和库文件。您可以根据您的操作系统版本选择合适的JDK版本进行下载。下载完成后,按照安装向导进行安装即可。 其次,您可以在Java官方网站上找到Java编程语言规范的文档。这些规范描述了Java语言的语法、语义和特性,是学习Java编程的基础。您可以选择下载最新版本的Java语言规范,并阅读文档以便更好地理解Java编程语言的使用和设计原则。 此外,Java核心技术维护者还提供了丰富的教程和示例代码,以帮助程序员更好地学习和应用Java。您可以在Java官方网站上找到官方发布的教程和手册,这些资源涵盖了Java核心技术的各个方面,包括面向对象编程、多线程、异常处理和网络编程等。同时,您还可以在开源社区中找到大量的Java教程和示例代码,如GitHub等,这些资源通常由开发者们共享,能够帮助您更深入地学习和理解Java核心技术的实际应用。 最后,您可以考虑加入Java技术社区和论坛,与其他Java开发者进行交流和分享。这些社区和论坛通常提供了丰富的学习资源和讨论区,您可以在这里提问、解答问题,并与其他人共同探讨Java核心技术的应用和发展趋势。 总之,通过以上的下载和学习建议,您将能够更轻松地获取和学习Java核心技术。希望这些信息对您有所帮助,祝您在学习和应用Java核心技术的过程中取得成功! ### 回答2: 亲爱的大忙人, 首先,让我向您致以诚挚的问候。我知道您很忙,但我相信对您来说,学习Java核心技术是非常重要的。因此,请允许我为您提供一些下载Java核心技术的途径。 首先,您可以前往Oracle官方网站,他们提供了最新版本的Java Development Kit(JDK)下载。JDK是编写和运行Java程序所必需的软件包。您可以在Oracle官方网站上找到针对不同操作系统和版本的JDK下载链接。 另外,您还可以加入Java开发者社区,例如GitHub或Stack Overflow。这些社区为Java开发者提供了大量的学习资源和交流平台。您可以在这些社区上查找和下载Java核心技术的代码示例、项目实例和经验分享。 此外,还有一些在线教育平台,如Coursera、Udemy和MOOC等,这些平台提供Java核心技术的线上课程。您可以通过这些课程系统性地学习Java的核心知识,并在实践中提升自己的技能。 最后,我建议您购买一本权威的Java核心技术教材,如《Java核心技术 卷一:基础知识》。这本书由Horstmann和Cay S. Horstmann编写,被广泛认可为Java技术的权威指南。 尊敬的大忙人,请一定要为自己的学习留出时间。学习Java核心技术将为您的职业生涯带来巨大的价值和机会。如果您有任何疑问或需要更多帮助,请随时与我联系。 祝您学习顺利,事业腾飞! 此致 敬礼 ### 回答3: Java核心技术是指在Java编程语言中必须具备的基本技术,是Java程序开发的基石。对于大忙人来说,以下是关于Java核心技术下载的说明: 首先,您可以通过访问Oracle官方网站来下载Java核心技术的最新版本。在官方网站上,您可以找到Java Development Kit(JDK),它包括了编译器、调试器和其他开发工具。您可以选择适合您操作系统的版本进行下载和安装。 此外,您还可以通过其他第三方的合法渠道来获取Java核心技术的学习资料和相关书籍。这些资料可以帮助您理解Java编程语言的基本原理和核心概念,并提供实例和案例来帮助您更好地掌握技术。 另外,如果您有时间,您也可以考虑参加Java编程的培训课程。培训机构通常会提供有关Java核心技术的详细教学内容以及实践项目,有助于您更加系统地学习和掌握Java编程技术。 最后,如果您想了解关于Java核心技术的最新动态和技术分享,您可以通过参加Java开发者社区的线上或线下活动来获取信息。这些社区经常组织技术讲座、研讨会和交流活动,提供了与其他Java开发者互动和分享经验的机会。 总之,要下载并学习Java核心技术,您可以从官方网站、第三方资源、培训课程和开发者社区等多个途径获取相关的学习资料和交流机会。通过合理规划和利用碎片时间,您可以逐步掌握Java核心技术,并在实际项目中应用和提升您的编程能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值