05、GC基础知识

news2024/12/16 14:01:18

JVM程序在跑起来之后,在数据的交互过程中,就会有一些数据是过期不用的,这些数据可以看做是垃圾,JVM中,这些垃圾是不用开发者管的,它自己会有一套垃圾回收系统自动回收这些内存垃圾,以备后面继续使用。这就是JVM的GC系统。GC这块知识很多,这篇文章主要是了解下它的基本知识点
1、如何定位垃圾
2、GC的回收算法
3、GC的内存分代模型

1、如何定位垃圾

  • 引用计数法:它的核心思想是,没有引用指向的内存区域是垃圾区域,GC可以回收这个区域。具体的做法是,每当有引用指向这个对象,它对应的计数就+1,当有引用取消了对它的指向就-1,如果计数为0的时候,它就会被GC自动回收。
    • 它的问题:引用计数法如果碰到循环引用的垃圾,就会失效。比如a引用b,b也引用a,但是他们整体的引用在程序中已经释放掉了,但是由于它们互相引用,引用计数永远不可能为0,所有它们永远不会被回收。
    • 它的解决方案是如下的“根可达算法”来解决
  • 根可达算法:它的核心思想是,如果一个对象没有根对象直接或间接的指向它,那它就是垃圾。具体的是要弄清楚哪些是属于根对象
    根对象
    • 根对象:
      • JVM Stacks里的对象(线程栈变量)
      • Native Method Stack(本地方法栈的对象)
      • Run-time Constant Pool(常量池里的对象)
      • Static Refercens In Method Area(方法区的静态对象)

      程序跑起来也就是main函数跑起来之后,它里面需要用到的对象都算是根对象,如线程栈变量和本地方法栈变量,然后就是用Static申请的对象,如果是字符串类型那就是常量池数据,如果是静态的引用那就是方法区的对象,这些算是根对象。它们直接或是间接引用的对象都不能算是垃圾。

2、GC回收算法

  • 标记清楚算法
    • 具体实现:第一阶段根据GCRoot规则把存活对象进行标记,第二阶段会清楚掉没有标记的对象
    • 特点:根据它的工作特点可以发现,清除之后留下来的内存不连续,会产生内存碎片。需要经过两次扫描,效率低
    • 使用场景:适用于对象存活时间长的情况,不如old区
  • 拷贝算法
    • 具体实现:首先把内存区域分为两部分A,B区域,一部分空置着(比如B区),等另外一部分(A区)满了之后,直接把A区存活对象复制到B区,然后把A区数据全部清除
    • 特点:内存位置连续,无碎片化,扫描一次即可,但是需要移动和复制内存对象,且浪费空间,有效利用率只有50%
    • 使用场景:适用于对象存活时间短的场景,比如年轻代的from区和to区
  • 标记压缩算法
  • 具体实现:它跟标记清楚算法类似,都需要经过两次扫描,不一样的是,第二阶段并不是删除未标记对象,而是把标记对象压缩到内存的一端,之后清理掉其他的空间
  • 特点:位置连续,没有碎片,内存的利用率也很高,但也是需要两次扫描且需要把对象移动到头部,效率偏低
  • 使用场景:适用于对象存活时间较长的情况,比如old区

3、GC内存分代模型

3.1、常见的GC,以及他们之间的组合

GC类型

Serial系列的GC是最早版本的,它都是单线程串行回收垃圾,一般针对几十兆内存的机器

  • Serial:底层用的是复制算法+单线程,用于年轻代回收
  • Serial Old:底层用的是标记压缩算法+但线程,用于老年代回收

PS+PO算法是JDK1.8版本以及之前版本默认的GC,他们都是并行回收的,一般能回收几个G的内存数据

  • Parallel Scavenge:拷贝算法+并行,用于年轻代
  • Parallel Old:标记清除算法+并行,用于老年代

PN+CMS算法是较新的一种组合,它们是期望用于更大内存的回收,其中PN算法是配合CMS对年轻代回收的一种算法

  • ParNew:拷贝算法+并行计算
  • CMS:三色标记算法+并行计算
  • G1,ZGC,Shenandoah:这些都是新一代的GC,后面会具体篇幅专门介绍。

3.2、GC的分代模型

Serial系列,Parallel Scavenge,Parallel Old,ParNew,CMS,这些都是逻辑和物理上都是进行分代的,G1是逻辑上分代,但是物理上是不分代的,之后的GC如ZGC,Shenandoah他们逻辑和物理上都不分代。如果分代的话,一般分为年轻代和老年代,他们默认的占比是New:Old=1:2

  • 年轻代:Eden+2个Survival区(from+to区),它们内存占比默认是8:1:1,其中一个区域满了就会触发YGC。from区和to区一般只有一个区域是在使用的
  • 老年代:垃圾相对于较少,如果满了之后会触发FullGC
