JVM之GC垃圾回收

GC垃圾回收

如何判断对象可以回收

  • 引用计数法

    如果有对象引用计数加一,没有对象引用,计数减一,如果计数为零,则回收

    但是如果存在循环引用,即A对象引用B对象,B对象引用A对象,会造成内存泄漏

  • 可达性分析算法

    1. java虚拟机中的垃圾回收器采用可达性分析来探索所有存活的对象

    2. 扫描堆中的对象,看是否能够沿着GC Root对象为起点的引用链找到该对象,找不到,表示可以回收

    3. 哪些对象可以作为GG Root?

      1. System Class

        例如:Object,String,HashMap等

      2. Native Stack

      3. Thread

      4. Busy Monitor

  • 四种引用

    • 强引用:new的对象,赋值的对象

      Object obj= new Object()//new 的对象都是是强引用
      

      只要强引用存在,垃圾回收器将永远不会回收被引用的对象,哪怕内存不足时,JVM也会直接抛出OutOfMemoryError,不会去回收。如果想中断强引用与对象之间的联系,可以显示的将强引用赋值为null,这样一来,JVM就可以适时的回收对象了

    • 软引用

      Object obj= new Object()
      SoftReference sr = new SoftReference<>(obj);//obj就是软引用
      

      在内存足够的时候,软引用对象不会被回收,只有在内存不足时,系统则会回收软引用对象,如果回收了软引用对象之后仍然没有足够的内存,才会抛出内存溢出异常。这种特性常常被用来实现缓存技术,比如网页缓存,图片缓存等。

    • 弱引用

      Object obj= new Object()
      WeakReference wr = newWeakReference<>(obj);//obj就是软引用
      

      弱引用的引用强度比软引用要更弱一些,无论内存是否足够,只要 JVM 开始进行垃圾回收,那些被弱引用关联的对象都会被回收。在 JDK1.2 之后,用 java.lang.ref.WeakReference 来表示弱引用。

    • 虚引用

      Object obj= new Object()
      PhantomReference pr = new PhantomReference <>(obj);//obj就是软引用
      

      虚引用是最弱的一种引用关系,如果一个对象仅持有虚引用,那么它就和没有任何引用一样,它随时可能会被回收,在 JDK1.2 之后,用 PhantomReference 类来表示,通过查看这个类的源码,发现它只有一个构造函数和一个 get() 方法,而且它的 get() 方法仅仅是返回一个null,也就是说将永远无法通过虚引用来获取对象,虚引用必须要和 ReferenceQueue 引用队列一起使用。

    • 终结器引用

      无需手动编码,但其内部配合引用队列使用,在垃圾回收时,终结器引用入队(被引用对象暂时没有被回收),再由Finalizer线程通过终结引用找到被引用对象并调用它的finalize方法,第二次GC时才能回收被引用的对象

垃圾回收算法

  • 标记清除

    标记:标记的过程其实就是,遍历所有的GC Roots,然后将所有GC Roots可达的对象标记为存活的对象。

    清除:清除的过程将遍历堆中所有的对象,将没有标记的对象全部清除掉。

    • 优点:速度快
    • 缺点:容易产生内存碎片
  • 标记整理

    标记:标记-整理算法从根对象开始遍历整个对象图,标记所有与根对象可达的对象,即被引用的对象。

    整理:标记-整理算法会对内存空间进行整理,将所有存活的对象移动到一端,而未标记的对象则被认为是垃圾对象。

    • 优点:没有产生"碎片"
    • 缺点:速度慢
  • 复制

    将活着的内存空间分为两块,每次只使用一块,在垃圾回收时将正在使用的内存块中的存活的对象复制到未被使用的内存块,之后清除正在使用的内存块中的所有对象,交换两块内存空间,完成垃圾回收

    • 优点:没有标记清除过程,运行高效,不会出现“碎片”问题
    • 缺点:需要两倍的内存空间

分代垃圾回收

在这里插入图片描述

老年代:存放长时间使用的对象

