我理解perm size用于存储元数据,包括字节码、静态内容等。
我的问题是:反射的使用会如何影响perm size?如果有影响的话。我的意思是,如果程序A使用正常的对象运行方式,而程序B则大量使用反射,那么这两个程序的perm size会有什么区别?
我理解perm size用于存储元数据,包括字节码、静态内容等。
我的问题是:反射的使用会如何影响perm size?如果有影响的话。我的意思是,如果程序A使用正常的对象运行方式,而程序B则大量使用反射,那么这两个程序的perm size会有什么区别?
在执行加载新类或内部化字符串的代码时,perm空间将增长。反射类必须被加载,这是确定的。我不确定反射API是否会大量使用内部化字符串,但应该很容易找出。
例如,对于方法getDeclaredMethod(String name, Class<?>... parameterTypes)
,名称参数将被内部化。
以下代码片段将填充perm空间:
Random random = new Random();
while(true){
try {
X.class.getDeclaredMethod(toBinaryString(random.nextLong()));
} catch (Exception e) {
}
}
alt text http://img4.imageshack.us/img4/9725/permgen.jpg
在实际应用中,这不会有任何区别。
我不完全确定我理解了这个问题,但Java类已经包含了执行反射所需的一切。一个.class文件不会根据它的使用方式而改变。
编辑1:提供一些更具体的示例,以更好地区分我们所讨论的“反射”类型。
示例:
class Foo {
public void bar() {
System.out.println( "Hello, world." );
}
}
// Conventional calling
Foo f = new Foo();
foo.bar();
// Reflection based callling
Class fooClass = Class.forName( "Foo" );
Method m = fooClass.getMethod( "bar", null );
Object f = fooClass.newInstance();
m.invoke( m, null );
反射可以生成类,具体取决于实现方式。例如,在编译为字节码之前,您可能需要使用反射工件数千次。
一如既往的建议是:在实际情况下对您的代码进行分析。
==
。 (并不确定这是一个好主意。)实际上,反射可以创建类(有时)。 - Tom Hawtin - tackline