jvm垃圾回收

2023-11-16

为什么需要垃圾回收?

​ 首先这个问题的话,主要因为内存是计算机中比较宝贵的财富,如果堆积的对象过多,可想而知,内存会用尽,出现内存溢出的问题,这也就是为什么需要垃圾回收的原因。

对什么区域进行回收?

​ jvm中的内存结构中,虚拟机栈,本地方法栈,程序计数器随着线程的创建而创建,随着线程的销毁而销毁,因此这三个区域是不需要垃圾回收的,需要注意的是程序计数器是唯一一个不存在oom异常的,具体是因为程序计数器只需要存储线程上下文切换的行号等消耗较小的内存地址,内存分配是可见的。只存下一个字节码指令的地址,消耗内存小且固定,无论方法多深,他只存一条。

​ 因此垃圾回收区域不言而喻,那就是方法区了。

如何判断是否需要回收?

​ 判断对象是否需要回收,根据引用进行判断。主要有两种策略:引用计数法可达性分析两种策略。但是两种策略都是基于对象引用的。

引用计数法具体而言就是,每个对象都会存储着被引用的次数,如果被引用就引用次数就会+1,如果没有被引用,那就是需要被回收的对象了。但是这种方法存在这样的问题,A.instance=B;B.instance=A;循环引用,那这个怎么判断呢?因此这种方法不是很实用,因此引出可达性分析这个策略。

可达性分析也就是从根节点(常量池中的static,final,虚拟机栈中,所有被同步锁synchronized的对象等),如果当前对象被引用,那么连接一条线。如果存在没有被引用的对象,那么可达性分析,肯定是不可达的,因此该对对象就是被回收的。
上述提到的引用在jdk1.2后出现了细粒度的引用名词。强引用,软引用,弱引用,虚引用。四种引用的区别参考强引用、软引用、弱引用、虚引用的区别和作用,以及例子

如何进行回收?

​该阶段是完成了判断哪些对象是死的,哪些对象是活的之后,进行的阶段。该阶段目前有四种策略:标记清除标记复制标记整理分代收集策略。

标记清除:分为先标记再清除两个步骤。标记的话,根据可达性分析,判读出哪些对象是活的,哪些对象是死的,完成死活的标记;标记完毕之后,对死去的对象完成清除。此策略是Lisp之父提出来的,但是存在这样的问题:在清除后,出现了大量的内存碎片,在写入数据的时候会随机写入,随机写入造成的问题就是会出现大对象可能到小的区域里了,装的对象少了,那么垃圾回收的频率也会高了,垃圾回收频率高的话,系统的性能肯定会有影响。

标记复制: 分为先标记然后完成从from幸存区到to幸存区存活对象的复制。首先值得注意的是,该策略将内存一分为二。其次即使先进行死活对象的标记,标记后,将活的的对象复制到另一个区域,然后清除都是死的对象。这种方法操作起来肯定是很快的,但是问题是啥呢?那就是将内存区域一分为二了**。内存利用率是不高的

标记整理: 分为先标记再整理两个步骤。同样也先进行标记,将活的和死的进行标记。然后将死的统一清除掉,将活的对对象完成整理,也就是将其内存的地址整理为连续的地址。这种方法会涉及到移动对象,在移动的过程中会STW,如果移动的时间越长,那STW越久,弊端可想而知,影响业务。

​ 移动和不移动都会存在问题,移动了,STW时间更久,不移动,内存碎片!看看分代收集方法能否解决移动和不移动存在的问题。

分代收集: 将堆中区域分为新生代和老年代,由于大量对象的创建都是在新生代中的伊甸园区,根据这个现象,可以使用标记复制策略,也就是先进行标记,然后将存活的对象完成从幸存区from到to区转移,这样能够加快处理效率。而老年代呢?老年代存在的对象大多数都是不容易被回收的对象,也就是活着的对象,使用标记清除或者标记整理方法都是可以的,也就是说将死活的对象标记出,将少量的死对象清除。

