我目前想知道在JVM中加载从未使用过的额外类所需的实际开销是多少。
我们的代码迭代了类路径中的所有类,找到实现某个接口的类,然后将它们加载。
这使得自定义类可以简单地放入一个目录中,它们就会被加载和注册。
副作用是我们遍历了类路径中的每个类,导致这些类被加载。这对JVM的内存有什么影响吗?
仅仅加载类会对内存产生多大的影响吗?
我目前想知道在JVM中加载从未使用过的额外类所需的实际开销是多少。
我们的代码迭代了类路径中的所有类,找到实现某个接口的类,然后将它们加载。
这使得自定义类可以简单地放入一个目录中,它们就会被加载和注册。
副作用是我们遍历了类路径中的每个类,导致这些类被加载。这对JVM的内存有什么影响吗?
仅仅加载类会对内存产生多大的影响吗?
以这种方式使用类加载器会产生意想不到的副作用吗?比如运行静态初始化程序等。
你可以使用ServiceLoader机制,但如果那不适合你,你可以在不使用类加载器的情况下检查类 - 字节操作库,如BCEL和ASM可以用来仅仅检查类。
是的,这会强制虚拟机加载类文件并检查它(可能会影响性能)。此外,如果您使用的是Sun VM,则这些类将永久保存在内存中。Sun VM将类放置在所谓的“PermGen”空间中,除非指定特殊选项,否则永远不会进行垃圾回收。
因此,这通常是一个不好的主意,但有两个简单的解决方法:
检查类的名称(文件名)。在名称中重复接口的名称,这样您就可以轻松地注意到需要加载和不需要加载的内容。
使用两个目录。一个包含普通类,另一个包含所有您想要始终加载的内容。