为什么unix和Java运行时显示的统计数据存在差异

2023-12-01

我的应用程序遇到一些内存问题,需要帮助理解这些统计数据。

Unix“top”显示了我的进程的这些统计数据-

VSZ: 37.4g
RSS: 20.0g 

因此,这意味着 20g 当前已换入进程并正在使用。

但是,当我使用运行时类从应用程序中打印统计信息时,我得到以下信息:

Runtime.totalMemory() : 9.8G
Runtime.freeMemory()  : 3.6G
Runtime.maxMemory()  : 14.3G

为什么 [Runtime.totalMemory() - Runtime.freeMemory()] 与 RSS 不匹配?这是进程当前使用的内存。两个数字之间存在巨大差异。

另外,运行时是否会将未使用的内存(Runtime.freeMemory())返还给操作系统以供其他进程使用?

请注意,我的应用程序正在使用共享和复制缓存设置的对等 GemFire 缓存系统中运行。我需要优化应用程序以减少内存占用。


Runtime.totalMemory 显示当前可用内存。 Java 是惰性分配内存的。

另外,运行时是否会将未使用的内存(Runtime.freeMemory())返还给操作系统以供其他进程使用?

不会。如果 Java 分配了内存(totalMemory),那么它现在就在 java 进程中。

RSS:20.0g 14.3G

正如已经提到的,Java 除了堆之外还使用内存。 Gemfire 还使用堆外内存(检查这个)。 尝试在 VisualVM-Buffer Monitor 中查看它们。

您的基础设施(操作系统、虚拟机)是什么?

如果您无法使用标准工具,您可能应该使用 JMX 编写自己的可服务性代理(例如)

UPDATE

根据文档,默认情况下 Gemfire 使用 JVM 堆。

Ok

为什么对于仅使用约 10G 堆内存的进程,RSS 始终显示 20G。

如果您仍然询问,我会提供更多详细信息。 java内存使用情况是什么?

  • 堆内存(Xmx);
  • 堆栈内存(每个线程都有自己的堆栈线程堆栈大小, VM线程堆栈大小);
  • MaxPermSize 或 MaxMetaspaceSize (最大永久代大小, 最大元空间大小);
  • 直接字节缓冲区(最大直接内存大小);
  • 内存池(Par Eden 空间、Par Survivor 空间、CMS Old Gen、Metaspace/PermGen、代码缓存、压缩类空间(压缩类空间大小));
  • 字符串表(所有 String.intern() 都将在其中,字符串表大小);
  • 性能数据内存大小;
  • 标记堆栈大小;
  • 编译器线程堆栈大小;
  • 常量池;
  • 我可能错过了某物;

要查看默认值,您可以运行:

 java -XX:+UnlockDiagnosticVMOptions -XX:+PrintFlagsFinal -version

要查看适合您的特定进程的选项,您可以运行:

 jps -lvm

unix中是否有命令行工具来确定其余用法?

对于其中一些人来说是的。对于其中一些人来说没有。

对于直接内存,您可以尝试 sun.misc.SharedSecrets.getJavaNioAccess().getDirectBufferPool().getMemoryUsed()。

以cmd为例:

 jcmd <pid> VM.native_memory baseline

但这取决于运行设置(本机内存跟踪)。您可以阅读如何启用本机内存跟踪here.

在Linux中你还可以使用:

 pmap -x <pid>

总之,这可能无关紧要,因为您的任务:

请注意,我的应用程序正在使用共享和复制缓存设置的对等 GemFire 缓存系统中运行。我需要优化应用程序以减少内存占用。

并且您不能影响本机内存使用。我想看看jmaputil,它可以显示类直方图。您应该检查 GemFire 中大小较大的对象并检查这些对象,可能您存储在缓存数据中,但这些对象不应该存在。我的意思是,在优化缓存的实践中,我会检查对象和字段,看看哪些字段真正频繁,哪些字段不频繁。另一种方法是检查序列化机制和对象布局。

正如我提到的,您可以使用可服务性代理:

import com.sun.tools.attach.VirtualMachine;
import sun.tools.attach.HotSpotVirtualMachine;

import java.io.InputStream;

public class JMemoryMain {

    public static void main(String[] args) throws Exception {
        final int pid = JMemoryMainUtils.getPid(args);
        final HotSpotVirtualMachine vm = (HotSpotVirtualMachine) VirtualMachine.attach(String.valueOf(pid));
        final byte[] buffer = new byte[1024];
        try (InputStream is = vm.heapHisto()) {
            for (int read; (read = is.read(buffer)) > 0;) {
                System.out.write(buffer, 0, read);
            }
        }
        vm.detach();
    }

}

您需要 JDK 中的依赖项中的 tools.jar 来运行它。它也可以打印类直方图,但有时可以工作,而 jmap 则不能。 另外,当您需要等待很长时间时,在计算直方图时,您可以使用 VM.getSystemDictionary() 并仅查找您的类。 而且,如果由于开销而无法启用 NMT,这将很有用。

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

为什么unix和Java运行时显示的统计数据存在差异 的相关文章

