2010-05-28 11 views
26

tenemos una aplicación web PHP que llama a un binario java para producir un informe en PDF (con jasperreport), el pdf de salida java binario para la salida y salida estándar, el php luego envía el pdf al navegador. Este comando java dura de 3 a 6 segundos, creo que cuando dura 6 segundos es porque el GC entra en acción, por lo que me gustaría deshabilitarlo porque de todos modos cuando el comando sale se devuelve toda la memoria ...¿Cómo puedo desactivar Java basurero?

Me gustaría saber cómo deshabilitarlo para Java 1.4.2 y 1.6.0 para Java, porque actualmente estamos probando tanto JVM para ver que realiza más rápido ..

Gracias

+7

Solo una sugerencia para otro enfoque (ya que el inicio del proceso también lleva tiempo): http: // github.com/hudora/pyJasper contiene un servidor (java) que ejecuta jasper reports en las solicitudes, sin la sobrecarga de inicio/apagado del proceso. – ZeissS

+0

Relacionado para objetos específicos: http://stackoverflow.com/questions/1329926/how-to-prevent-an-object-from-getting-garbage-collected –

Respuesta

25

No hay forma de deshabilitar completamente la recolección de elementos no utilizados. La recolección de basura solo se ejecuta cuando la JVM se queda sin espacio, por lo que podría darle más memoria al programa. Añadir estas opciones de línea de comandos para el comando de Java

-Xmx256M -Xms256M 

Esto le da al programa 256 MB de RAM (el valor predeterminado es de 64 Mb). Sin embargo, la recolección de basura no tomará 3 segundos para una JVM de tamaño predeterminado, por lo que es posible que desee investigar más de cerca lo que está haciendo el programa. Yourkit profiler es muy útil para descubrir lo que está tardando mucho tiempo.

24

GC sólo se activa cuando la JVM es corto en la memoria , por lo que o GC o morir. Intente encender el GC detallado y vea si en realidad lleva mucho tiempo.

java -verbose:gc 
+1

Umm, entonces tal vez podría usar un modificador de línea de comandos para darle más memoria y así aumenta la posibilidad de que el GC no entre. – Nelson

+1

Sí, sabrá si necesita hacer eso después de analizar la salida de verbose: gc. Ese es el primer paso. – unbeli

+6

+1 para "probar, no adivinar". La diferencia de tiempo podría ser algo completamente ajeno, como la contención de E/S o algún proceso pesado de la CPU. – gustafc

1

¿Está seguro de que es la recolección de basura que causa la desaceleración? ¿Has ejecutado Java con -verbose: gc para ver qué está pasando?

No puede deshabilitar la recolección de elementos no utilizados en la JVM. Sin embargo, puede mirar tuning el recolector de basura para un mejor rendimiento.

2

Puede usar la opción -Xmx para establecer el tamaño de almacenamiento dinámico máximo; el uso de un montón más grande debería evitar que la VM se quede sin memoria y, por lo tanto, requiera la recolección de basura tan pronto.

+2

Solo configurar -Xmx no hará ninguna diferencia. En realidad, necesita establecer -Xms también, ya que desea controlar el tamaño de almacenamiento dinámico inicial. –

33

Parece que está tratando de ahorrar tiempo, pero lo está haciendo mal. El tiempo ahorrado al deshabilitar la recolección de basura sería trivial (para una sola tarea) en comparación con el tiempo necesario para iniciar y cerrar el proceso de java. Es posible que desee considerar tener un lanzamiento de proceso de Java que puede solicitar varias veces para hacer el trabajo que necesita si su objetivo es el rendimiento en tiempo de ejecución.

+1

Bueno, creo que también salvaría la inicialización de jaspe. – helios

+0

Sí, este es un buen enfoque, aunque hay más trabajo por hacer, tendría que codificar un tipo de daemon que escucharía en los sockets y demás ... además de este "daemon" tendría que reiniciarse una vez en X días .. cause java Fugas de memoria a largo plazo (según mi experiencia). – Nelson

+0

@Nelson. Considere ver si puede usar algo como Mule para alojar sus procesos Java y deje que eso maneje todas las comunicaciones por usted. La idea es que solo necesites incrustar tus JasperReports como un servicio que el ESB puede alojar y enrutar las solicitudes según sea necesario. Mule: http://www.mulesoft.com/mule-esb-open-source-esb –

0

Como todos han dicho, no se puede deshabilitar GC en la JVM, lo que tiene sentido, porque si hubiera podría haber pérdidas de memoria debido a que java no tiene una forma explícita para que el desarrollador elimine los datos del montón.

¿Tiene acceso a la fuente de este binario de Java? De ser así, podría valer la pena analizarlo y ver si hay cuellos de botella que podrían escribirse mejor para reducir la actividad de GC. Esto podría hacerse con la mayoría de los perfiladores de java, como JProbe, por ejemplo.

+0

el binario de java es muy simple, solo recupera los parámetros de la línea de comandos y realiza llamadas a las funciones de jasperreport para crear el informe, que se pasa a System.out outputstream donde el PHP lo lee a través de la función 'passthrough'. Así que el tiempo se pasa en Jasperreport procesando el informe, así es como quería una aceleración general de java. – Nelson

+0

Parece que controlar la configuración del JVM GC es su única oportunidad aquí. – display101

0

Para evitar que el recolector de basura libere una variable o propiedad desde cualquier objeto, debe establecer esta propiedad (liberada por gc) como estática en su clase fue mi solución.

Ejemplo:

privado myProperty Cadena estática;

Cuestiones relacionadas