最近我将我的大型Java应用程序改为以JAR文件形式发布,而不是单独的类文件。我有405个JAR包,其中包含5000个类文件。我的问题是,当我以JAR文件方式运行程序(classpath是通配符,以获取所有JAR包),Java会不断地使用更多的内存。我曾经看到内存超过2GB,并且似乎Java没有进行全局垃圾回收来保持内存较低。如果我使用解压后的JAR文件(只有类文件)运行完全相同的程序,则Java的内存使用率要低得多(<256MB),并保持不变。这发生在Windows 7(x64)和Windows Server(x64)上的Oracle Java 8中。为什么将应用程序打包成JAR文件会改变内存使用情况?此外,我已经以JAR文件的形式运行了很长时间,并将内存最大限制设置为128MB,没有出现任何问题,因此我没有内存泄漏。
使用Classpath中的JAR文件:
使用Classpath中的类文件:
编辑:我接受了@K Erlandsson提供的答案,因为我认为这是最好的解释,这只是Java的一个丑陋的怪癖。谢谢大家(特别是@K Erlandsson)的帮助。
使用Classpath中的JAR文件:
![With JAR files in classpath](https://istack.dev59.com/pAqKV.webp)
![With class files in classpath](https://istack.dev59.com/TECGR.webp)