问题描述
我有一个jvm,它使用JNI在cpp程序中运行并接收CLAsspATH参数。 我看到,当我将罐子添加到CLAsspATH中时,即使未以任何方式加载或调用这些罐子中的类,堆大小和使用量也更大。
有人可以解释为什么会这样吗? JVM试图做一些内存优化吗?
我可以更改此行为吗?
解决方法
有人可以解释为什么会这样吗?
当类加载器初始化时,它将在其类路径上读取并缓存每个JAR文件 1 的索引。我不确定这是急于还是懒惰地完成了,但是在任何一种情况下,即使没有从给定的JAR加载任何类,您都可能会缓存索引。 (类加载器通常必须检查多个JAR才能找到所需的内容。)
(想一想,JVM 可以将整个文件映射到内存中。我没有检查JVM源代码来查看它的实际作用)
JVM想要做一些内存优化吗?
它正在优化类和资源的加载时间。缓存索引可避免类加载器每次加载类或其他资源时都必须重新读取它们。
我可以更改此行为吗?
可能不是。
这就是问题。通过执行此操作可以节省的内存量相对较小。可能不值得担心。
如果您真的对此感到“浪费”的内存量感到担心,请考虑在应用程序的类路径上重新组织JAR文件,以便它们仅包含应用程序实际要使用的类和其他资源。 (有一些工具可以帮助您做这种事情……)
1-...或ZIP文件。