个人网站可以做品牌推广/友好链接

个人网站可以做品牌推广,友好链接,企业网站建设广州,网站链接做二维码垃圾收集与内存管理摘要 一.核心垃圾收集算法对比 算法原理优点缺点适用场景标记-清除两次遍历(标记存活对象→清除未标记对象)实现简单内存碎片化、双遍历效率低老年代(结合整理)标记-复制内存对半分,存活对象复制到…

垃圾收集与内存管理摘要

一.核心垃圾收集算法对比

算法原理优点缺点适用场景
标记-清除两次遍历(标记存活对象→清除未标记对象)实现简单内存碎片化、双遍历效率低老年代(结合整理)
标记-复制内存对半分,存活对象复制到空白区无碎片、效率高内存利用率50%新生代
标记-整理标记后移动存活对象至内存端无碎片、内存利用率高对象移动开销大老年代

二.分代收集核心机制

内存分代结构

  • 新生代(1/3堆)

    • Eden区:80%空间,新对象初始分配区,通过连续内存分配优化短命对象处理
    • Survivor区:From/To各10%,存放至少存活一次的对象,采用复制算法
  • 老年代(2/3堆):存放长周期对象,采用标记-清除/整理算法

  • 元空间(本地内存):类元数据存储,GC条件更宽松

回收流程关键点

  1. Minor GC(新生代)

    • 触发条件:Eden区满
    • 对象晋升:年龄阈值(15)或Survivor空间不足
    • 复制效率:仅处理存活对象,存活率<10%时最优
  2. Full GC(全局)

    • 触发条件:老年代不足/显式调用
    • 性能影响:全堆扫描,停顿时间显著

三.永久代演进对比

特性Java7永久代Java8+元空间
存储位置堆内存本地内存
GC触发条件类+类加载器+反射引用全解除类加载器回收即释放
内存管理固定大小易OOM动态扩展
性能影响Full GC时扫描独立回收机制

四.对象存活判定

  • 可达性分析法:通过GC Roots(栈变量、静态属性、JNI引用)遍历引用链
  • 死亡判定流程:两次标记机制(可达性分析→finalize()自救机会→不可达回收)

关键设计理念:基于对象生命周期特征(98%对象朝生夕死)进行分代优化,通过空间换时间(复制算法)和延迟处理(老年代整理)平衡吞吐量与停顿时间。

正文

一.常见的垃圾收集算法

标记-清楚

原理:

  • 标记:从GC Roots(例如栈中的变量,静态变量等)开始便利,标记出所有被引用的对象

  • 清除:遍历整个堆,清除没被标记的对象。

缺点

  • 标记和清除各遍历一次,效率低下
  • 可能产生大量不连续的空间,当程序需要分配较大内存时,可能会因为无法找到连续的内存空间导致内存不足,从而提前触发垃圾回收。

标记-复制

原理:将内存空间化为等大的两块,一般称为(Form和To空间)。每次只是用其中的一块,当这一块用满后,就将存活的对象复制到另一块空间,然后把原来使用的空间直接清理掉。

优点:

  • 只需要复制存活的对象效率很高
  • 清除后的空间是连续的

缺点

  • 内存空间只占用一般,另一半用来存放复制后的内存,空间浪费严重

标记-整理

原理

  • 标记:与标记-清除算法相同,从GC Root开始遍历所有存活的对象
  • 整理:将存活对象向内存的一端移动,此过程不会清除垃圾对象,而是会把存活对象直接挪到垃圾对象,类似于赋值操作,然后直接清理掉边界以外的内存空间。

优点

  • 解决了标记-清除算法需要遍历两次和会产生内存碎片的问题,同时也不会和标记-整理算法一样浪费一半的空间

缺点

  • 整理过程需要移动对象,效率相对较低,尤其是对象过多的情况下

分代收集

原理

  • 基于对象存活周期不同,讲内存化为不同的代

  • 新生代:对象通常“朝生夕死”存活率低。一般采用标记-复制算法

  • 老生代:对象通常存活率高,占用空间大。一般采用标记-清除标记-整理算法

优点

  • 根据对象存活特点采用不同算法,提高垃圾回收效率,减少对应用程序性能的影响。

缺点

  • 需要对堆内存进行分代管理,增加了垃圾回收器的实现复杂度。

二.分代垃圾回收器工作原理详解

分代垃圾回收器是基于一个假说:大部分对象生命周期极短,少数对象长期存活。

堆内存分代结构

  • 新生代

    • 占堆内存的1/3

    • 分为Eden区(80%)和两个Survivor区(From+To 各10%)

      • 为什么要有Eden区?直接和正常的标记-复制算法一样不好吗?只要From和To两个分区
      • 因为大多数内存活不过一次GC,新对象直接在连续内存的 Eden 区分配,避免频繁内存整理。集中处理 “朝生暮死” 的对象,减少对 Survivor 区的频繁操作。
        如果只是用From和To两个Survivor区域,则无法隔离新对象和多次存活对象,导致每次 GC 需扫描全部区域,效率降低。
        所以我们再Survivor中存放的是至少存货过一次的对象,Eden区只存放新对象
    • 新对象优先在Eden区分配,若Eden区空间不足,则出发Minor GC

  • 老生代

    • 占堆内存2/3,存放长期存活的对象
    • 当老生代空间不足时,则出发Full GC或Major GC,回收整个堆
  • 元空间

    • 取代永久代,存放类元数据,常量池等,GC主要针对不在使用的类的加载器和常量池

