如何在运行时获取 java 应用程序加载库的大小

问题描述 投票:0回答:1

我需要帮助来获取正在运行的 Java 应用程序中特定加载库的大小。

详细来说,我在 Linux 上通过 JVM 运行 Java 应用程序。当我试图获取在应用程序初始化期间加载的特定库的内存消耗时。

所以我正在使用如下内容:

public class Test 
{
     static
     { 
        System.loadLibrary("Tested_Lib");
     }

     public int register () { ......}
     public int unregister () { ......}
}

所以我要的是:

  1. 以这种方式加载库是否意味着库的总大小将加载到 JVM 地址空间?
  2. 如何衡量“Tested_Lib”在运行时的内存消耗?

我试过以下方法:

        System.gc();
        usedMemoryBefore = runtime.totalMemory() - runtime.freeMemory();
 
        System.loadLibrary("Tested_Lib");

        usedMemoryAfter = runtime.totalMemory() - runtime.freeMemory();
        libSizeInRam = (usedMemoryAfter - usedMemoryBefore)/KILOBYTE;  

虽然关于库的预期大小,输出根本不合理。

java linux jvm
1个回答
0
投票

使用 Runtime.totalMemory() 和 freeMemory() 不是很精确。它不考虑 Java 进程的其他线程或您的库可能在做什么。调用 System.gc() 只是建议 JVM 进行垃圾收集。不能保证它会执行,当它执行时它只清理堆内存池,这只是 JVM 用于对象实例的内存池。无论你的库在做什么,都不会在堆中,除非它使用 JNI 来操作 Java 对象。

如果您只想知道共享库文件在 Linux 中的内存中使用的内存,您应该参考特定于 Linux 的答案,例如 https://unix.stackexchange.com/questions/116327/loading-of-shared-libraries-和 ram 用法。这不是 Java 问题。

© www.soinside.com 2019 - 2024. All rights reserved.