3.2.1、对象在各个分代区域的流转规则
  • Young区的数据流转

在Young区,如果Eden区满了,就会触发YGC,就会把Eden区存活的对象复制到from区,然后清除掉Eden,如果from区满了,会把数据复制到to区,清除掉from,Young区的流转大致如上所述。

  • Old区的数据流转

Old 区的数据都是从Young流转过来的,具体的流转条件如下所述

  • 大对象直接进入Old区(通过GC参数-XX:+MaxTenuringThreshold 来设定)
  • 动态年龄:如年龄1的占33%,年龄2的占33%,年龄3的占34%,年龄2+年龄3>50%,所以年龄2,3的对象同时晋升到old区
  • 分配担保:YGC期间Survivor区空间不够时,担保的空间直接进入Old区
  • age年龄到了15岁时会进入Old区

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

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

相关文章

【前端开发】HTML+CSS网页,可以拿来当作业(免费开源)

HTML代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content_lizhongyu"widthdevice-width, initial-scale1.0"><title>小兔鲜儿-新鲜、惠民、快捷<…

【Unity3D】无限循环列表(扩展版)

基础版&#xff1a;【Unity技术分享】UGUI之ScrollRect优化_ugui scrollrect 优化-CSDN博客 using UnityEngine; using UnityEngine.UI; using System.Collections.Generic;public delegate void OnBaseLoopListItemCallback(GameObject cell, int index); public class BaseLo…

Git-基础操作命令

目录 Git基础操作命令 case *查看提交日志 log 版本回退 get add . Git基础操作命令 我们创建并且初始化这个仓库以后&#xff0c;我们就要在里面进行操作。 Git 对于文件的增删改查存在几个状态&#xff0c;这些修改状态会随着我们执行Git的命令而发生变化。 untracked、…

Flutter Navigator2.0的原理和Web端实践

01 背景与动机 在Navigator 2.0推出之前&#xff0c;Flutter主要通过Navigator 1.0和其提供的 API&#xff08;如push(), pop(), pushNamed()等&#xff09;来管理页面路由。然而&#xff0c;Navigator 1.0存在一些局限性&#xff0c;如难以实现复杂的页面操作&#xff08;如移…

【容器】k8s学习笔记基础部分(三万字超详细)

概念 应用部署方式演变 在部署应用程序的方式上&#xff0c;主要经历了三个时代&#xff1a; 传统部署&#xff1a;互联网早期&#xff0c;会直接将应用程序部署在物理机上 优点&#xff1a;简单&#xff0c;不需要其它技术的参与 缺点&#xff1a;不能为应用程序定义资源使…

PostgreSQL 常用运维SQL整理

一、查询并杀会话 -- 查询会话 select pid,usename,client_addr,client_port,query_start,query,wait_event from pg_stat_activity; -- 杀会话 select pg_terminate_backend(pid号); -- 使用如下命令自动生成杀会话语句 select datid,datname,pid,usesysid,usename,applicat…

前端0基础用Cursor完成管理系统页面 - 1

Cursor下载 下载链接: https://www.cursor.com/ Hello World! 作为完全不会前端的人&#xff0c;首先需要让AI帮我们搭建一个HelloWorld界面 确定语言框架 首先要给AI框定好前端语言和框架&#xff0c;由于AI的物料大量来自网上的开源项目&#xff0c;所以越是受欢迎的开源…

系统组件优化的思考框架

我之前的文章里有分享过自己总结的做技术选型的思考框架&#xff0c;本文将会分享一下我总结的做系统组件调优/优化的思考框架。 组件优化的思考框架 常见的互联网架构基本离不开数据库、缓存、消息队列、搜索、数据处理等等各种组件&#xff0c;虽然组件的形态不一、功能不同…

Linux shell的七大功能 ---自动补齐、管道机制、别名

1、自动补齐---TAB 输入命令的前几个字符&#xff0c;按下tab键&#xff0c;会自动补齐完整的字符&#xff0c;若有多个命令、文件或目录的前几个字符相同&#xff0c;按下tab将会全部列举出来 2、管道机制---| 例如&#xff1a;ls -- help |more 将有关ls的帮助内容传递给“|…

计算机网络-基础概念(HTTP,TPC/IP, DNS,URL)

