Java JVM执行应用程序时是否多次读取jar文件?
对于一个长时间运行的程序,JVM是否多次从磁盘读取Java JVM执行应用程序时是否多次读取jar文件?,java,jvm,Java,Jvm,对于一个长时间运行的程序,JVM是否多次从磁盘读取.jar文件,还是只读取一次,整个映像都在内存中,直到JVM终止 我正在运行一个耗时约26小时的作业,快结束时出现了一个未定义的对象异常(NoClassDefFoundError),我认为这可能是因为我正在更改代码,并从开发环境中重新导出了.jar)(也就是说,我在磁盘上与旧磁盘相同的位置创建了一个新磁盘)而应用程序正在运行。如果使用导入和正常使用类,则每个类只创建一次 如果你玩类加载器,你可以进行额外的阅读和“非计划行为”-这意味着每个类有很多
.jar
文件,还是只读取一次,整个映像都在内存中,直到JVM终止
我正在运行一个耗时约26小时的作业,快结束时出现了一个未定义的对象异常(
NoClassDefFoundError
),我认为这可能是因为我正在更改代码,并从开发环境中重新导出了.jar
)(也就是说,我在磁盘上与旧磁盘相同的位置创建了一个新磁盘)而应用程序正在运行。如果使用导入和正常使用类,则每个类只创建一次
如果你玩类加载器,你可以进行额外的阅读和“非计划行为”-这意味着每个类有很多次。不,JVM每次需要加载一个新类时都会从jar读取。您可能希望使用标记
-verbose:class
运行代码,您会发现类加载非常缓慢。JVM只加载它必须继续加载的类。如果在程序结束时,您正在执行如果需要一个以前不完全需要的类,那么它将在那时被加载
这很好地解释了您得到的错误,并且您应该注意到您不应该替换jar(或类)正在运行的文件,正是出于这个原因。对于通常的导入情况,是每次类导入读取一次,还是总共读取一次?程序会进行一些反射,但不会涉及因丢失而引发异常的对象。正如Evgeniy Dorofev所说,每次加载(新)时都会读取类。一旦读取该类,它将不会再次读取该类,除非您卸载、更改引用并使用JNI对其进行破解。请注意,这与导入语句无关。您可能有1000条未使用的导入语句,并且它不会在运行时加载单个类,除非出于不同的原因需要。