当我将未使用的 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 文件。
我有一个使用 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 文件。