多个(可能甚至未使用的)jar文件的大类路径效率低下

Bry*_*eld 17 java memory performance jar

我看到它的方式,(纠正我,如果我错了)一个类被缓存,因此只有在第一次引用类时才需要搜索类路径.它只会在调用静态初始化程序时发生,这在程序的生命周期中只有一次.(或更具体地说,类装载机)

但是对于包含许多可能使用或不使用的库的大型长寿程序.

Jar文件是否被加载到内存中,导致不必要的使用,因为大多数类从未使用过?它会留在记忆中吗?

引用目录是更好的选择吗?或者Jar文件是否已经解压缩到一个临时位置开始?

使用目录方法比使用Jar文件方法更快吗?

将所有Jar文件解压缩到一个目录中是否合理,以减少类路径中的位置数量?什么时候这是个好主意?

jef*_*unt 11

这不是问题,你不应该担心.类加载器足够智能,可以加载所需的类,并且通常按需加载类(即通常不会加载一堆不会被使用的代码).这与您的应用程序的运行时间长或无关.

在大量JAR的情况下,我会更关注JAR地狱.

至于更快的问题,我想各种方法之间可能存在一些差异,但如果存在,您可以通过实验尝试轻松地自己测试.由于每个应用程序加载的代码不同,因此情况可能是特定于应用程序的.

我认为平滑雷鬼的答案对于类加载主题的一些额外细节是有益的.

  • @GeorgeBailey同样从我的理解中,某些JVM实现了-client和-server JVM parms.-client parm告诉JVM只根据需要加载类(甚至是一段时间没用过的垃圾收集类)来加速应用程序的初始启动.-server选项会导致JVM在分析加载的类时加载速度变慢,并根据使用情况查看它应该在内存中保留哪些更长的内容.如果您有一个长时间运行的应用程序,-server选项通常是值得的.再次,检查您的JVM以查看是否有这些参数. (2认同)

Tom*_*ine 7

jar文件中心目录(放置在zip的末尾)将被解析并加载到内存中.该目录是平的,因此需要加载所有目录.启动简单Java进程时,延迟的一个重要部分是rt.jar的开放,这是巨大的.所以,是的,这就是启动时间和内存开销.

查找每个班级应该是恒定的时间.但是,那里有一些O(n)算法.因此对于整个应用程序来说,O(n ^ 2)用于类加载(尽管常量非常小并且很可能由线性时间操作支配).

对文件加载进行文件访问将是低效的.JDK在jars之前使用zip作为系统类.

(如果存在静态初始化器,静态初始化之前可能会发生类加载 - 请参阅三参数Class.forName.)