似乎an established fact Java程序使用的内存比C ++程序多得多。根据{{3}},这是由于垃圾收集的性质和Java"二进制文件"的字节码性质。但是反思在这种情况下扮演什么角色?
在Java中,可以枚举并调用类的变量和方法作为纯文本,这是在运行时提供的。为此,可以存在某种存储的元数据,这些元数据将这些String键与它们各自的属性相链接。
这个元数据是否存储在堆上,如果存在,是否有办法将其禁用为我不需要反射的类? (普通旧数据)
答案 0 :(得分:2)
java的工作方式是将所有类加载到名为permgen的内存区域中。任何可用的类都会加载到permgen区域,而不管您通过反射使用它的方法。
使用反射
Class.forName("MyClass").newInstance()
没有反思
new MyClass()
以上两个语句都要求在permgen中加载类
这个元数据是否存储在堆上,如果存在,是否可以使用 对于那些我不需要反思的课程禁用它? (普通旧数据)
并且无法禁用它。
但是你能得到的最接近的是实现一个自定义类加载器来加载类。当您完成使用自定义类加载器加载的特定类时,您可以释放对该类的所有引用并将其卸载。我希望它有所帮助。 :)