【JVM】自动内存管理机制《四》---垃圾收集器(索命黑白无常回收垃圾对象)

本文主要是介绍【JVM】自动内存管理机制《四》---垃圾收集器(索命黑白无常回收垃圾对象),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

导读

 宏观概览

 哪些内存需要回收?

 垃圾收集算法 

复制算法

 标记清除算法

标记整理算法

分代收集算法

 垃圾收集器

小结


导读

 接下来本篇博客着重讲:如何自动管理内存,今天接着解决第三个问题,详细会按以下思路讲解-:如何自动管理的?谁管理的?接下来按下面的顺序讲述,我们已经讲完了对象存活的判定,接下来要讲垃圾收集算法,垃圾收集器:

 内存回收机制

     *  对象存活判定算法

     * 哪些内存需要回收

     * 垃圾收集算法

     *  垃圾收集器(对垃圾收集算法的实现)

 内存分配与回收策略

     * 原则

 宏观概览

 垃圾收集算法有4种,如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现,图中指示出不同的垃圾收集器所使用的垃圾收集算法,以及收集器回收的是那部分的垃圾,以及单线程或多线程。

 

 哪些内存需要回收?

 堆和元数据区的内存需要回收,其余的不需要回收。因为只有堆和元数据区是线程共享的,其余的是与线程“同生共死”的,线程结束,内存自然就跟着回收了,所以不用管它们。

 垃圾收集算法 

复制算法

历史定义:把young内存按照 1:1 的比例划分:A和B,一个用来负责装载正常的对象信息,一个用来做垃圾回收。每次把A中存活的对象全部复制到B里面,再一次性的将A删除。

现在的商业 JVM 都采用这种算法来回收新生代,不同的是:其中,伊甸区和幸存0、1区的比例是:8:1:1。研究表明,新生代中的对象 98% 是 “朝生夕死” 的,所以不必按照 1:1 的比例来划分空间,而是将内存分为一块较大的 Eden 空间和两块较小的 Survivor 空间,每次使用 Eden 和其中的一块 Survivor,当回收时,将 Eden 和 Survivor 中还存活着的对象一次性地复制到另外一块 Survivor 空间,最后清理掉 Eden 和刚才用过的 Survivor 空间。HotSpot VM 默认 Eden 和 Survivor 的大小比例是 8:1,也就是每次新生代中可用内存空间为整个新生代容量的 90% (80% + 10%)。当然,我们没有办法保证每次回收都只有不多于 10% 的对象存活,当 Survivor 空间不够用时,这些对象将直接通过分配担保机制进入老年代。

特点:没有碎片问题,但是内存缩小为了原来的一半。适用于新生代的回收。


 标记清除算法

定义:先标记,再清除。先开始对存活的对象进行标记,然后将没有被标记的对象进行回收。

特点:1.会产生大量的碎片,导致有大量碎片内存剩余的情况下,由于没有连续的空间来存放较大对象而又一次出发垃圾收集动过  2.效率不高;


标记整理算法

定义:前面两者的综合,先标记、清除完,然后将存活的对象移动到内存的一端。

特点:成本较高,但是解决了碎片问题。适用于老年代的回收。


分代收集算法

分代收集算法就是目前虚拟机使用的回收算法,它解决了标记整理不适用于老年代的问题,将内存分为各个年代。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),在堆区之外还有一个代就是永久代(Permanet Generation)。

ç´éBATå¿èé¢ç³»åï¼JVMç4ç§åå¾åæ¶ç®æ³ãåå¾åæ¶æºå¶ä¸æ»ç»

在不同年代使用不同的算法,从而使用最合适的算法,新生代存活率低,可以使用复制算法。而老年代对象存活率搞,没有额外空间对它进行分配担保,所以只能使用标记清除或者标记整理算法。

 垃圾收集器

 上面讲了目前所有的垃圾收集算法,这些算法是由谁去实现并执行的呢?那就是垃圾收集器。宏观可以看下文章开始的那张图,

 本篇博客篇幅太长,关于垃圾收集器请看下篇:【JVM】自动内存管理机制《五》---垃圾收集器(索命黑白无常回收垃圾对象)

小结

 以上讲了垃圾收集器能做什么,下篇博客讲下垃圾收集器都有哪些:【JVM】自动内存管理机制《五》---垃圾收集器(索命黑白无常回收垃圾对象)。

这篇关于【JVM】自动内存管理机制《四》---垃圾收集器(索命黑白无常回收垃圾对象)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/798500

相关文章

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Java NoClassDefFoundError运行时错误分析解决

《JavaNoClassDefFoundError运行时错误分析解决》在Java开发中,NoClassDefFoundError是一种常见的运行时错误,它通常表明Java虚拟机在尝试加载一个类时未能... 目录前言一、问题分析二、报错原因三、解决思路检查类路径配置检查依赖库检查类文件调试类加载器问题四、常见

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

Java 实用工具类Spring 的 AnnotationUtils详解

《Java实用工具类Spring的AnnotationUtils详解》Spring框架提供了一个强大的注解工具类org.springframework.core.annotation.Annot... 目录前言一、AnnotationUtils 的常用方法二、常见应用场景三、与 JDK 原生注解 API 的

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Java中的StringBuilder之如何高效构建字符串

《Java中的StringBuilder之如何高效构建字符串》本文将深入浅出地介绍StringBuilder的使用方法、性能优势以及相关字符串处理技术,结合代码示例帮助读者更好地理解和应用,希望对大家... 目录关键点什么是 StringBuilder?为什么需要 StringBuilder?如何使用 St

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

Java并发编程之如何优雅关闭钩子Shutdown Hook

《Java并发编程之如何优雅关闭钩子ShutdownHook》这篇文章主要为大家详细介绍了Java如何实现优雅关闭钩子ShutdownHook,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起... 目录关闭钩子简介关闭钩子应用场景数据库连接实战演示使用关闭钩子的注意事项开源框架中的关闭钩子机制1.

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推