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

标签 java reflection metadata metaprogramming memory-footprint

好像是an established fact Java 程序比 C++ 程序使用更多的内存。根据an answer on StackExchange ,这是由于垃圾收集的性质和 Java“二进制文件”的字节码性质造成的。但反射在这种情况下扮演什么角色呢?

在 Java 中,可以以纯文本形式枚举和调用类的变量和方法,这些变量和方法是在运行时提供的。为此,需要某种存储的元数据将这些字符串键与其各自的属性链接起来。

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

最佳答案

java 的工作方式是将所有类加载到称为 permgen 的内存区域中。任何可用的类都会加载到永久生成区域中,无论您是否通过反射使用它。

使用反射

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

没有反射

new MyClass()

以上语句都要求类加载到permgen

Is this metadata stored on the heap, and if so, is there a way to disabled it for classes for which I don't need reflection anyway? (Plain old data)

而且没有办法禁用它。

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

关于java - Java 的反射如何影响其内存占用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23436596/

相关文章:

java - 在Java方法引用中是反射API的一部分

java - 是否有任何 MQ 服务器可以嵌入在 Java 进程中运行?

Java 运行时 .exec() 不会打开可执行文件

java - 将正文请求 POST 中的多个文件上传到 Spring Restful API

zend-framework - 如何使用标签清除 zend 元数据缓存

java - 使用 Java 从单个文件读取图像元数据

iphone - 如何在 iPhone 图片库中获取图像的嵌入式 GPS 和地理定位数据

java - GEF 中的 SVG 图像

c++ - 是否可以对使用 Boost Hana 的方法进行内省(introspection)?

java - 使用反射在运行时创建类