新生代:存放用完就可以丢弃的对象

  • MinorGC

    每次产生的新的对象在伊甸园区,如果进行了垃圾回收,那么会进行遍历所有对象,释放所有的的未被使用的对象,将使用的对象通过复制的方式,复制到幸存区S1,并进行年龄+1操作,表示该对象每次回收都没有被回收,当该值超过一个阈值时,就会将该对象放入老年代区,表示该对象可能会被长时间使用

    1. minor gc 会引发stop the world:进行垃圾回收时,会暂停其他的用户线程,等垃圾回收后,用户线程才恢复运行
    2. 当对象寿命超过阈值时,会晋升到老年区,最大寿命是15(4bit)
  • FullGC

    老年代空间都不足时,先触发Minorgc,如果之后内存空间仍然不足,则会触发FullGC,来对内存空间进行清理,STW(stop the world)的时间更长

相关VM的参数

在这里插入图片描述

大对象:如果说某个对象的大小超过了新生代内存大小,那么会将这个对象直接晋升到老年代内存块,不会发生GC回收

垃圾回收器

  • 串行

    1. 单线程的垃圾回收器

    2. 适用于堆内存较小的场景,个人电脑

    3. 打开串行垃圾回收器
      -XX:+UseSerialGC=Serial(新生代:复制算法) + SerialOld(老年代:标记整理算法)
      
    4. 在这里插入图片描述

  • 吞吐量优先(1.8默认的垃圾回收器)

    1. 多线程的垃圾回收器

    2. 适用于堆内存较大的场景,需要多核CPU的支持

    3. 让单位时间内STW的时间最短

    4. 在进行垃圾回收时会占满CPU

    5. 在这里插入图片描述

    6. -XX:parallelGCThreads=n //指定线程数量
      -XX:UseAdaptiveSizePolicy //采用自适应的大小调整策略,调整新生代的大小
      -XX:UseParallelGC //开启吞吐量优先垃圾回收器
      //ratio默认为99,此时值为0.01,只能由1%的时间用来进行垃圾回收(100min,只能有1min进行垃圾回收)
      -XX:GCTimeRatio=ratio //(公式:1/1+ratio)
      
  • 响应时间优先(基于标记清除算法)

    1. 多线程的垃圾回收器

    2. 适用于堆内存较大的场景,需要多核CPU的支持

    3. 尽可能的让单次STW的时间最短

    4. 在这里插入图片描述

    5. -XX:UseConcMarkSweepGC
      

G1(JDK9之后的默认的垃圾回收器)

定义:Garbage First

  1. 适用场景
  • 同时注重吞吐量和低延时,默认的暂时目标是200ms
  • 超大堆内存,会将堆划分为多个大小相等的Region
  • 整体上是标记+整理算法,两个区域之间是复制算法
  1. 相关参数
-XX:+UseG1GC
-XX:G1HeapRegionSize=size //设置Region的大小(1,2,4,8,16)
-XX:MaxGCPauseMillis=time //暂停目标时间
  1. G1垃圾回收阶段

    在这里插入图片描述

    3.1Young Collection(新生代)

    ​ 会STW

    ​ 会将幸存的对象,复制到幸存区,之后新生代内存满了,会将部分常用的对象复制到老年代内存

    3.2Young Collection+Concurrent Mark(新生代+并发标记)

    ​ 在YoungGC时会进行GC Root的初始标记

    ​ 老年代占用堆空间比例达到阈值时(默认为45%),进行并发标记(不会STW)

    3.3Mixed Collection(混合收集)

    ​ 会对伊甸园,新生区,老年区进行全面垃圾回收

    ​ 最终标记会STW

    ​ 拷贝存活会STW

  2. Young Collection 跨代引用

    新生代回收的跨代引用(老年代引用新生代)问题