对象分配与回收流程

1.对象分配

  • 新对象先分配到Eden区,若Eden区已满,则出发Minor GC

  • 大对象(如长数组)会直接进入老年代

2.Minor GC(新生代回收)

前面我们总体到Minor GC,那么他到底是个什么呢?

  • 存活对象:从 Eden 和 Survivor 区复制到另一个 Survivor 区(复制算法)。
  • 对象年龄:每熬过一次 Minor GC,年龄 + 1。
  • 晋升老年代:年龄达到阈值(默认 15)或 Survivor 区空间不足时晋升

3.Full GC(老年代回收):

  • 触发条件:老年代空间不足、显式调用System.gc()等。

  • 使用标记 - 清除或标记 - 整理算法,回收整个堆,耗时长

三.JVM 永久代中会发生垃圾回收吗

  • Java8前 永久代

    • 存储位置:JVM堆内存
    • GC 条件:类需满足:所有实例被回收 + 类加载器被回收 + 无反射引用。
    • 问题:容易因类加载过多引发` ‍```rustOutOfMemoryError: PermGen space‍````
  • Java8+ 元空间

    • 存储位置:本地内存,不再占用堆。

    • GC 条件:仅需类加载器被回收,自动释放类元数据。

    • 改进:

      • 内存动态扩展,内存取决于物理内存大小
      • 减少 OOM 风险,GC 效率更高。

四.如何判断对象是否存活?

可达性算法

  • 原理: 从CG Roots出发,遍历所有的引用链,无法到达的对象即为死亡

  • GC Roots 包括:

    • 虚拟机栈中局部变量引用的对象。
    • 方法区中静态变量和常量引用的对象。
    • 本地方法栈中 JNI (Java Native Interface)引用的对象

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/73528.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

栈(LIFO)算法题

1.删除字符串中所有相邻的重复字符 注意&#xff0c;我们需要重复处理&#xff0c;而不是处理一次相邻的相同元素就结束了。对示例来说&#xff0c;如果只进行一次处理&#xff0c;结果为aaca&#xff0c;但是处理之后又出现了相邻的重复元素&#xff0c;我们还得继续处理&…

conda的基本使用及pycharm里设置conda环境

创建conda环境 conda create --name your_env_name python3.8 把your_env_name换成实际的conda环境名称&#xff0c;python后边的根据自己的需要&#xff0c;选择python的版本。 激活conda环境 conda activate your_env_name 安装相关的包、库 conda install package_name …

synchronized与 Java内置锁(未写完)

文章目录 一、 synchronized 关键字二、Java对象结构1. 对象头2. 对象体3. 对齐字节4. 对象头中的字段长度5. Mark Word 的结构信息6. 使用 JOL 工具查看对象的布局 三、Java 内置锁机制3.1 内置锁的演进过程1. 无锁状态2. 偏向锁状态3. 轻量级锁状态4. 重量级锁状态 一、 sync…

LLM(3): Transformer 架构

Transformer 架构是当前大语言模型的主力架构和基础技术&#xff0c;本文以通俗易懂的方式&#xff0c;对此作简要介绍。 1.4 介绍 Transformer 架构 大多数现代的大规模语言模型&#xff08;LLMs&#xff09;依赖于 Transformer 架构&#xff0c;这是一种在 2017 年的论文《…

88.HarmonyOS NEXT 性能监控与调试指南:构建高性能应用

温馨提示&#xff1a;本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦&#xff01; HarmonyOS NEXT 性能监控与调试指南&#xff1a;构建高性能应用 文章目录 HarmonyOS NEXT 性能监控与调试指南&#xff1a;构建高性能应用1. 性能监…

012---状态机的基本知识

1. 摘要 文章为学习记录。主要介绍状态机概述、状态转移图、状态编码、状态机写法、状态机代码示例。 2. 状态机概述 状态机 &#xff08;Finite State Machine&#xff09;&#xff0c;也称为同步有限状态机&#xff0c;用于描述有先后顺序或时序规律的事情。 “同步”&…

deepseek+kimi做ppt教程记录

1.首先注册deepseek和kimi deepseek官网&#xff1a;https://chat.deepseek.com/ kimi官网&#xff1a;https://kimi.moonshot.cn/ 以下以一篇工作总结报告为例 2.使用deepseek生成ppt大纲 让deepseek生成kimi生成ppt所需要的内容时&#xff0c;需要注意提示词内容&#xff0c;…

【Linux内核系列】:文件系统收尾以及软硬链接详解

