Java的反射如何影响其内存占用?

时间:2014-05-02 20:41:18

标签: java reflection metadata metaprogramming memory-footprint

似乎an established fact Java程序使用的内存比C ++程序多得多。根据{{​​3}},这是由于垃圾收集的性质和Java"二进制文件"的字节码性质。但是反思在这种情况下扮演什么角色?

在Java中,可以枚举并调用类的变量和方法作为纯文本,这是在运行时提供的。为此,可以存在某种存储的元数据,这些元数据将这些String键与它们各自的属性相链接。

这个元数据是否存储在堆上,如果存在,是否有办法将其禁用为我不需要反射的类? (普通旧数据)

1 个答案:

答案 0 :(得分:2)

java的工作方式是将所有类加载到名为permgen的内存区域中。任何可用的类都会加载到permgen区域,而不管您通过反射使用它的方法。

使用反射

Class.forName("MyClass").newInstance() 

没有反思

new MyClass()

以上两个语句都要求在permgen中加载类

  

这个元数据是否存储在堆上,如果存在,是否可以使用   对于那些我不需要反思的课程禁用它?   (普通旧数据)

并且无法禁用它。

但是你能得到的最接近的是实现一个自定义类加载器来加载类。当您完成使用自定义类加载器加载的特定类时,您可以释放对该类的所有引用并将其卸载。我希望它有所帮助。 :)