文章目录
前言
java提供了自动的垃圾回收机制,使程序员不用过多地操作内心管理问题。自动化的内存分配和来及回收方式已经成为 了现代开发语言必备的标准。
一、自动内存管理
1.1 不回收垃圾会怎么样?
1.内存迟早都会被消耗完,就好像不停地生产生活垃圾 而从来不打扫一样
2.垃圾回收以便 JVM 将整理出的内存分配给新的对象
3.随着应用程序所应付的业务越来越庞大、复杂,用户越来越多,没有垃圾回收 就不能保证应用程序的正常进行。
1.2 自动内存管理的优点
1.无需开发人员手动参与内存的分配与回收,这样降低内存泄漏和内存溢出的风险
2.将程序员从繁重的内存管理中释放出来,可以更专心地专注 于业务开发
1.3自动内存管理的担忧
1.自动内存管理就像是一个黑匣子,如果过度依赖于 “自动”,那么这将会是一场灾难,最严重的就会弱化 Java 开发人员在程序出现内存溢出时定位问题和解决问题的能力。
2.只有在真正了解 JVM 是如何管理内存后,我们才能够在遇见 OutofMemoryError 时, 快速地根据错误异常日志定位问题和解决问题
3.当垃圾收集成为系统达到更高并 发量的瓶颈时,我们就必须对这些“自动化”的技术实施必要的监控和调节。
二、应该关心哪些区域的回收?
Java 堆是垃圾收集器的工作重点
从次数上讲:
频繁收集年轻代区
较少收集老年代区
基本不收集元空间(方法区)
三、 如何确定垃圾?
3.1垃圾标记阶段
重点:主要是为了判断对象是否存活
判断对象存活一般有两种方式:引用计数算法和可达性分析算法。引用计数法容易产生循环引用的问题,可达性分析通过根搜索算法来实现。根搜索方法以一系列GC Roots的点作为起点向下搜索,在一个对象到任何GC Roots都没有引用链相连时,说明其已经死亡。
3.2引用计数算法
在Java中要想操作,就先获取该对象的引用,因此可以通过引用计数法判断一个对象是否可以被回收
过程:为对象添加一个引用时,引用计数+1,删除一个引用时,引用计数-1。如果一个对象的引用计数为0,则表示该对象没有被引用,可以被回收。
缺点:
容易产生循环引用问题,两个对象相互引用,导致引用一直存在,而不能被回收。
3.3可达性分析算法
相较于引用计数算法,这里的可达性分析就是 Java、C#选择的。这种类型的 垃圾收集通常也叫作追踪性垃圾收集(Tracing Garbage Collection)
过程:定义一些GC Roots对象,然后以这些GC Roots对象作为起点向下搜索,如果在GC Roots和一个对象之间没有可达路径,则称这些对象是不可达的。
GC Roots 可以是哪些元素?
简单一句话就是,除了堆空间的周边,比如:虚拟机栈、本地方法栈、方法区、 字符串常量池等地方对堆空间进行引用的,都可以作为 GC Roots 进行可达性分析。
总结
本章主要介绍了自动内存管理的相关概念以及垃圾标记阶段的两种常见算法:引用计数算法和可达性分析算法。引用计数算法容易产生循环引用问题,所以JAVA一般使用可达性分析算法。关于垃圾回收阶段的相关内容将会在以后的章节中介绍。