垃圾回收调优

  1. 调优领域
    1. 内存
    2. 锁竞争
    3. cpu占用
    4. io
  2. 最快的GC是不发生GC
    1. 查看FullGC前后内存占用,考虑几个问题
      1. 是不是数据太多了
      2. 数据表示是否太臃肿
      3. 是否存在内存泄漏
  3. 新生代调优
    1. 所有new操作的内存分配非常廉价
    2. 死亡对象的回收代价为零
    3. 大部分对象用过即死
    4. minorgc时间远远低于fullgc
    5. 所以新生代内存块的大小应该设置为堆大小的1/4~1/2最佳,过大的话,会导致老年代内存过小,发生频繁 FullGC
    6. 幸存区要足够大到能保留当前活跃对象和需要晋升的对象
    7. 晋升阈值配置要得当,让长时间存活对象能尽快晋升
  4. 老年代调优(CMS)
    1. CMS的老年代内存越大越好
    2. 将老年代内存预设调至1/4~1/3

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

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

相关文章

Gitlab和Jenkins集成 实现CI (二)

Gitlab和Jenkins集成 实现CI (一) Gitlab和Jenkins集成 实现CI (二) Gitlab和Jenkins集成 实现CI (三) 配置Gitlab api token 配置 Gitlab 进入gitlab #mermaid-svg-t84fR8wrT4sB4raQ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:…

【芯片设计- RTL 数字逻辑设计入门 6 -- 带同步复位的D触发器 RTL实现及testbench 验证】

文章目录 带同步复位的D触发器Verilog 代码testbench 代码编译及仿真问题小结 带同步复位的D触发器 同步复位 &#xff1a;复位只能发生在在clk信号的上升沿&#xff0c;若clk信号出现问题&#xff0c;则无法进行复位。 Verilog 代码 // timescale ins/1nsmodule flopr (inpu…

Django(十)

1. Ajax请求 浏览器向网站发送请求时&#xff1a;URL 和 表单的形式提交。 GETPOST 特点&#xff1a;页面刷新。 除此之外&#xff0c;也可以基于Ajax向后台发送请求&#xff08;偷偷的发送请求&#xff09;。 依赖jQuery编写ajax代码 $.ajax({url:"发送的地址"…

电脑服务器离线安装.net framework 3.5解决方案(错误:0x8024402c )(如何确定当前系统是否安装NET Framework 3.5)

问题环境&#xff1a; 日常服务的搭建或多或少都会有需要到NET Framework 3.5的微软程序运行框架&#xff0c;本次介绍几种不同的安装方式主要解决运行在Windows 2012 以上的操作系统的服务。 NET Framework 3.5 是什么&#xff1f; .NET Framework是微软公司推出的程序运行框架…

vscode +markdown 的安装和使用

文章目录 前言一、vscode markdown 是什么&#xff1f;1.vscode是什么&#xff1f;2.markdown 是什么&#xff1f; 二、安装步骤1.下载2.安装 三、安装插件1.安装 Markdown All in One2.安装 Markdown Preview Enhanced3. Paste Image v1.0.44.LimfxCodeExv0.7.105.Code Spell …

问题:孔隙比总是1.0。 #知识分享#微信

问题&#xff1a;孔隙比总是1.0。 /ananas/latex/p/1242 参考答案如图所示

深度学习技巧应用36-深度学习模型训练中的超参数调优指南大全,总结相关问题与答案

大家好,我是微学AI,今天给大家介绍一下深度学习技巧应用36-深度学习模型训练中的超参数调优指南大全,总结相关问题与答案。深度学习模型训练中的调优指南大全概括了数据预处理、模型架构设计、超参数优化、正则化策略和训练技巧等多个关键方面,以提升模型性能和泛化能力。 …

【Java】苍穹外卖 Day01

苍穹外卖-day01 课程内容 软件开发整体介绍苍穹外卖项目介绍开发环境搭建导入接口文档Swagger 项目整体效果展示&#xff1a; 管理端-外卖商家使用用户端-点餐用户使用当我们完成该项目的学习&#xff0c;可以培养以下能力&#xff1a; 1. 软件开发整体介绍 作为一名软件开…

在 MacOS 上虚拟化 x86Linux 的最佳方法(通过 Rosetta)

categories: [VM] tags: MacOS VM 写在前面 买了 ARM 的 mac, 就注定了要折腾一下虚拟机了… 之前写过一篇文章是通过 utm 虚拟化archlinux, 其实本质上还是调用了 qemu-system-x86_64, 所以速度并不快, 后来想着能不能借用 Rosetta 的优势即原生转译, 来虚拟化 Intel 的 Linu…

