Al analizar un volcado de almacenamiento dinámico utilizando jhat, he observado muchas instancias de DelegatingClassLoader creadas, aunque no fueron llamadas explícitamente en el código. Espero que sea un mecanismo de optimización de la reflexión. ¿Alguien sabe los detalles?¿Para qué Sun JVM crea instancias de sun.reflect.DelegatingClassLoader en tiempo de ejecución?
Respuesta
Sí, probablemente sea una optimización de reflexión.
En Sun JVM, el acceso reflexivo a propiedades y métodos se realiza inicialmente llamando a través de JNI a la implementación de JVM. Si la JVM nota que un método o campo está siendo accedido por reflexión mucho, generará bytecode para hacer lo mismo, un mecanismo que llama "inflación". Esto tiene un golpe de velocidad inicial, pero después de eso se ejecuta unas 20 veces más rápido. Una gran victoria si reflexionas mucho.
Ese bytecode vive en las clases creadas por las instancias DelegatingClassLoader. Vigílalo: esas clases pueden ejercer presión sobre el espacio permgen y causar los temidos fallos "java.lang.OutOfMemoryError: PermGen space". Si es un problema, puede desactivar la inflación configurando la propiedad del sistema sun.reflect.inflationThreshold en 0 (cero).
no veo (al menos para Hotspot), cuando se mira en el código
http://javasourcecode.org/html/open-source/jdk/jdk-6u23/sun/reflect/ReflectionFactory.java.html
y
que un ajuste de cero desactivar la función. Me parece que solo un gran valor para sun.reflect.inflationThreshold hará el trabajo.
IBM se comporta de manera diferente, lo apagará con 0 o 1. (No estoy seguro si hace algo diferente para 0 o 1, pero con ambos no veo que se cargue un DelegatingClassLoader). – eckes
- 1. Explicación de la memoria Java (SUN JVM)
- 2. Instancias de JVM
- 3. Ejecución de una aplicación JNI en Sun VM bajo Valgrind
- 4. Lenguaje basado en JVM sin tiempo de ejecución de idioma
- 5. ¿Cuál es la diferencia entre JVM Spec, implementación JVM, JVM en tiempo de ejecución
- 6. analizar los registros de GC para Sun Hotspots, JVM 6
- 7. Python: crea dinámicamente la función en el tiempo de ejecución
- 8. getElementById Donde Elemento se crea dinámicamente en tiempo de ejecución
- 9. Tomar una instantánea del tiempo de ejecución optimizado de JVM
- 10. Sun JVM (JRE jre1.6.0_24) segfault NET_Read
- 11. ¿LoadLibrary crea instancias distintas?
- 12. Ejecutando bytecode Java en Android - Sun JVM encima de DalvikVM
- 13. Ejecución de varias JVM
- 14. Enviando señales a una JVM en ejecución
- 15. Gedit en Windows crea varias instancias
- 16. ¿Hay algún plan para que la JVM admita los genéricos en tiempo de ejecución?
- 17. ¿Existen alternativas confiables a la JVM de Sun para el desarrollo de escritorio y empresas?
- 18. La elección de una de instancias de plantilla en tiempo de ejecución, aunque cambiar en C++
- 19. ¿Cómo se crea una nueva instancia de una estructura de su tipo en tiempo de ejecución en Go?
- 20. Advertencias a tener en cuenta en la transición de Sun JVM a JRockit?
- 21. ¿Qué es el tiempo de ejecución moderno?
- 22. ¿Qué compromisos tiene Scala para ejecutarse en JVM?
- 23. Configuración del tamaño del almacenamiento dinámico de JVM en el tiempo de ejecución
- 24. iPhone crea una base de datos SQLite en tiempo de ejecución?
- 25. ¿Por qué es lenta la JVM para comenzar?
- 26. Mismo programa, la misma JVM, pero requisitos de memoria y tiempo de ejecución muy diferentes en diferentes máquinas, ¿por qué?
- 27. ¿Qué impacto, si corresponde, tiene el conmutador -d64 en el uso de la memoria residente de Sun JVM?
- 28. ¿Cómo cambiar dinámicamente la clase base de instancias en tiempo de ejecución?
- 29. ¿Qué razones existen para las diferencias entre los tipos de tiempo de compilación y los tipos de tiempo de ejecución?
- 30. Java: Extendiendo clase en tiempo de ejecución
Advertencia, la propiedad funciona en Oracle/OpenJDK e IBM JDK; sin embargo, en IBM activa la inflación, en Sun se infla instantáneamente (se intentó usar -verbose: clase que devuelve en DelegatedClassLoaders instanciada, como el código de IBM no está disponible). En ambos, el valor predeterminado es 15, pensaría en configurarlo en 1000 o en algo para reducir las inflaciones, pero aún así beneficiarme de la aceleración. – eckes