🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:详细讲解了垃圾回收概述,包括什么是垃圾、为什么需要垃圾、Java中的垃圾收集机制。🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
🌈章节引出:
前一篇章:
从本章开始,将会引出一个在JVM学习中十分重要的概念——垃圾收集。
前面已经提过,垃圾收集技术并不是Java语言所独有的,如今垃圾收集技术已经是现代开发语言的标配了。但垃圾收集技术却是Java语言的招牌能力,其优秀的垃圾收集机制极大地提高了开发效率。
🌈章节速览:
夺命五连问
本章的内容主要是带领读者对垃圾收集的概念做初步了解,并为大家梳理了将来进一步学习垃圾收集的思路。下面总结几个关键问题——
什么是垃圾? 没有任何有效引用指向的对象就是垃圾。
为什么要进行垃圾收集? 提高内存的利用率,降低内存泄漏和内存溢出的风险,减少程序员的代码负担。
收集哪里的垃圾? Java 虚拟机运行时堆和方法区内存。
谁来进行垃圾收集? 垃圾收集器。
如何进行垃圾收集? 不同的区域使用不同垃圾收集算法的分代处理。
13.1什么是垃圾
想要搞清楚垃圾收集机制,首先要弄清楚第一个问题:什么是垃圾?
在 Java 官网中,对垃圾的定义为:
“An object is considered garbage when it can no longer be reached from any pointer in the running program.”
意思是
在运行的程序中,当一个对象没有任何指针指向它时,它就会被视为垃圾。
由此可以看出,判断一个对象是否为垃圾对象的关键标准就是是否有指针指向它。当一个对象没有任何指针指向它时,即说明该对象不再被引用。如果一个对象不被引用之后还继续留在内存中,被占用的空间也无法被其他对象使用,如果这些垃圾对象所占用的空间一直保留至程序结束,随着垃圾对象越来越多,将可能导致内存溢出。
对这种垃圾对象的清理就类似于我们熟悉的磁盘碎片整理,通过定时清理磁盘中的垃圾碎片,可以有效提升空间利用率。
那么,如何判断一个对象是否有指针指向它呢?
关于这一问题,开发人员有很多探讨,诞生了众多对象存活判定算法。这些内容将在14.1节中做详细讲解。
13.2为什么需要垃圾收集
现在,我们来回答第二个问题:为什么需要垃圾收集?
对于高级语言来说,一个基本认知是如果不进行垃圾收集,内存迟早都会被消耗完。
因为不断地分配内存空间而不进行回收,就好像不停地生产生活,而从来不打扫垃圾一样。垃圾对象可能散列在任意位置,它所占用的内存被回收后,就会出现零零散散的空位,这些零散的内存利用率是很低的,当需要申请一个较大对象的内存时,可能出现找不到一整块连续的可用的存储空间,
所以垃圾收集不仅是把垃圾对象所占用的内存进行回收, 还涉及内存的整理。【标志—清除算法不符合、复制算法与标志—清除—压缩算法符合。详细请移步:】
这就好比生活中的清洁、整理等家务,不仅要把垃圾扔掉,还要对物品进行规整,重新摆放,才能让家里看起来更干净整洁、空间利用率更高。
13.3.2 Java垃圾收集机制
lava 使用的是自动内存管理机制,有内存分配器和垃圾收集器来代为分配和回收内存。
【回扣第一章的Java的特性——简面线强健,高分动通解】
【《JAVA核心技术卷·I》——第一章——JAVA程序设计概述-CSDN博客】
自动内存管理机制使开发人员无须参与内存的分配和回收,将开发人员从繁重的内存管理工作中
解放出来,同时降低了内存泄漏和内存溢出的风险。
但是对于Java开发人员来说,自动内存管理就像一个黑匣子,如果过度依赖它,将会弱化开发人员在程序出现内存溢出等问题时定位和解决问题的能力。
所以,了解JVM的自动内存分配和垃圾收集机制就显得非常重要,只有在真正了解JVM 是如何管理内存后,我们才能够在遇OutOfMemoryError 问题时,快速地根据错误异常日志定位并解决问题。
如图13-1所示,Java的垃圾收集机制主要作用于运行时数据区中的堆和方法区(主要是堆,方法区都很少)(图中的虚线区域)。其中,堆是垃圾收集器的工作重点。
Java 的垃圾收集机制中有两个十分重要的概念,也是我们需要重点了解和学习的,分别是垃圾收集算法和分代算法。
在JVM中,垃圾收集算法主要有以下三种。
标记-清除算法。
复制算法。
标记-压缩-算法。
三种算法各有利弊,单独采用其中任何一种算法,都不能取得很好的效果。
所以在JVM中,会针对内存的不同区域采用不同的垃圾收集算法,这就是分代算法。
具体的内存区域如何划分,不同分区又需要采取何种垃圾收集算法,在第14章中将会详细讲解。
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈计算机科学入门系列 关注走一波💕💕
🌈🌈CSAPP深入理解计算机原理 关注走一波💕💕
🌈🌈微服务项目之黑马头条 关注走一波💕💕
🌈🌈redis深度项目之黑马点评 关注走一波💕💕
🌈🌈JAVA面试八股文系列专栏 关注走一波💕💕
🌈🌈JAVA基础试题集精讲 关注走一波💕💕
🌈🌈代码随想录精讲200题 关注走一波💕💕
总栏
🌈🌈JAVA基础要夯牢 关注走一波💕💕
🌈🌈JAVA后端技术栈 关注走一波💕💕
🌈🌈JAVA面试八股文 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套 关注走一波💕💕
🌈🌈数据结构与算法 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总 关注走一波💕💕
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!