Vue.js2+Cesium1.103.0 十五、绘制视锥,并可实时调整视锥姿态

Vue.js2Cesium1.103.0 十五、绘制视锥&#xff0c;并可实时调整视锥姿态 Demo <template><divid"cesium-container"style"width: 100%; height: 100%;"/> </template><script> /* eslint-disable no-undef */ /* eslint-disable …

MySQL篇----第十五篇

系列文章目录 文章目录 系列文章目录前言一、实践中如何优化 MySQL二、优化数据库的方法三、简单描述 MySQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分…

智慧自助餐饮系统(SpringBoot+MP+Vue+微信小程序+JNI+ncnn+YOLOX-Nano)

一、项目简介 本项目是配合智慧自助餐厅下的一套综合系统&#xff0c;该系统分为安卓端、微信小程序用户端以及后台管理系统。安卓端利用图像识别技术进行识别多种不同菜品&#xff0c;识别成功后安卓端显示该订单菜品以及价格并且生成进入小程序的二维码&#xff0c;用户扫描…

P3647 题解

文章目录 P3647 题解OverviewDescriptionSolutionLemmaProof Main Code P3647 题解 Overview 很好的题&#xff0c;但是难度较大。 模拟小数据&#xff01;——【数据删除】 Description 给定一颗树&#xff0c;有边权&#xff0c;已知这棵树是由这两个操作得到的&#xff1…

Stable Diffusion 模型下载:RealCartoon-Pixar - V8

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十下载地址模型介绍 这个检查点是从 RealCartoon3D 检查点分支出来的。它的目标是在整体上产生更多的“皮克斯”风格。我非常喜欢3D卡通的外观,希望能够创建出具有

无人机动力系统高倍率锂聚合物电池介绍,无人机锂电池使用与保养,无人机飞行控制动力源详解

无人机电池使用及保养 电池是无人机飞行的动力来源,也是一个消耗品&#xff0c;对电池充分了解&#xff0c;采取正确的使用方法&#xff0c;妥善进行维护保养将有助于提高飞行的安全性、延长电池的使用寿命。以下将详细对电池的使用和管理进行讲解。 高倍率锂聚合物电池的含义…

【MySQL】:深入理解并掌握DML和DCL

&#x1f3a5; 屿小夏 &#xff1a; 个人主页 &#x1f525;个人专栏 &#xff1a; MySQL从入门到进阶 &#x1f304; 莫道桑榆晚&#xff0c;为霞尚满天&#xff01; 文章目录 &#x1f4d1;前言一. DML1.1 添加数据1.2 修改数据1.3 删除数据 二. DCL2.1 管理用户2.2 权限控制…

华为配置交换机KPI信息上报分析器示例组网图形

配置交换机KPI信息上报分析器示例 组网图形 图1 KPI信息上报拓扑图 组网需求操作步骤配置文件 组网需求 如图1所示&#xff0c;某企业网络用一台华为公司iMaster NCE-CampusInsight作为分析器对交换机设备进行智能运维管理。iMaster NCE-CampusInsight与交换机之间已经实现路由…

Tomcat 原理分析

1、Tomcat 的组成 如下图&#xff1a; Tomcat组成 Server&#xff1a; Tomcat 封装的、对外提供完整的、基于组件的 web 服务&#xff0c;包含 Connectors、Container 两个核心组件&#xff0c;以及多个功能组件&#xff0c;各个 Service 之间是独立的&#xff0c;但是共享 同…

MoE-LLaVA:具有高效缩放和多模态专业知识的大型视觉语言模型

视觉和语言模型的交叉导致了人工智能的变革性进步&#xff0c;使应用程序能够以类似于人类感知的方式理解和解释世界。大型视觉语言模型(LVLMs)在图像识别、视觉问题回答和多模态交互方面提供了无与伦比的能力。 MoE-LLaVA利用了“专家混合”策略融合视觉和语言数据&#xff0…

打印斐波那契数列

定义&#xff1a; 斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89……这个数列从第3项开始 &#xff0c;每一项都等于前两项之和。 …