即使 Xms = Xmx,G1GC 也会将内存释放给操作系统吗?

2023-12-24

阅读了一些答案后,例如this https://stackoverflow.com/a/30464183/1432247 and JEP-346 https://openjdk.java.net/jeps/346,我已经意识到 G1 确实将内存释放回操作系统。

但是,它是否会将内存释放回操作系统,甚至达到当前内存使用量低于初始堆内存的程度(即在此 JEP 之前,在我的情况下为 JDK11)?

假设我有一个运行 Java 11 的 VMXms and Xmx set as 5GB, on a 8GBRAM,但是我只消耗大约1GB。 G1 会释放足够的内存给操作系统吗?

我没有在任何地方找到任何文档表明 G1 仅限于释放保留Xms心中的门槛。

我在生产中观察到这一点,MemAvailable 持续减少直到一个点,然后在 GC 之后,它在 8GB 盒子上跃升到接近 30-35%。所以我假设它正在释放内存,这就是 MemAvailable 跳回来的原因。

另外,向操作系统释放内存到底意味着什么,是调用 free/unmap 吗?


注意:我已经删除了之前的答案并研究了来源(也构建了我自己的JVM只是为了找出这个特定的时刻),这就是答案。

简短的回答

JVM 11 version(目前),将not往下走Xms当使堆变小时。

长答案

绝对的真理在源代码中。和here https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/share/gc/g1/g1CollectedHeap.cpp#l1213是决定是否缩小堆。下面几行,您可以看到如果我们输入if,会有一条日志语句:

尝试堆收缩(Full GC 后容量高于最大所需容量)。

所以本质上,如果我们能理解两个参数:capacity_after_gc and maximum_desired_capacity- 我们可以解开这个谜团。一般来说,capacity_after_gc不是一件容易掌握的事;主要是看当时有多少垃圾,以及当前GC能回收多少。为了简单起见,我将编写一些不会生成任何垃圾的代码,以便该值是恒定的。

在这种情况下,我们只需要了解maximum_desired_capacity.

上面几行 https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/share/gc/g1/g1CollectedHeap.cpp#l1199,您可以看到计算如下:

maximum_desired_capacity =  MAX2(maximum_desired_capacity, min_heap_size);

不幸的是,这就是它变得棘手的地方,因为需要遵循和理解大量代码才能真正了解这些人体工程学是如何设置的;特别是因为它们依赖于各种论点JVM已经开始了。

例如min_heap_size 被设置为 https://hg.openjdk.java.net/jdk/jdk11/file/1ddf9a99e4ad/src/hotspot/share/runtime/arguments.cpp#l1827:

// If the minimum heap size has not been set (via -Xms),
// synchronize with InitialHeapSize to avoid errors with the default value.

请注意,他们甚至指的是-Xms as minimum;虽然文档说它是initial。您还可以注意到它further依赖于取决于另外两个属性 :

 reasonable_minimum , InitialHeapSize

这将很难进一步解释;这就是为什么我不会。相反,我将向您展示一些简单的证明(我确实浏览了大部分代码......)


假设您有这个非常简单的代码:

public class HeapShrinkExpand {

    public static void main(String[] args) throws InterruptedException {

        for (int i = 0; i < 10; i++) {
            Thread.sleep(500);
            System.gc();
        }
    }
}

我运行它:

-Xmx22g 
-XX:InitialHeapSize=1g
"-Xlog:heap*=debug" 
"-Xlog:gc*=debug" 
"-Xlog:ergo*=debug" 

在日志中,我会看到:

[0.718s][debug][gc,ergo,heap   ] GC(0) Attempt heap shrinking (capacity higher than max desired capacity after Full GC). Capacity: 1073741824B occupancy: 8388608B live: 1018816B maximum_desired_capacity: 27962026B (70 %)
[0.719s][debug][gc,ergo,heap   ] GC(0) Shrink the heap. requested shrinking amount: 1045779798B aligned shrinking amount: 1044381696B attempted shrinking amount: 1044381696B

这会告诉您一些关于需要收缩多少、当前容量是多少等的统计信息。下一行将显示堆实际上减少了多少:

[0.736s][debug][gc,ihop] GC(0) Target occupancy update: old: 1073741824B, new: 29360128B

堆确实缩小了,缩小到大约29MB.

如果我添加一个 JVM 启动标志:-Xms10g,那些负责显示堆收缩到多少的 GC 日志;将不再存在。

事实上如果我经营自己的JMV(启用一些日志记录),这两个值:capacity_after_gc and maximum_desired_capacity will always具有相同的价值观;意思是if statement永远不会被输入,堆也永远不会低于-Xms.


我已经使用 JDK-13 运行了相同的代码,并且虽然那里存在收缩日志(当-Xms作为参数给出),底层堆保留在-Xms, 仍然。我发现更有趣的是java-13,尝试运行:

 -Xmx22g -Xms5g -XX:InitialHeapSize=1g

将正确错误:

指定的最小和初始堆大小不兼容

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

即使 Xms = Xmx,G1GC 也会将内存释放给操作系统吗? 的相关文章

  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • 线程自动利用多个CPU核心?

    假设我的应用程序运行 2 个线程 例如渲染线程和游戏更新线程 如果它在具有多核 CPU 当今典型 的移动设备上运行 我是否可以期望线程在可能的情况下自动分配给不同的核心 我知道底层操作系统内核 Android linux内核 决定调度 我的
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • CXF Swagger2功能添加安全定义

    我想使用 org apache cxf jaxrs swagger Swagger2Feature 将安全定义添加到我的其余服务中 但是我看不到任何相关方法或任何有关如何执行此操作的资源 下面是我想使用 swagger2feature 生成
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 如何在 Java 中禁用 System.out 以提高速度

    我正在用 Java 编写一个模拟重力的程序 其中有一堆日志语句 到 System out 我的程序运行速度非常慢 我认为日志记录可能是部分原因 有什么方法可以禁用 System out 以便我的程序在打印时不会变慢 或者我是否必须手动检查并
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • hibernate总是自己删除表中的所有数据

    您好 我正在开发一个 spring mvc 应用程序 它使用 hibernate 连接到存储文件的 mysql 数据库 我有两个方法 一个方法添加我选择的特定文件路径中的所有文件 另一种方法调用查询以返回从 mysql 存储的文件列表 问题
  • 尝试使用 Ruby Java Bridge (RJB) gem 时出现错误“无法创建 Java VM”

    我正在尝试实现 Ruby Java Bridge RJB gem 来与 JVM 通信 以便我可以运行 Open NLP gem 我在 Windows 8 上安装并运行了 Java 所有迹象 至少我所知道的 都表明 Java 已安装并可运行
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • Android JNI C 简单追加函数

    我想制作一个简单的函数 返回两个字符串的值 基本上 java public native String getAppendedString String name c jstring Java com example hellojni He
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp

随机推荐