2009-07-19 10 views
5

¿Es posible implementar un cargador de clases multihilo en Java? En un marco meta-driven, necesito cargar varios cientos de clases por adelantado, es decir, no tan perezosamente como el cargador de clases del sistema. Para acelerar esto, me gustaría utilizar mejor las CPU actuales multi-core. Antes de sumergirme en eso, me interesaría si alguien ya tiene alguna experiencia sobre este tema o si es posible que esté totalmente claro que tal vez defineClass() es el cuello de botella en este caso.¿Es posible la carga de clases con varios subprocesos?

Gracias Andre

Respuesta

6

Creo que actualmente tocará un candado exclusivo. En JDK7, los cargadores de clase podrán marcarse a sí mismos como aptos para paralelos.

Como siempre, sugiero que posiblemente se realicen algunos cálculos de respaldo de la envolvente y luego "chupar y ver".

+0

OK, voy a verificar el JDK 7.0 classloader API primero. Si está en lo correcto con el bloqueo en cualquier JDK <7.0, entonces podría haber al menos el beneficio de cargar en paralelo el código de bytes del sistema de archivos y preprocesarlo. Haré algunas pruebas para ver si esto es lo suficientemente bueno para mis propósitos. –

+1

Aquí hay un enlace: http://openjdk.java.net/groups/core-libs/ClassLoaderProposal.html. No sé de nada más actualizado que eso. –

+0

Gracias Tom, un enlace muy completo que muestra la dirección y la situación actual. –

0

No hay nada malo en tener uno o más hilo cargando la clase de fondo que requiere que todas las clases que necesita para cargar previamente. Haz un prototipo con un Ejecutor y Callables para que puedas obtener cierta información de perfil con jvisualvm.

+1

Sí, técnicamente debería ser posible tener varias clases de carga de subprocesos, eso es bastante claro. El método defineClass() no está sincronizado, lo cual es una especie de prerrequisito. Pero me pregunto si hay un punto de sincronización en algún lugar más profundo en el código JVM que impide la verdadera carga de clase de MT sin ser obvio. –

+1

defineClass no está sincronizado ya que la carga de clase se define como un único subproceso por la JVM. (En Java 5 y 6 al menos) Cientos de clases no tardan tanto en cargar ¿cuál es el marco de tiempo que necesita para cargar? –

+0

Básicamente, solo temo que base mi framework en una arquitectura que no se escala muy bien. 100s de clases es solo el comienzo, pero a medida que el framework obtiene más y más características, la cantidad de clases puede aumentar hasta los miles, lo que puede conducir a una latencia seria al inicio. –

Cuestiones relacionadas