为什么 OpenJDK 11 Java 垃圾收集器*减少*此示例程序中的可用内存?

2023-11-24

当我使用 OpenJDK 11(Windows 10 上的 Zulu 发行版)编译并运行以下非常简单的 Java 程序时:

public class GCTest {
    public static void main(String[] args) {
        System.out.println("Free memory before garbage collection: " + Runtime.getRuntime().freeMemory());
        Runtime.getRuntime().gc();
        System.out.println("Free memory  after garbage collection: " + Runtime.getRuntime().freeMemory());
    }
}

看起来垃圾收集是减少可用内存量:

Free memory before garbage collection: 266881496
Free memory  after garbage collection: 7772200

当我使用 Oracle 的 Java 8 运行它时,不会发生这种情况:

Free memory before garbage collection: 254741016
Free memory  after garbage collection: 255795064

这是为什么?


答案是:Java 11 的 GC(当显式调用时,例如通过System.gc())可以减少Java进程使用的内存(在Java中称为totalMemory).

在 Java 8 中,默认垃圾收集器无法减少 Java 进程的已用内存。 Java 进程占用的内存从未被释放。仅当您切换到G1GC垃圾收集器(选项'-XX:+UseG1GC')Java 8能够减少Java进程使用的内存(如果你手动调用System.gc()).

“空闲内存”是Java进程占用但当前未使用的内存。因此,如果执行垃圾回收并且 Java 占用的内存减少,则可用内存量也会减少。

因此,计算 Java 进程的“可用内存”的常用方法是使用

Runtime r = Runtime.getRuntime();
long free = r.maxMemory() - r.totalMemory() + r.freeMemory();

这种方式与Java进程当前占用的内存无关。

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

为什么 OpenJDK 11 Java 垃圾收集器*减少*此示例程序中的可用内存? 的相关文章

随机推荐

  • Java错误:应该在名为[重复]的文件中声明

    这个问题在这里已经有答案了 我对 Java 相当陌生 并试图弄清楚如何解决以下错误 读取错误 CalculatorWithMemory java 1 class Calculator is public should be declared
  • 如何找到最近的标记 leaflet.js

    我想知道是否真的有某种方法可以使用 leaflet js 找到我位置附近的标记 我首先想到的是存储我所在位置的纬度和经度 然后迭代一系列纬度和经度标记 将它们放入一个数组中 然后对该数组进行排序 我不确定这是否是一个好的选择 因为如果地图上
  • 路由器在 NAT 中保留记录多长时间?这些记录可以重复使用来转发来自其他主机的请求吗?

    有一个答案以简单的方式解释了路由器如何将请求从本地网络转换到外部网络并返回 https superuser com questions 105838 how does router know where to forward packet
  • 在 winapi 中拖放

    我有一个纯 Winapi 应用程序 需要一些新功能 其中之一最好实现为两个列表 您可以在列表之间拖放 多个 元素 新功能可以仅限于单个对话框 实现这一点的最快方法是什么 一些想法 纯Winapi 是DetectDrag 提供这一对话框的单独
  • Gradle resValue 导致重复字符串资源

    我的 Android 清单文件定义应用程序名称如下 android label string app name res values strings xml 中存在 app name 的相应条目 现在 在我的 build gradle 中
  • 如何使 Python/Sphinx 文档对象属性仅在 __init__ 中声明?

    我有带有对象属性的 Python 类 这些属性仅在运行构造函数时声明 如下所示 class Foo object def init self base self basepath base temp for run in os listdi
  • 从 C# 中的枚举获取字符串名称

    我已经声明了一个枚举 如下所示 public enum State KARNATAKA 1 GUJRAT 2 ASSAM 3 MAHARASHTRA 4 GOA 5 从外部来源 我得到的状态值为 1 或 2 或 3 或 4 或 5 根据我得
  • 是什么让 C 比 Python 更快? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我知道这可能是一个非常明显
  • C 宏 _Generic 给出意外的编译器错误

    使用 gcc exe Rev3 由 MSYS2 项目构建 8 2 0 我试图构建一个宏来自动在两种类型之间进行类型转换 其中两个参数永远不应该是相同的类型 我的问题是 如果我不包含相同类型的情况 编译器会抛出错误 我想要什么 include
  • 如何在signalR HubClass中使用UrlHelper

    我有一个从 Hub 驱动的聊天类 我想知道是否有一种方法可以通过 URLHelper 构建 URL 例如 Url Action action Controller 因为我可以从 2 个抽象类 集线器 控制器 派生该类 所以我不知道是否还有其
  • 如何设置适用于 Android 的 Google 云消息传递?

    我正在尝试实施Google Cloud Messaging for Android GCM 通过遵循demo 但我无法执行一些命令 例如 ant war android update project name GCMDemo p targe
  • iOS - 多次点击手势识别器

    在我的应用程序中 我必须检测单击 双击和三次点击 所以 我正在使用 UITapGestureRecognizer 我正在使用以下代码 UITapGestureRecognizer oneTap UITapGestureRecognizer
  • 调试 Sunspot 上的 Solr 搜索查询

    在 Rails 上使用 Sunspot gem 时如何调试 Solr 搜索查询 我有一些查询返回了异常高的分数 我试图弄清楚为什么会发生这种情况 似乎没有任何调试信息暴露给Sunspot 所以我认为我需要直接通过Solr进行调试 幸运的是
  • 文字闪烁 jQuery

    在 jQuery 中使文本闪烁的简单方法是什么以及停止它的方法是什么 必须适用于 IE FF 和 Chrome 谢谢 一个让某些文本闪烁的插件对我来说听起来有点矫枉过正 尝试这个 blink each function var elem t
  • 如何从 .h5 文件正确加载带有自定义层的 Keras 模型?

    我构建了一个带有自定义层的 Keras 模型 并将其保存到 h5通过回调文件ModelCheckPoint 当我在训练后尝试加载该模型时 出现以下错误消息 init missing 1 required positional argumen
  • 有什么理由使用 System.Uri 吗?

    我仔细看了一下 似乎它已经从根本上坏了 只有 5 个实例方法未标记为过时 似乎没有任何内置方法 解析查询字符串变量 没有方法可以改变 Uri 例如附加新的查询变量 HttpUtility 适用于字符串 不适用于 URI 那么它有什么好处吗
  • 为什么我的 WPF 应用程序中出现“无法加载 DLL 'sqlite3'”?

    我将我认为必要的 SQLite 和 sqlite net 包添加到我的应用程序中 但是 在运行它时 我遇到了一个异常 System DllNotFoundException 未被用户代码处理 HResult 2146233052 消息 无法
  • 加快 write.table 的性能

    我有一个data frame我想把它写出来 我的尺寸data frame为 256 行 x 65536 列 有什么更快的替代品write csv data table fwrite 由 Otto Seiskari 贡献 提供 1 9 8 版
  • 使用另一个列表的元素名称创建空列表

    假设我们有一个列表my list a b c 我想做的是创建空列表 a b c 这样我就可以根据它们的名称向它们添加一些元素 以编程方式创建变量是一个非常糟糕的主意 使用这些名称作为键创建一个字典 my lists key for key
  • 为什么 OpenJDK 11 Java 垃圾收集器*减少*此示例程序中的可用内存?

    当我使用 OpenJDK 11 Windows 10 上的 Zulu 发行版 编译并运行以下非常简单的 Java 程序时 public class GCTest public static void main String args Sys