我需要帮助来获取正在运行的 Java 应用程序中特定加载库的大小。
详细来说,我在 Linux 上通过 JVM 运行 Java 应用程序。当我试图获取在应用程序初始化期间加载的特定库的内存消耗时。
所以我正在使用如下内容:
public class Test
{
static
{
System.loadLibrary("Tested_Lib");
}
public int register () { ......}
public int unregister () { ......}
}
所以我要的是:
我试过以下方法:
System.gc();
usedMemoryBefore = runtime.totalMemory() - runtime.freeMemory();
System.loadLibrary("Tested_Lib");
usedMemoryAfter = runtime.totalMemory() - runtime.freeMemory();
libSizeInRam = (usedMemoryAfter - usedMemoryBefore)/KILOBYTE;
虽然关于库的预期大小,输出根本不合理。
使用 Runtime.totalMemory() 和 freeMemory() 不是很精确。它不考虑 Java 进程的其他线程或您的库可能在做什么。调用 System.gc() 只是建议 JVM 进行垃圾收集。不能保证它会执行,当它执行时它只清理堆内存池,这只是 JVM 用于对象实例的内存池。无论你的库在做什么,都不会在堆中,除非它使用 JNI 来操作 Java 对象。
如果您只想知道共享库文件在 Linux 中的内存中使用的内存,您应该参考特定于 Linux 的答案,例如 https://unix.stackexchange.com/questions/116327/loading-of-shared-libraries-和 ram 用法。这不是 Java 问题。