【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实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

Springboot项目启动失败提示找不到dao类的解决

《Springboot项目启动失败提示找不到dao类的解决》SpringBoot启动失败,因ProductServiceImpl未正确注入ProductDao,原因:Dao未注册为Bean,解决:在启... 目录错误描述原因解决方法总结***************************APPLICA编

深度解析Spring Security 中的 SecurityFilterChain核心功能

《深度解析SpringSecurity中的SecurityFilterChain核心功能》SecurityFilterChain通过组件化配置、类型安全路径匹配、多链协同三大特性,重构了Spri... 目录Spring Security 中的SecurityFilterChain深度解析一、Security

SpringBoot多环境配置数据读取方式

《SpringBoot多环境配置数据读取方式》SpringBoot通过环境隔离机制,支持properties/yaml/yml多格式配置,结合@Value、Environment和@Configura... 目录一、多环境配置的核心思路二、3种配置文件格式详解2.1 properties格式(传统格式)1.