GC是否将内存释放回操作系统?

2023-12-09

当垃圾收集器运行并释放内存时,这些内存会返回操作系统还是被保留为进程的一部分。我的强烈印象是,内存实际上从未被释放回操作系统,而是作为内存区域/池的一部分保留,以供同一进程重用。

因此,进程的实际内存永远不会减少。一篇文章这让我想起了这一点,Java 的运行时是用 C/C++ 编写的,所以我想同样的事情也适用?

Update
我的问题是关于Java的。我提到 C/C++ 是因为我假设 Java 的分配/释放是由 JRE 使用某种形式的 malloc/delete 完成的


The 热点 JVM确实将内存释放回操作系统,但不情愿地这样做,因为调整堆大小的成本很高,并且假设如果您需要该堆一次,您将再次需要它。

一般来说,收缩能力和行为取决于所选择的垃圾收集器、JVM 版本,因为收缩功能通常是在添加 GC 本身很久之后才在后续版本中引入的。一些收集器可能还需要传递额外的选项才能选择缩小。有些人很可能永远不会支持它,例如EpsilonGC。 因此,如果需要堆收缩,则应针对特定 JVM 版本和 GC 配置进行测试。

JDK 8 及更早版本

在这些版本中没有用于提示内存回收的明确选项,但您可以通过设置来使 GC 更加积极-XX:GCTimeRatio=19 -XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=30这将允许它花费更多的 CPU 时间来收集并限制 GC 周期后已分配但未使用的堆内存量。

如果您使用并发收集器,您还可以设置-XX:InitiatingHeapOccupancyPercent=N将 N 设置为某个较低值,让 GC 几乎连续运行并发收集,这将消耗更多 CPU 周期,但会更快收缩堆。这一般来说这不是一个好主意,但在某些类型的具有大量备用 CPU 核心但内存不足的机器上,它是有意义的。

如果您使用的是 G1GC,请注意它仅获得了以下能力:返回堆中间未使用的块对于 jdk8u20,早期版本只能返回堆末尾的块,这对可回收的量设置了很大的限制。

如果您使用具有默认暂停时间目标的收集器(例如 CMS 或 G1),您还可以放宽该目标以减少对收集器的限制,或者您可以切换到并行收集器以优先考虑占用空间而不是暂停时间。

要验证是否发生收缩或诊断 GC 决定不收缩的原因,您可以使用 GC 日志记录-XX:+PrintAdaptiveSizePolicy还可以提供见解,例如当 JVM 尝试为年轻代使用更多内存来实现某些目标时。

JDK 9

添加了-XX:-ShrinkHeapInSteps选项可用于更积极地应用上一节中提到的选项引起的收缩。相关 OpenJDK 错误.

用于记录-XX:+PrintAdaptiveSizePolicy已替换为-Xlog:gc+ergo

JDK 12

引入了通过以下选项启用 G1GC 快速内存释放的选项G1PeriodicGCInterval (JEP 346),同样以一些额外的 CPU 为代价。 JEP 中也提到了类似的功能谢南多厄OpenJ9 虚拟机.

JDK 13

添加类似的行为for ZGC,在这种情况下它是默认启用的。此外XXSoftMaxHeapSize对于某些工作负载来说,将平均堆大小保持在某个阈值以下,同时仍然允许瞬时峰值可能会有所帮助。

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

