为什么 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 垃圾收集器*减少*此示例程序中的可用内存? 的相关文章

  • 在Maven中生成Version.java文件

    我有一个使用 Ant 脚本构建的 Java 项目 我正在尝试将项目转换为 Maven 其中一项任务生成一个名为 Version java 的 Java 源文件 其中包含编译时间戳的静态字符串表示形式 如下所示 package com foo
  • Jackson JSON + Java 泛型

    我正在尝试将以下 JSON 反序列化 映射到List
  • 在Windows Server 2003下如何在本地系统帐户下运行jvisualvm.exe?

    我在带有 Java 1 6 u 20 的 Windows Server 2003 下将 GlassFish 3 0 1 作为 Windows 服务运行 总体上我很满意 我希望能够在这个 JVM 上使用 VisualVM 并使用无法在 Tom
  • 如何以编程方式使用包含多列的 where-in 子句执行 PostgreSQL 查询?

    我的查询是这样的 select from plat customs complex where code t code s in 01013090 10 01029010 90 它在 psql 控制台中运行良好 我的问题是如何在客户端代码中
  • Java 中的 <-- 是什么? [复制]

    这个问题在这里已经有答案了 我遇到了下面的片段 它输出到4 3 2 1 我从来没有遇到过 lt 在爪哇 Is lt 使 var1 的值变为 var2 的运算符 public class Test public static void mai
  • 为什么用scala写的代码比用java写的慢6倍?

    我不确定我在编写 scala 代码时是否犯了一些错误 问题是 The four adjacent digits in the 1000 digit number that have the greatest product are 9 9
  • 将类转换为 JSONObject

    我有好几堂这样的课 我想将类转换为 JSONObject 格式 import java io Serializable import com google gson annotations SerializedName public cla
  • JAXB - 忽略元素

    有什么方法可以忽略 Jaxb 解析中的元素吗 我有一个很大的 XML 文件 如果我可以忽略其中一个大而复杂的元素 那么它的解析速度可能会快很多 如果它根本无法验证元素内容并解析文档的其余部分 即使该元素不正确 那就更好了 例如 这应该只生成
  • 在光标所在行强制关闭!

    嘿 我正在尝试创建一个应用程序来查找存储在 SQlite 数据库中的 GPS 数据 但我面临一个问题 我构建了一个 DbAdapter 类来创建数据库 现在我尝试使用以下函数从另一个类获取所有数据上的光标 public Cursor fet
  • Android 认为我没有关闭数据库!为什么?

    我有一个 SQLiteDatabase 数据成员 我在 onCreate 中初始化它 并在 onPause onStop 和 onDestroy 中调用 close 它在 onResume 中重新初始化 它似乎运行得很好 但当我查看调试器时
  • 无需递归即可对可观察结果进行分页 - RxJava

    我有一个非常标准的 API 分页问题 您可以通过一些简单的递归来处理 这是一个捏造的例子 public Observable
  • Android - 存储对ApplicationContext的引用

    我有一个静态 Preferences 类 其中包含一些应用程序首选项和类似的内容 可以在那里存储对 ApplicationContext 的引用吗 我需要该引用 以便我可以在不继承 Activity 的类中获取缓存文件夹和类似内容 你使用的
  • 按降序排序映射java8 [重复]

    这个问题在这里已经有答案了 private static
  • Tomcat 6 未从 WEB-INF/lib 加载 jar

    我正在尝试找出我的 tomcat 环境中的配置问题 我们的生产服务器正在运行 tomcat 安装并从共享 NFS 挂载读取战争 然而 当我尝试使用独立的盒子 及其配置 进行同样的战争时 我收到下面发布的错误 有趣的是 如果我将 WEB IN
  • 我们如何使用 thymeleaf 绑定对象列表的列表

    我有一个表单 用户可以在其中添加任意数量的内容表对象这也可以包含他想要的列对象 就像在 SQL 中构建表一样 我尝试了下面的代码 但没有任何效果 并且当我尝试绑定两个列表时 表单不再出现 控制器 ModelAttribute page pu
  • Android ScrollView,检查当前是否滚动

    有没有办法检查标准 ScrollView 当前是否正在滚动 方向是向上还是向下并不重要 我只需要检查它当前是否正在滚动 ScrollView当前形式不提供用于检测滚动事件的回调 有两种解决方法可用 1 Use a ListView并实施On
  • Java 中清除嵌套 Map 的好方法

    public class MyCache AbstractMap
  • 检测到 JVM 正在关闭

    我有一个使用 addShutdownHook 处理 Ctrl C 的 Swing 应用程序 它工作正常 直到我的关闭任务之一调用一个在正常情况下更改 JLabel 文本的函数 此时它挂起 我认为问题是 Swing EDT 已终止或正在等待某
  • 如何让 Firebase 与 Java 后端配合使用

    首先 如果这个问题过于抽象或不适合本网站 我想表示歉意 我真的不知道还能去哪里问 目前我已经在 iOS 和 Android 上开发了应用程序 他们将所有状态保存在 Firebase 中 因此所有内容都会立即保存到 Firebase 实时数据
  • 设置 TreeSet 的大小

    有没有办法像数组一样对 Java 集合中的 TreeSet 进行大小限制 例如我们在数组中 anArray new int 10 数组具有固定长度 在创建数组时必须指定该长度 A TreeSet当您向其中添加元素时会自动增长 您无法设置其大

随机推荐

  • 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