4

对于长时间运行的程序,JVM 是否.jar多次从磁盘读取文件,还是只读取一次并且整个图像都在内存中,直到 JVM 终止?

我正在运行一项大约需要 26 小时的工作,并且在接近尾声时出现了一个未定义的对象异常 ( NoClassDefFoundError),我认为这可能是由于我正在更改代码并.jar从开发环境重新导出 (当应用程序运行时,我在磁盘上与旧磁盘相同的位置创建了一个新磁盘。

4

3 回答 3

2

不,JVM 每次需要加载新类时都会从 jar 中读取。

于 2013-03-05T13:08:46.627 回答
2

你可能想用标志运行你的代码,-verbose:class你会发现类加载非常懒惰。JVM 只加载它绝对必须继续运行的类。如果在你的程序结束时,你正在做的事情需要一个以前绝对不需要的类,它就会在那时被加载。

这很好地解释了您遇到的错误,您应该注意到您不应该替换正在运行的 jar(或类)文件,正是出于这个原因。

于 2013-03-05T14:19:23.570 回答
1

如果您正在使用导入并正常使用类,则每个类只使用一次。

如果您使用类加载器,反射比您可以进行额外的读取和“非计划行为” - 这意味着每个类很多次。

于 2013-03-05T12:32:38.680 回答