GC是否将内存释放回操作系统? 的相关文章

  • 如何让 BlazeDS 忽略属性?

    我有一个 java 类 它有一个带有 getter 和 setter 的字段 以及第二对 getter 和 setter 它们以另一种方式访问 该字段 public class NullAbleId private static final
  • 在 Java 中克隆对象 [3 个问题]

    这样做会调用Asub的clone方法吗 或者Asub深度克隆是否正确 如果没有的话 有没有办法通过这种方法对Asub进行深度克隆呢 abstract class Top extends TopMost protected Object cl
  • Mockito:如何通过模拟测试我的服务?

    我是模拟测试新手 我想测试我的服务方法CorrectionService correctPerson Long personId 实现尚未编写 但这就是它将执行的操作 CorrectionService将调用一个方法AddressDAO这将
  • 如何通过 javaconfig 使用 SchedulerFactoryBean.schedulerContextAsMap

    我使用 Spring 4 0 并将项目从 xml 移至 java config 除了访问 Service scheduleService 带注释的类来自QuartzJobBean executeInternal 我必须让它工作的 xml 位
  • 使用 LinkedList 实现下一个和上一个按钮

    这可能是一个愚蠢的问题 但我很难思考清楚 我编写了一个使用 LinkedList 来移动加载的 MIDI 乐器的方法 我想制作一个下一个和一个上一个按钮 以便每次单击该按钮时都会遍历 LinkedList 如果我硬编码itr next or
  • 为 java 游戏创建交互式 GUI

    大家好 我正在创建一个类似于 java 中的 farmville 的游戏 我只是想知道如何实现用户通常单击以与游戏客户端交互的交互式对象 按钮 我不想使用 swing 库 通用 Windows 看起来像对象 我想为我的按钮导入自定义图像 并
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • Java 公历日历更改时区

    我正在尝试设置 HOUR OF DAY 字段并更改 GregorianCalendar 日期对象的时区 GregorianCalendar date new GregorianCalendar TimeZone getTimeZone GM
  • 没有 Spring 的自定义 Prometheus 指标

    我需要为 Web 应用程序提供自定义指标 问题是我不能使用 Spring 但我必须使用 jax rs 端点 要求非常简单 想象一下 您有一个包含键值对的映射 其中键是指标名称 值是一个简单的整数 它是一个计数器 代码会是这样的 public
  • 无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]-MySQL

    我是 Hibernate 的新手 我目前正在使用 Spring boot 框架并尝试通过 hibernate 创建数据库表 我知道以前也问过同样的问题 但我似乎无法根据我的环境找出如何修复错误 休眠配置文件
  • 将 MOXy 设置为 JAXB 提供程序,而在同一包中没有属性文件

    我正在尝试使用 MOXy 作为我的 JAXB 提供程序 以便将内容编组 解组到 XML JSON 中 我创建了 jaxb properties 文件 内容如下 javax xml bind context factory org eclip
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • logcat 中 mSecurityInputMethodService 为 null

    我写了一点android应显示智能手机当前位置 最后已知位置 的应用程序 尽管我复制了示例代码 并尝试了其他几种解决方案 但似乎每次都有相同的错误 我的应用程序由一个按钮组成 按下按钮应该log经度和纬度 但仅对数 mSecurityInp
  • 不接受任何内容也不返回任何内容的函数接口[重复]

    这个问题在这里已经有答案了 JDK中是否有一个标准的函数式接口 不接受也不返回任何内容 我找不到一个 像下面这样 FunctionalInterface interface Action void execute 可运行怎么样 Functi
  • 干净构建 Java 命令行

    我正在使用命令行编译使用 eclipse 编写的项目 如下所示 javac file java 然后运行 java file args here 我将如何运行干净的构建或编译 每当我重新编译时 除非删除所有内容 否则更改不会受到影响 cla
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类
  • 如何防止在Spring Boot单元测试中执行import.sql

    我的类路径中有一个 import sql 文件 其中包含一些 INSERT 语句 当使用 profile devel 运行我的应用程序时 它的数据被加载到 postgres 数据库中 到目前为止一切正常 当使用测试配置文件执行测试时 imp