HTTP不同的版本 HTTP0.9于1990年问世&#xff0c;此时HTTP并没有作为正式的标准被建立。HTTP正式被公布是1996年的5月&#xff0c;版本命名为HTTP/1.0。HTTP1.1&#xff0c;1997年1月公布&#xff0c;目前仍然是主流版本的HTTP协议版本。 TCP/IP 通常使用的网络是在TCP/IP协…

12.3【JAVA-EXP4-DEBUGSTUDY】

java升级版本 JDK 1.8 是 Java Development Kit 的第 8 版本&#xff0c;发布于 2014 年 3 月 18 日。这个版本是 Java SE&#xff08;Standard Edition&#xff09;的一部分&#xff0c;包含了 Java 编程语言的实现、编译器、调试工具和其他相关组件 JDK 1.8: 这里的 1.8 表…

在Windows上运行mediapipe:适合新手的AI框架

一、mediapipe简介 mediapipe可以被视为谷歌版的onnx&#xff0c;其设计目的在于跨平台部署AI模型&#xff0c;并提供一系列工具来监测不同平台、不同设备运行人工智能模型时的性能表现。 尽管mediapipe已经陆续支持训练自定义模型&#xff0c;但博主更推荐使用Pytorch/Tenso…

自然语言处理:我的学习心得与笔记

Pytorch 1.Pytorch基本语法 1.1 认识Pytorch 1.2 Pytorch中的autograd 2.Pytorch初步应用 2.1 使用Pytorch构建一个神经网络 2.2 使用Pytorch构建一个分类器 小节总结 学习了什么是Pytorch. 。Pytorch是一个基于Numpy的科学计算包,作为Numpy的替代者,向用户提供使用GPU强大…

IAR环境下STM32静态库编译及使用

IAR环境下STM32静态库编译及使用 前言 最近了解到了STM32的静态库与动态库&#xff0c;在此记录一下STM32静态库的生成与使用。 静态库的作用主要是对代码进行封装及保护&#xff0c;使其他使用者只知其然而不知其所以然&#xff0c;因为封装后的静态库只有.h文件没有.c文件。…

【常考前端面试题总结】---2025

React fiber架构 1.为什么会出现 React fiber 架构? React 15 Stack Reconciler 是通过递归更新子组件 。由于递归执行&#xff0c;所以更新一旦开始&#xff0c;中途就无法中断。当层级很深时&#xff0c;递归更新时间超过了 16ms&#xff0c;用户交互就会卡顿。对于特别庞…

Leetcode 面试150题 399.除法求值

系列博客目录 文章目录 系列博客目录题目思路代码 题目 链接 思路 广度优先搜索 我们可以将整个问题建模成一张图&#xff1a;给定图中的一些点&#xff08;点即变量&#xff09;&#xff0c;以及某些边的权值&#xff08;权值即两个变量的比值&#xff09;&#xff0c;试…

hbase读写操作后hdfs内存占用太大的问题

hbase读写操作后hdfs内存占用太大的问题 查看内存信息hbase读写操作 查看内存信息 查看本地磁盘的内存信息 df -h查看hdfs上根目录下各个文件的内存大小 hdfs dfs -du -h /查看hdfs上/hbase目录下各个文件的内存大小 hdfs dfs -du -h /hbase查看hdfs上/hbase/oldWALs目录下…

使用webrtc-streamer查看实时监控

摄像头配置&#xff08;海康摄像头为例&#xff09; 摄像头视频编码应改成H264格式 webrtc-streamer下载 webrtc-streamer下载地址 下载后解压出来双击运行&#xff0c;端口默认8000 VUE2项目引入文件 在项目静态文件“public”中需引入两个js文件“webrtcstreamer.js”与“…

L1-3流量分析

1. 初步分析 数据包下载 流量分析基础篇 使用科来网络分析系统&#xff0c;打开L1-3.pcapng数据包&#xff0c;查看数据包中ssh的协议占的比例较大。 2. 通过分析数据包L1-3&#xff0c;找出黑客的IP地址&#xff0c;并将黑客的IP地址作为FLAG(形式:[IP地址)提交; 获取的fl…

【经典】制造供应链四类策略(MTS、MTO、ATO、ETO)细说

关注作者 制造供应链的牛鞭问题与复杂问题主要是从两个方面解决&#xff0c;一是同步化供应链消减从需求到供应的放大效应&#xff0c;二是供应链细分&#xff0c;针对不同的客户、不同的需求供应的匹配策略来应对复杂性&#xff0c;更好的满足客户并以最低的总成本来实现。 对…