&#x1f525; 本文专栏&#xff1a;Linux &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 世界上只有一种个人英雄主义&#xff0c;那么就是面对生活的种种失败却依然热爱着生活 内容回顾 那么在之前的学习中&#xff0c;我们…

最新版Chrome浏览器加载ActiveX控件技术--allWebPlugin中间件一键部署浏览器扩展

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品&#xff0c;致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器&#xff0c;实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

基于SpringBoot和MybatisPlus实现通用Controller

基于SpringBoot和MybatisPlus实现通用Controller&#xff0c;只需要创建实体类和mapper接口&#xff0c;单表增删改查接口就已经实现&#xff0c;提升开发效率 1.定义通用controller package com.xian.controller;import cn.hutool.core.map.MapUtil; import com.baomidou.my…

Axure大屏可视化原型模板及素材:数据可视化的高效解决方案

数据可视化已成为企业决策、运营分析、市场洞察的重要工具。数据可视化大屏&#xff0c;作为数据展示和交互的直观平台&#xff0c;能够实时呈现关键数据&#xff0c;帮助企业快速做出决策。Axure作为原型设计领域的领先工具&#xff0c;以其丰富的组件库、强大的交互设计能力和…

YOLOE:实时查看任何事物

摘要 https://arxiv.org/pdf/2503.07465v1 目标检测和分割在计算机视觉应用中得到了广泛应用&#xff0c;然而&#xff0c;尽管YOLO系列等传统模型高效且准确&#xff0c;但它们受限于预定义的类别&#xff0c;阻碍了在开放场景中的适应性。最近的开放集方法利用文本提示、视觉…

這是我第一次寫關於aapenal服務器管理控制面板的文章

首先我們來認識一下服務器管理面板的所有功能  網站管理功能&#xff1a; 支持創建和管理多個網站。配置虛擬主機&#xff08;Vhost&#xff09;和域名綁定。自動安裝常用應用&#xff08;如WordPress、Joomla等&#xff09;。  文件管理功能&#xff1a; 文件上傳、…

jmeter:登录接口的token用于下一个接口

问题&#xff1a; 仅仅登录接口可以使用&#xff0c;其他接口进行测试的时候都是报错&#xff1a;账号已经失效 原因&#xff1a; 应该是登录接口的token并没有用到下一个接口上来 解决方法 1、目录建设如下&#xff1a; 2、先添加一个后置处理器&#xff1a;查看结果数&…

1、操作系统引论

一、操作系统 会使用linux系统 建议大家先学会linux的基础指令&#xff0c;可以看菜鸟教程网站进行学习。 1、各种定义 操作系统定义 管理计算机的 硬件 和软件资源&#xff0c; 能对各类作业进行调度&#xff0c;方便用户使用计算机的程序集合。操作系统运行在内核态&#xf…

SpringCloud系列教程(十四):Sentinel持久化

Sentinel之前已经搭建和应用成功了&#xff0c;但是它有一个很大的缺点就是官方没有提供持久化的方案&#xff0c;从项目源码上看感觉这款工具也没有完成的太好&#xff0c;所以需要我们去对它进行二次开发。要补充的功能大概如下&#xff1a; 1、将Sentinel接入nacos中&#…

Go语言环境搭建并执行第一个Go程序

目录 一、Windows环境搭建 二、vscode安装插件 三、运行第一个go程序 一、Windows环境搭建 下载Go&#xff1a;All releases - The Go Programming Language 这里是Windows搭建&#xff0c;选择的是windows-amd64.msi&#xff0c;也可以选择zip直接解压缩到指定目录 选择msi…

Java数据结构第二十三期:Map与Set的高效应用之道(二)

专栏&#xff1a;Java数据结构秘籍 个人主页&#xff1a;手握风云 目录 一、哈希表 1.1. 概念 1.2. 冲突 1.3. 避免冲突 1.4. 解决冲突 1.5. 实现 二、OJ练习 2.1. 只出现一次的数字 2.2. 随机链表的复制 2.3. 宝石与石头 一、哈希表 1.1. 概念 顺序结构以及平衡树中…

OpenHarmony子系统开发 - Rust编译构建指导

OpenHarmony子系统开发 - Rust编译构建指导 一、Rust模块配置规则和指导 概述 Rust是一门静态强类型语言&#xff0c;具有更安全的内存管理、更好的运行性能、原生支持多线程开发等优势。Rust官方也使用Cargo工具来专门为Rust代码创建工程和构建编译。 OpenHarmony为了集成C…

STM32驱动代码规范化编写指南(嵌入式C语言方向)

点击下面图片&#xff0c;为您提供全新的嵌入式学习路线 文章目录 一、命名规范体系1.1 变量/函数命名1.2 宏定义规范1.3 类型定义 二、代码结构组织2.1 文件组织结构2.2 头文件规范模板 三、注释体系构建3.1 Doxygen风格示例3.2 复杂逻辑注释 四、硬件抽象层设计4.1 寄存器封…