随机推荐

  • 以任意角度将球从墙上弹起?

    我试图让用户画一个球拍 然后他们可以用它来击球 然而 我似乎无法让球正确弹跳 因为球速度的 x 和 y 分量没有与墙壁对齐 我该如何解决这个问题 我尝试了加雷斯 里斯 Gareth Rees 给出的建议here 但显然我对向量了解不够 无法
  • 在 DataTemplate UWP 中绑定 ComboBoxItem 的 IsSelected 属性

    我正在尝试绑定 ComboBoxItem 的属性 IsSelected 以显示正确的图标 如果选择了项目 则应显示红色图标 否则打开列表的其余部分为灰色 我如何尝试实现该功能的方式如下面的代码所示
  • C# Xamarin Timer 类不更新视图

    using System using System Collections Generic using System Linq using System Text using System Threading Tasks using Sys
  • 窗口弹出窗口 - 如何让 window.blur() 或 window.focus() 在 FireFox 4 中工作?

    我知道 FF4 不允许使用window blur 除非在 FF 配置中启用了 升高或降低窗口 设置 它简单地忽略了该事件 我知道某些网站仍然设法打开弹出窗口并保持当前窗口的焦点 即使此设置已关闭 他们是如何实现这一目标的 此外 我不明白为什
  • 如何在运行时存储或读取动画剪辑数据?

    我正在开发一个小程序 可以在运行时修改动画 例如 当你跑得更快时 动画不仅播放得更快 而且运动也更大 所以我需要获取现有的动画 更改其值 然后将其发送回来 我发现很有趣的是 我可以为动画设置一条新曲线 但我无法访问我已经拥有的曲线 因此 我
  • md5是否可以阻止SQL注入

    Ok 所以 我对此有点不确定 我有一个 url 参数username 我有这样的声明 SELECT FROM users WHERE user hash md5 GET username 这安全吗 创建帐户后 将存储用户名和密码的 md5
  • 异步 JavaScript 程序中的函数调用到底是如何排序的?

    我正在学习的概念异步编程在 JavaScript JS 中 但是 我很难理解这一点 这几天我一直在网上阅读各种文章来理解它 但我无法理解这个想法 那么 我的疑问如下 setTimeout function alert Hello 1 300
  • Git 从命令行注销用户

    有没有退出git的命令 我正在将我的计算机移交给其他人 并且不希望 git 附加到我在终端中的帐户 我遇到了同样的问题 上面的答案对我不起作用 因为github我的凭据是通过 Windows 凭据管理器而不是 git bash 提供的 您可
  • Python Google Cloud 函数缺少日志条目

    我正在第一次尝试 GCP 的云函数和 python 并希望将 python 的日志记录充分集成 以便它们能够很好地适应 GCP 的日志记录基础设施 特别是为了识别严重性级别 并且最好还包括execution ids 和跟踪 id 我一直在关
  • 切换隐藏/显示 Google 地图标记

    我有一个自定义的谷歌地图 上面有艺术家位置的标记 我想做 8 种不同类别的标记 我读到必须制作标记数组并分配类别 但老实说我不知道 从哪里开始 我认为这个问题很接近我想要的 按类别打开 关闭 Google 地图标记 试图让它发挥作用 但无济
  • 列出每个存储桶的缩略图

    我有2节课 首先是用于搜索所有文件夹 我的意思是桶列表名称 秒级制作缩略图 但我需要每个桶都有缩略图 因此 当我按下文件夹时 它应该显示其中的所有照片 缩略图 有人可以帮我吗 第一类 public class ThumbnailAdapte
  • 可变边的三栏网页设计

    我一直在尝试想出一种方法来创建 3 列网页设计 其中中心列具有恒定的宽度并且始终居中 左侧和右侧的列是可变的 这在表中是微不足道的 但在语义上并不正确 我无法在所有当前浏览器中使其正常工作 这方面有什么建议吗 Use 这项技术 只需为中心列
  • ASP.NET 中的 OpenStreetMap

    我有兴趣在使用 ASP NET 开发的 Web 应用程序中使用 OpenStreetMap 有人知道在 ASP NET 中是否有使用 OpenStreetMap 的控件 库或包装器 C 不使用 JavaScript 我不确定他们是否有任何
  • 避免从不同位置多次登录帐户

    我想限制同一用户从不同位置多次登录 如何识别用户在同一时间 最近时间从不同位置多次登录 我认为表中的一些标志和 IP 检查可能是一个可能的解决方案 但是有更好的解决方案吗 更新 我认为会话或 cookie 如果适用于单台机器可能会有所帮助
  • 使用 bigquery 根据日期将表拆分为多个表,并使用单个查询进行分区

    我想做的最初的 原因 是 恢复表时保持其原始分区 而不是将其全部放入今天的分区中 我以为我能做的是bq load到临时表 然后运行一个查询 按照所需的命名约定将该表拆分为每天一张表 YYYYMMDDbq partition i e shar
  • 在 R 数据表中添加单元格边框

    对 R 相当陌生 在大局方面做得还不错 但当我想向其他人展示一些东西时 却很难清理边缘 用可能非常简单的东西把我的头撞在墙上 我只是想在一个闪亮的应用程序的数据表中添加单元格边框 到所有单元格 这是相关的代码块 library ggplot
  • PostgreSQL和nodejs/pg,返回嵌套的JSON

    我将 PostgreSQL 与 nodejs 和 pg 一起使用 一切工作正常 但我想将 PostgreSQL 的结果作为嵌套 json 输出 就好像我正在使用 MongoDB 或类似的东西一样 我来自 PostgreSQL 的 2 个表是
  • 将文本拆分为最小长度的较小段落,而不破坏给定阈值的句子

    有更好的方法来完成这项任务吗 对于 NLP 任务的预处理 我试图将大块文本分割成偶数长度的字符串列表 通过在每个 处分割文本 我的句子长度会很不均匀 通过使用索引 数字 我会在中间切断句子 目标是将句子放在长度均匀的列表中 而不会在句子结束
  • 如何使 iframe 水平居中?

    考虑以下示例 现场演示 HTML div div div CSS div iframe width 100px height 50px margin 0 auto background color 777 Result Why the if
  • GC是否将内存释放回操作系统?

    当垃圾收集器运行并释放内存时 这些内存会返回操作系统还是被保留为进程的一部分 我的强烈印象是 内存实际上从未被释放回操作系统 而是作为内存区域 池的一部分保留 以供同一进程重用 因此 进程的实际内存永远不会减少 一篇文章这让我想起了这一点