当我将未使用的 jar 添加到类路径时,为什么 JVM 会设置更大的堆大小

Why does the JVM sets a larger heap size when I add unused jars to the classpath

我有一个使用 JNI 在 cpp 程序中运行并接收 CLASSPATH 参数的 jvm。 我看到,当我将 jar 添加到 CLASSPATH 时,即使未以任何方式加载或调用这些 jar 中的 类,堆大小和使用量也更大。

有人可以解释为什么会这样吗?这是 JVM 试图做的一些内存优化吗?

我可以改变这种行为吗?

Can someone explain why this happens?

当 classloader 初始化时,它将读取每个 JAR 文件1 的索引并将其缓存在其 class 路径上。我不确定这是急切地还是懒惰地完成的,但在任何一种情况下,即使没有从给定的 JAR 加载 classes ,你最终也可能会缓存索引。 (class加载程序通常必须检查多个 JAR 文件才能找到它要查找的内容。)

(想想看,JVM 可能 整个文件 映射到内存中。我还没有检查 JVM源代码以查看它的实际作用。)

Is it some memory optimization the JVM trying to do?

正在优化 class 和资源加载时间。缓存索引可以避免每次 classloader 加载 class 或其他资源时 classloader 不得不 re-read 它们。

Can I change this behavior?

可能不会。

但事情是这样的。这样做节省的内存量相对较小。这可能不值得担心。

如果您真的担心由此“浪费”的内存量,请考虑重新组织应用程序 class 路径中的 JAR 文件,以便它们仅包含 classes 和其他资源该应用程序实际上将要使用。 (有工具可以帮你做这种事...)


1 - ... 或 ZIP 文件。