2012-04-10 16 views
12

Hace poco encontré este término interesante y busqué en Net para saber más sobre él. Sin embargo, la información que encontré es incompleta. Podría alguien pl. dame una explicación algo detallada de qué es esto y por qué es útil esto?Java: ¿cuál es la inflación por reflexión de JITC?

Según la información que encontré, parece que este mecanismo hace que la ejecución de métodos reflejantes sea más rápida, a expensas de crear muchas clases dinámicas y acaparar el área de memoria perm gen, pero no estoy seguro.

Respuesta

13

Hice un código fuente para cavar y codificar yo mismo para resolver esto, y esto es lo que descubrí:

La clase 'Método' de Java tiene una variable miembro 'methodAccessor' de tipo 'MethodAccessor' que es una interfaz con un método 'invoke', similar a la invocación de Method. Métodos invocan delegados a la invocación de methodAccessor.

Si la inflación está habilitada (noInflación es falsa) este acceso apunta a una implementación que usa JNI para ejecutar este método Java (creo que usando api como GetObjectClass, GetMethodID y Call * Method). Esto es como el envío en duelo, y la ejecución con JNI es lenta debido a esta y otras razones. (What makes JNI calls slow?)

Después de 15 ejecuciones de un método a través de la reflexión ('15' es de forma predeterminada y se puede cambiar) y con noInflation falso, el descriptor de acceso basado JNI crea una clase sobre la marcha (el nombre es generado dinámicamente, por ejemplo, diga 'GeneratedMethodAccessor1') que también tiene el método de invocación. Ahora, dentro de este método 'invocar', lanza el primer argumento 'obj' a su clase correspondiente, y luego llama al método objetivo sobre él. A continuación, crea una instancia de esta clase y cambia las configuraciones de methodAccessor de modo que cada ejecución del método en adelante se delegue a esta instancia en lugar de acceso JNI. Esto se llama inflación.

Como esta instancia corresponde a una clase Java que delega en un objeto Java, la delegación en adelante es una delegación Java normal. Nunca va a JNI y, por lo tanto, ahorra esa sobrecarga, además de que JITC puede realizar otras optimizaciones debido a lo cual se vuelve eficiente.

El inconveniente es que si se inflan muchos métodos de esta manera, sus clases ocupan espacio permgen y posiblemente causen un error de memoria insuficiente.

Para más detalles, ver:

http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/tip/src/share/classes/sun/reflect/ReflectionFactory.java

http://java.sun.com/docs/books/jni/html/fldmeth.html

http://anshuiitk.blogspot.com/2010/11/excessive-full-garbage-collection.html

+0

Muy buena explicación, gracias – ozhan

+0

@Ozhan Duz contento de que le haya gustado. Gracias. – shrini1000

1

No estoy seguro, pero léelo en algún lugar La inflación significa que para las primeras ejecuciones (por defecto 15) de un método/constructor reflejado (a partir de ahora, cualquier referencia a métodos también se aplica a los constructores), lo hace a través de JNI ; la próxima vez después de eso, ensambla un archivo de clase sobre la marcha y lo carga. En ese momento, se aplica JIT completo, y las llamadas posteriores a ese método reflejado tienen el mismo rendimiento que llamar directamente a ese método

+0

Sí, he leído eso también, pero quiero más detalles.Hay algo llamado acceso de reflexión que se utiliza para hacer eso, pero de nuevo, no estoy seguro exactamente cómo. – shrini1000

+0

Encontré una entrada de blog aquí: http://buzdin.blogspot.com/2011/01/is-java-reflection-really-slow.html Básicamente, en la máquina virtual del servidor, si se invoca un sitio de llamada más de 15 veces a través de reflexión, punto de acceso lo optimizará para usar una llamada a método directo. Por cierto, Akash, no hay JNI involucrado, es solo una optimización de punto de acceso regular. – Bill

2

Java Inflation es la optimización de las llamadas realizadas a través de métodos Java Reflection API. Delega llamadas de método infrequent a llamadas de método económicas, inmediatamente disponibles pero lentas Java Native Interface y frequent a tiempo de ejecución rápido pero costoso, generated method accessor.

+0

Mi opinión sobre la definición [clara y concisa] (http://sites.ieee.org/pcs/communication-resources-for-engineers/style/write-clearly-and-concisely/). –

Cuestiones relacionadas