这里存在个问题?如何进入老年代。

进入老年代的条件很简单。1)如果是大对象,直接进入老年代。为啥?因为新生代和老年代的比例为1:2。新生代如果存储的都是大对象,来个大对象,完成一次轻量级gc,随着大对象频繁的插入,轻量gc频率增大,系统就会完犊子。2)如果对象头的分代年龄达到15,那么就进入老年代。为啥是15,可以说工业级和学术界的在测试环境下,测试到15代是一个合理的数值。分代年龄如何计算的呢?一次轻量gc,分代年龄就+1。

参考资料
[1]强引用、软引用、弱引用、虚引用的区别和作用,以及例子

[2] 深入理解java虚拟机 JVM高级特性与最佳实践

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

jvm垃圾回收 的相关文章

  • 如何调试使用maven构建的android应用程序

    我目前正在尝试从 Eclipse 调试我的设备上的 Android 应用程序 设备已添加 我可以在控制台和 Eclipse 中看到它 控制台 Windows adb devices List of devices attached 0019
  • 为什么byteArray的长度是22而不是20?

    我们尝试从字符串转换为Byte 使用以下 Java 代码 String source 0123456789 byte byteArray source getBytes UTF 16 我们得到一个长度为 22 字节的字节数组 我们不确定这个
  • 使用 google-api-java-client 的 2 足 OAuth

    有谁知道如何将 2 legged OAuth 与 google api java client 一起使用 我正在尝试访问 Google Apps 配置 API 以获取特定域的用户列表 以下不起作用 HttpTransport transpo
  • 通过 JDBC 连接到 DB2 时的用户和密码

    我正在尝试连接到本地 DB2 10 5 Express C 服务器 这是一个测试环境 所以我不关心安全性 我能够连接到命令行处理器 在 Windows 上运行 并且我更改了配置设置AUTHENTICATION CLIENT and TRUS
  • 如何避免 Java 中的忙旋转

    我有一个多线程应用程序 其中一个线程向另一个线程发送消息 等待线程轮询消息并做出反应 处理锁 像这样 等待线程代码 while true if helloArrived System out println Got hello if bye
  • Maven 2 未运行 Junit 4 测试

    我在确保运行 Junit4 测试时遇到问题 同样的问题也被报告在https stackoverflow com questions 2021771 sort newest sort top https stackoverflow com q
  • Java 相当于 Perl 的 s/// 运算符?

    我有一些代码正在从 Perl 转换为 Java 它大量使用了正则表达式 包括s 操作员 我已经使用 Perl 很长时间了 但仍然习惯 Java 的做事方式 特别是 字符串似乎更难使用 有谁知道或有一个完全实现的Java函数s 这样它就可以处
  • 使用 Hibernate 和 Apache DBCP 的 MySQL 连接池问题

    看来我的应用程序有问题 当应用程序在启动后闲置很长时间 我不确定确切的时间 时 我会在日志中收到以下错误消息 我使用 Spring Hibernate MySQL 和 ApacheDBCP 进行连接池 ERROR org hibernate
  • 如何显示/隐藏jsf组件

    在我的一个 JSF 应用程序中 顶部的标题部分包含 selectOneMenu 底部的内容部分显示过滤器组件 默认情况下 应用程序首先在顶部显示 selectOneMenu 数据 在底部显示相应的 Filter 信息 如果用户选择不同的se
  • Java 中支持多少维数组,例如 a[1][1][1][1]....[1]? [复制]

    这个问题在这里已经有答案了 Java支持多少维数组a 1 1 1 1 1 我可以为数组声明无限数量的维度吗 数组维数限制为 255 有趣的是 JLS定义的Java编程语言没有这样的限制 但是你可以在JVM规范 http docs oracl
  • @Cachable 在没有输入参数的方法上?

    我有问题 org springframework cache annotation Cachable注解 Bean public ConcurrentMapCache cache return new ConcurrentMapCache
  • 整数与 int 比较

    我是新来的java 我现在正在学习非原始整数类型java 我知道以下比较无效并引发编译错误 String str c Char chr c if str chr return true 上面的代码片段给了我 Test java lineNu
  • 处理 ANTLR 4 中的错误

    遵循后接受的答案 https stackoverflow com a 18137301 2279200的指示处理 ANTLR4 中的错误 https stackoverflow com q 18132078 2279200问题 我遇到了以下
  • a4j:commandLink 重新渲染后停止工作

    我创建了这个测试用例来隔离我的问题 一旦轮询执行 ajax 更新 a4j commandLink 操作就不会执行 如果我们在轮询重新渲染之前关闭 modalPanel 则会执行它 有什么建议吗 提前致谢 测试 xhtml
  • Spring Boot 多部分文件始终为 null

    我正在使用 Spring Boot version 1 4 0 RC1 和 Spring Boot Stormpath 1 0 2 我正在尝试使用分段文件上传 但控制器中的 MultipartFile 始终为空 当我使用 RequestPa
  • 为什么java(>=7版本)不支持运行没有main方法的程序? [关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 class WithoutMain static System out println Without main class Sy
  • Elasticsearch NodeBuilder 与 TransportClient

    对于其他 Elasticsearch 开发人员来说 这可能是一个非常简单 而且愚蠢 的问题 这两者之间有什么区别 我正在从 Java Web 应用程序连接到远程 Elasticsearch 服务器 到目前为止我一直在使用 Transport
  • 如何在不同的班级中启动和停止计时器?

    我想测量从传入 HTTP 请求开始到应用程序到达某个点的时间 这两个时间点都位于不同的类中 我将如何启动和停止这些不同类别的计时器 我没有看到使用 MeterRegistry 中的 命名 计时器的方法 我该怎么办呢 您可以使用 AOP 如下
  • Java 空值检查

    我有一个thread1 if object null object play 和另一个thread2可以写null into object随时参考 我将同时运行这些线程 我知道thread2可以重写object后参考null检查并会抛出Nu
  • logcat 信息出现在 Android Studio 的“运行”选项卡中

    我的 android studio 运行选项卡很简单 然后它变得更难并给我更多信息 例如 logcat 中的信息 如何禁用或删除第二张图片中出现的更多信息并返回到第一张图片中的第一个外观 我只需要正在运行的 flutter 应用程序的日志输

随机推荐

  • 打印堆栈

    traceback print stack
  • SVN相关

    svn更新失败提示cleanup的解决方法 问题解决 https blog csdn net study4034 article details 80656882 注意关闭unity SVN更新后提示 One or more files a
  • 卷(二)C++___二刷

    Chapter 8 Type Conversion and Function Overloading 8 1 Implicit type conversion coercion The integer value 3 might be st
  • 合宙Air103

    基础资料 基于Air103开发板 Air103 LuatOS 文档 上手 开发上手 LuatOS 文档 探讨重点 对官方SPI FLASH demo中功能的复现 进行相关内容的学习及探讨 实现功能 功能 lua快速驱动 W25QXX XX代
  • windows:自定义内网ip后无法上网

    有可能能是ip冲突
  • Markdown给公式添加编号

    Markdown给公式添加编号 a 2 b 2 c 2 tag 1 2 由公式 1 2 即可得到结论
  • Eureka集群原理

    问题 微服务RPC远程服务调用最核心的是什么 高可用 试想你的注册中心只有一个only one 它出故障了那就呵呵o o了 会导致整个微服务环境不可用 解决办法 搭建Eureka注册中心集群 实现负载均衡 故障容错 Eureka集群的原理
  • c语言之字符串数组

    还是在写图的存储结构的时候 遇到了问题 就是如何在一个数组中存放字符串 我相信这个问题 对于面向对象的编程语言来说 轻而易举 比如对于Java来说 直接像下面就可以了 但是c语言没有String这个类型 能想到存放字符串的数据类型就是cha
  • 千万级SQL Server数据库表分区的实现

    一般在千万级的数据压力下 分区是一种比较好的提升性能方法 本文将介绍SQL Server数据库表分区的实现 AD 最近使用SQL SERVER一个的缓存 数据量一天100w的速度增长 同时接受客户查询 速度由于数据量越来越大越来越慢 这里感
  • vue3+ts 时间戳转日期格式

    时间戳转换成日期格式 调用 timestampToTime 1680498539 日期补0 const getzf num number string number gt const numShow string number num lt
  • EXCEL 做的购订单管理系统

    EXCEL 做的购订单管理系统 需要的下载 采购订单管理系统 01 总体说明 1 本系统主要用于采购订单以及付款管理 可进行供应商信息 产品信息的基础信息维护 可录入采购明细对采购金额进行付款 可对采购按照产品和采购日期范围查询 对采购明细
  • memset和memset_s

    void memset void s int ch size t n 函数解释 将s中前n个字节 typedef unsigned int size t 用 ch 替换并返回 s memset 作用是在一段内存块中填充某个给定的值 它是对较
  • TTransportException: java.net.ConnectException: Connection refused: connect异常

    看视频学用Thrift时遇到的 环境 win7 thrift 0 12 0 python37 jdk1 8 IDE IJ PC 本机java客户端 连 本机python服务器 部分代码 serverSocket TSocket TServe
  • 数据挖掘-数据探索(EDA)

    数据探索 EDA Exploratory Data Analysis 1 EDA的作用 EDA的作用主要在于熟悉并了解数据集 对数据集进行处理 以便接下来机器学习或者深度学习使用 了解数据集之后 接下来就是了解数据集中各变量间的相互关系 变
  • 2020年6月100篇最新GAN论文汇总

    点击上方 机器学习与生成对抗网络 关注 星标 获取有趣 好玩的前沿干货 戳我 查看GAN的系列专辑 据不完全统计 GAN在CVPR2020上超115篇之多 其中 可看到GAN在朝着无监督 自监督 弱监督 半监督 少样本 单样本 零样本 多模
  • 2024王道408数据结构P144 T16

    2024王道408数据结构P144 T16 思考过程 首先看题目 要求我们把二叉树的叶子结点求出来并且用链表的方式存储 链接时用叶结点的右指针来存放单链表指针 我们很清楚可以看出来能用中序遍历 递归的方式实现 因为第一个叶子结点在整棵树的最
  • Android中拍照和录像功能

    目前Android中有很多项目需要实现拍照及录像功能 通常都使用camera和sufaceView实现 整个过程较为繁琐 并且代码量比较大 偶然在github上发现一个很好用的框架 在这里做一个简单介绍 后附github地址 gif 原项目
  • SpringBoot——整合Mongodb

    简单介绍 Mongdb是一个开源 高性能 无模式的文档型数据库 NoSQL数据库产品中的一种 是最像关系型数据库的非关系型数据库 使用场景 用户数据 存储位置 数据库 特征 永久性存储 修改频率极低 游戏装备数据 存储位置 数据库 Mong
  • 2023华为od机试 Java实现【关联子串】

    题目 我们有两个字符串 分别叫做 str1 和 str2 现在规定 如果 str1 的排列组合只要有一个是 str2 的子串 我们就称str1是str2的关联子串 请返回子串在str2的起始位置 若不是关联子串则返回 1 示例1 输入输出示
  • jvm垃圾回收

    为什么需要垃圾回收 首先这个问题的话 主要因为内存是计算机中比较宝贵的财富 如果堆积的对象过多 可想而知 内存会用尽 出现内存溢出的问题 这也就是为什么需要垃圾回收的原因 对什么区域进行回收 jvm中的内存结构中 虚拟机栈 本地方法栈 程序