Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/352.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JVM执行应用程序时是否多次读取jar文件?_Java_Jvm - Fatal编程技术网

Java JVM执行应用程序时是否多次读取jar文件?

Java JVM执行应用程序时是否多次读取jar文件?,java,jvm,Java,Jvm,对于一个长时间运行的程序,JVM是否多次从磁盘读取.jar文件,还是只读取一次,整个映像都在内存中,直到JVM终止 我正在运行一个耗时约26小时的作业,快结束时出现了一个未定义的对象异常(NoClassDefFoundError),我认为这可能是因为我正在更改代码,并从开发环境中重新导出了.jar)(也就是说,我在磁盘上与旧磁盘相同的位置创建了一个新磁盘)而应用程序正在运行。如果使用导入和正常使用类,则每个类只创建一次 如果你玩类加载器,你可以进行额外的阅读和“非计划行为”-这意味着每个类有很多

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


我正在运行一个耗时约26小时的作业,快结束时出现了一个未定义的对象异常(
NoClassDefFoundError
),我认为这可能是因为我正在更改代码,并从开发环境中重新导出了
.jar
)(也就是说,我在磁盘上与旧磁盘相同的位置创建了一个新磁盘)而应用程序正在运行。

如果使用导入和正常使用类,则每个类只创建一次


如果你玩类加载器,你可以进行额外的阅读和“非计划行为”-这意味着每个类有很多次。

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

您可能希望使用标记
-verbose:class
运行代码,您会发现类加载非常缓慢。JVM只加载它必须继续加载的类。如果在程序结束时,您正在执行如果需要一个以前不完全需要的类,那么它将在那时被加载


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

对于通常的导入情况,是每次类导入读取一次,还是总共读取一次?程序会进行一些反射,但不会涉及因丢失而引发异常的对象。正如Evgeniy Dorofev所说,每次加载(新)时都会读取类。一旦读取该类,它将不会再次读取该类,除非您卸载、更改引用并使用JNI对其进行破解。请注意,这与导入语句无关。您可能有1000条未使用的导入语句,并且它不会在运行时加载单个类,除非出于不同的原因需要。