随机推荐

  • 如何让我的 Facebook 应用程序在安装后自动请求所需的权限

    我正在使用 Facebook PHP SDK 2 1 2 我想做的就是几乎每个 Facebook 应用程序都具有req perms有 安装时会弹出愚蠢的 请求权限 框 我不想要用户必须按下的按钮 我不希望出现弹出窗口 我不想使用 FBML
  • 将“this”和参数传递给 addEventListener 函数而不使用绑定

    接下来禁用插件时 引导插件中的删除事件监听器不起作用 我正在探索其他可能性 除了使用bind 并缓存绑定函数 有没有办法使用 this 并传递参数 works fine but can t pass argeement contextMen
  • UITableView 滑动手势需要近乎完美的准确性

    我正在为使用自定义 UITableViewCell 子类的 UITableView 开发自定义滑动事件 我包括了UIGestureRecognizerDelegate在我的标题中 并将其放入viewDidLoad UISwipeGestur
  • 在 GNU 汇编器宏中引用操作数/参数

    我目前正在尝试理解的概念汇编语言中的宏 特别是在 GNU 汇编器中 IA 32 x86 的 AT T 语法 我大学的幻灯片内容如下 How to define a macro macro write string movl string e
  • 在 Magento 中通过 SOAP 将产品添加到购物车时设置自定义选项

    我正在尝试使用购物车产品添加用于将具有自定义选项的产品添加到购物车的 SOAP API 下面是我为产品参数传递的数组 我有一个自定义选项 id 1 下拉列表中的选定值 id 为 2 您可以查看产品在这里 array size 1 0 gt
  • Android 快捷方式位图启动器图标大小

    我无法找到快捷方式的正确启动器图标大小 在我的 Nexus 7 2 上 android R dimen app icon size 参见代码 的值为 96 像素 但如果我在我的主屏幕截图上测量其他应用程序的真实图标大小 它是 120 像素
  • 类型错误:$ 在 jquery 中未定义

    我正在尝试在基于 WordPress 的网站上使用 jquery 中的 tabcordion 库 tabcordion javascript 文件正在 排队 并出现在 jquery 文件之后 因此该位看起来不错 jquery 代码的开头是
  • SQL CLR - 从 2008 R2 迁移到 2012。

    我在 SQL 2008 R2 上有一堆 SQL CLR 程序集 这些程序集以 Net Framework 3 5 为目标 鉴于 SQL 2008 支持 2 0 NET Framework 版本 我假设 SQL 从系统 GAC 加载安全程序集
  • 比较 mongo find 方法中的 2 个日期

    我有 mongo 文档 其中包含 last active 日期和创建日期 我想搜索所有包含以下内容的文档daylast active 不等于day创建的 但我不知道如何编写查询 在 MySQL 中我会这样写 WHERE DATE FORMA
  • 一键发布时:执行发布异常:已添加具有相同密钥的项目

    我意识到有十亿人询问过这个错误 但我已经查看了所有人 我的好像不一样我没有收到任何类型的源代码错误 没有堆栈跟踪 也没有任何有用的信息 因为在我的 MVC NET 项目上单击 发布 后立即发生错误 它只是一个对话框 仅此而已 没有其他事情发
  • Powershell 可执行文件未输出到 STDOUT

    来自 powershell 脚本 带有nuget安装并在路径上 我正在尝试执行可执行文件 net 如果这很重要 但由于某种原因 我无法在命令窗口中显示 STDOUT nuget install mdoc OutputDirectory pa
  • ES6 需要配置 webpack 吗?

    我有一个 Angular 应用程序 其中包含针对 ES6 的 tsconfig 文件 compileOnSave false compilerOptions allowJs true baseUrl outDir dist out tsc
  • 如何手动设置语料库中的文档ID?

    我正在从数据帧创建 Copus 我将其作为VectorSource因为我只想将一列用作文本源 这可以找到 但是我需要语料库中的文档 ID 来匹配数据帧中的文档 ID 文档 ID 存储在原始数据框中的单独列中 df lt as data fr
  • 增强序列化:前向兼容性因输入流错误而失败

    遵循这个问题 Boost序列化子类我正在尝试支持使用 boost 序列化生成的存档的前向兼容性 但我在使用较旧的代码读取较新的存档时遇到问题 class A public A virtual A default private friend
  • 如何避免 Scala 中类型绑定的重复

    我有一个带有约束类型参数的类 我尝试过identity但返回类型不精确 并且在方法中identityTP 我需要再次指定约束 如何避免使用适用于此类型的方法重复此约束 这是一个例子 sealed trait Location case ob
  • 添加到 window.onload 事件?

    我想知道如何向 window onload 事件添加另一个方法调用 被分配了一个方法调用 假设在脚本的某个地方我有这个作业 window onload function some methods 1 然后稍后在脚本中我有这个作业 windo
  • 在短时间内打开大量连接时的ECONNRESET

    我有这样的情况 我想在猎户座上创建大量实体 我正在将 Orion 和 mongo 的 docker 版本与此 docker compose 一起使用 version 3 services mongo image mongo 3 4 volu
  • 在 XCode 中链接 libuv 库

    有没有人有过在 xcode 中链接 libuv 的经验 我在 git 中创建了一个子模块 以便轻松更新库 但我不太清楚如何正确地将库添加到项目中以允许我包含 uv h 任何帮助我将不胜感激 您可以使用 GYP 为 libuv 生成 xcod
  • 调整 UITableViewCell 框架大小问题

    我正在尝试调整我的大小UITableViewCell s框架通过 cell setFrame CGRectMake cell frame origin x cell frame origin y cell frame size width
  • 为什么unix和Java运行时显示的统计数据存在差异

    我的应用程序遇到一些内存问题 需要帮助理解这些统计数据 Unix top 显示了我的进程的这些统计数据 VSZ 37 4g RSS 20 0g 因此 这意味着 20g 当前已换入进程并正在使用 但是 当我使用运行时类从应用程序中打印统计信息