java jvm

java - ¿Instalación o escenario asesino que haría que otra JVM sea una mejor opción que Sun JVM?



swing windows java (10)

Para Java SE, hay varias JVM disponibles para ejecutar en producción en x86:

además de algunas ofertas personalizadas para ejecutar en un servidor:

Otras plataformas:

  • Sun Solaris JVM: ¿mejor escalabilidad que x86?
  • (edit) El compilador de GNU para Java - http://gcc.gnu.org/java/ - puede compilar a código nativo en múltiples plataformas.

Sun JVM tiene una clara ventaja con el programa jvisualvm, que permite la inspección en tiempo de ejecución del código en ejecución. ¿Hay alguna ventaja técnica de cualquier otra JVM que pueda hacer que sea una mejor opción para el desarrollo y / o la producción?

En otras palabras, ¿existe una instalación o escenario asesino que haría que cualquier inversión de tiempo / esfuerzo / dinero valga la pena en otra JVM?

(También sugiera JVM adicionales si serían una buena opción).


De vuelta en los 1.4 días de Java, mi equipo utilizó IBM JVM para un sistema de alto volumen basado en mensajes que se ejecuta en Linux. ¿Por qué hicimos esto? ¡Porque evaluamos las diferentes JVM! JRockit era en realidad el más rápido, pero ocasionalmente se bloqueaba, por lo que no era tan bueno para la producción.

Como siempre con estas cosas, mídelo!


No es estrictamente una JVM, pero sigue siendo una implementación de Java: gcj . Tiene la ventaja de admitir muchos procesadores, por lo que si se dirige a uno de los procesadores integrados, gcj puede ser su única opción. Además, dado que es un compilador verdadero (no solo un JIT), usted guarda la sobrecarga de la compilación JIT (tanto en la memoria como en los ciclos) en el objetivo incrustado.


Según lo que me han contado, la principal diferencia con la JVM de Sun y la JVM de IBM está en los recolectores de basura reales, los recolectores de basura de IBM son mucho más configurables que los de Sun y solo se tienen en cuenta en el mundo de los negocios. Además, la JVM de IBM puede decir mucho más que "acabo de colapsar, aquí está mi volcado de información" en situaciones de error que obviamente es importante en el mundo de los negocios, que es el principal espacio vital de la JVM de IBM.

Asumiendo que no me han mentido, diría que la JVM de IBM debe usarse cuando se hacen cosas que requieren mucha memoria en el software de negocios que depende de la recolección de basura agresiva o de otro modo altamente ajustable.


En mi propia experiencia y al pie de la letra, veo simplicidad en el diseño de IBM GC. Los diversos y nuevos GC de Sun son excelentes sin dudas y ofrecen una variedad de opciones de ajuste en niveles mínimos, pero incluso en algunas de las aplicaciones web más activas que conozco manejan objetos nuevos pesados ​​/ agresivos y guardan mucho en el montón de caché. Raramente ver que GC excede el 1%, incluso tratando de mantener la huella baja. Claro que probablemente podríamos sintonizarlo mejor, pero hay un retorno decreciente.

He tenido un desafío mucho mayor en las mismas aplicaciones que ejecutan el JDK de IBM. En particular, tiene problemas con clústeres anclados y tiene que sintonizar -Xk.

Ahora podría mencionar una docena de elementos que IBM y Sun deberían implementar para la JVM asesina, pero no el alcance de su pregunta, supongo :)


JRockit viene con JRockit Mission Control, que es un paquete de herramientas que puede usar para monitorear la JVM y su aplicación. Puede descargarlo aquí , es gratis para el desarrollo.

Mission Control tiene muchas características que faltan en VisualVM, por ejemplo, un detector de fuga de memoria en línea, un analizador de latencia, integración de Eclipse, JMX.logging to file. etc. Si desea comparar VisualVM con Mission Control, aquí están las notas de la versión y la documentación de la última versión.


La recolección de basura incremental y el tamaño de tiempo de ejecución muy pequeño para los sistemas embebidos en tiempo real es lo único que realmente importa lo suficiente como para garantizar una menor estabilidad o soporte de la plataforma. Había algunos jvm con esto en mente, pero olvidé su nombre ahora.


Hace unos años (JDK1.4), diferentes JVM tenían diferentes ventajas:

  • IBM JVM fue capaz de hacer volcados de pila (de forma programática, en señales u OOM), y la utilidad heaproot fue muy útil para rastrear fugas de memoria (menos intrusivas que los perfiladores). Ninguna otra JVM tenía esto.

  • JRockit tenía muchas opciones útiles que Sun JVM no tenía, colección paralela. También fue (mucho) más rápido (y más estable que el Sun VM).

Hoy, Sun tiene estas características, pero estoy seguro de que hay otras. La velocidad podría ser una. Las estrategias de recolección de basura otra.

Si está utilizando WebLogic, algunos errores en Sun JVM pueden provocar errores en WebLogic. Es más probable que estos errores se resuelvan más rápido en JRockit.


Algunas aplicaciones, como la ciencia financiera y computacional, se beneficiarían enormemente de las implementaciones de hardware de coma flotante decimal. IBM ha lanzado una serie de procesadores ( POWER6 , los mainframes z9 y z10) que implementan el estándar decimal flotante IEEE 754-2008. El último IBM JDK puede usar aceleración de hardware para BigDecimal s.

To allow developers to easily take advantage of the dedicated DFP hardware, IBM Developer Kit for Java 6 has built-in support for 64-bit DFP through the BigDecimal class library. The JVM seamlessly uses the DFP hardware when available to remove the need for computationally expensive software-based decimal arithmetic, thus improving application performance.

Es un caso muy marginal, pero si tiene un mainframe z10 a mano y desea usar su unidad de coma flotante decimal en Java, entonces IBM JVM sería una mejor opción que Sun JVM.

- Flaviu Cipcigan


IBM J9

Este es el tipo de discurso de ventas que puede leer o escuchar sobre J9:

IBM ha lanzado un SDK para Java 6. Los binarios de productos están disponibles para Linux en AMD x86 y 64 bits, y AIX para PPC para 32 y 64 bits. Además de soportar la especificación de plataforma Java SE 6, el nuevo SDK también se enfoca en compartir datos entre máquinas virtuales Java, información de diagnóstico mejorada, backtraces de pila del sistema operativo, herramienta jdmpview actualizada, estabilidad de la plataforma y rendimiento.

Algunos dirían que IBM SDK tiene algunas ventajas más allá de la velocidad, que el uso y la expansión de PermGenSpace es mucho mejor que en Sun SDK o GCJ (no es un gran problema para aplicaciones cliente, pero los servidores J2EE de carga pesada, especialmente los servidores de portal, pueden realmente causa la acidez del sol JDK). Pero, según este documento que compara Sun vs IBM JVM GC, resulta que el rendimiento de la memoria depende principalmente de la aplicación y no tanto de la VM.

Entonces, si bien es cierto que IBM JVM es bien conocida por sus funciones de solución de problemas (más avanzada que la JVM de Sun), no me convencen las diferencias en el nivel de GC.

Y la JVM de Sun tiene una gran ventaja sobre IBM, al menos en Solaris: proveedores de DTrace. En realidad, he estado trabajando principalmente con Weblogic en Solaris, así que Sun ''JVM siempre ha sido la elección natural.

Oracle JRockit

Hice algunos puntos de referencia de BEA / Oracle JRockit hace algunos años y, de hecho, era una máquina virtual rápida y, en ese momento, era compatible con montones más grandes que la VM de Sun. Pero tiene algunos problemas de estabilidad que no son realmente buenos para la producción. Sin embargo, las cosas podrían haber cambiado desde entonces.

Armonía Apache

Podría estar equivocado pero, para mí, Harmony está hecho de donaciones de código de IBM (beneficios: la comunidad está haciendo mantenimiento) y realmente no veo por qué debería considerar Harmony en lugar de IBM J9.

JDK de Apple

Nunca tuve que usar Mac para la producción, así que no puedo responder. Solo recuerdo que Apple necesitó algo de tiempo para agrupar Java 6, y no sé por qué. Esto tal vez no es racional, pero esto me hace sospechar.

OpenJDK

Sé que algún proveedor ofrece soporte de producción (por ejemplo, RedHat con RHEL 5.3+, vea esta entrada de blog ) para OpenJDK, por lo que podría ser una opción para plataformas que no son compatibles con Sun. Sin embargo, a menos que alguien pueda decirme qué hace que OpenJDK funcione mejor que Sun, creo que instalaré Sun JVM en plataformas compatibles.

Así que, para mí, las opciones son en realidad: la JVM de Sun a menos que tenga que ejecutar algunas cosas de Websphere, en cuyo caso elegiría IBM J9. Pero para ser sincero, nunca me he enfrentado a una situación que no pude resolver en una JVM de Sun y eso podría haber justificado (temporalmente) el intercambio con IBM, por lo que no puedo decir si las características de solución de problemas son tan agradables. Pero admito que puedo sufrir por la falta de conocimiento de la JVM de IBM.


La característica / escenario típico que debe observar es el rendimiento y la velocidad.

Independientemente de lo que digan los libros blancos, en última instancia, debe comparar y decidir por usted mismo.

Estoy predispuesto hacia IBM , porque trabajé allí hace unos años. Personalmente no me ocupé del desarrollo de jvm, pero recuerdo que el énfasis del grupo de desarrollo de jvm estaba en los siguientes puntos:

  • Exclusiones de recolección de basura propietaria. Esto incluye no solo GC más rápido, sino también más opciones de configuración, como GC para servidor y cliente. Esto fue antes de que Sun ofreciera opciones similares.
  • Rendimiento nativo mucho más rápido (x10) con la interfaz JNI. Esto fue particularmente importante en el momento en que Eclipse / WSAD comenzó a ganar tracción y swt fue muy utilizado. Si su aplicación usa mucho JNI, entonces creo que vale la pena comparar el jdk de IBM con el jdk de Sun.
  • Estabilidad y confiabilidad Creo que esto solo es relevante si compra soporte comercial de IBM, como SLA para un nivel de servicio (WebSphere y db2, entorno agrupado, etc.). En este caso, IBM garantizará la estabilidad de su oferta solo si usa su jvm.

En cuanto a OpenJDK , recomiendo que mires esta historia de OpenJDK. Tengo entendido que OpenJDK 7 será casi idéntico al jdk 7 de Sun, por lo que es muy probable que el rendimiento sea idéntico. Las principales diferencias serán las licencias y los componentes pequeños como webstart.

La JVM de Oracle es útil si desea ejecutar código Java desde su base de datos (a través de stored-procedure). Incluye algunas optimizaciones que ayudan a que la base de datos funcione más rápido en este escenario.

Como han dicho otros, Sun ha estado alcanzando a sus competidores. Creo que en los 1.4 días las diferencias fueron mucho más notorias, pero no tanto hoy. En cuanto a jvisualvm, otros proveedores también ofrecen herramientas similares, por lo que no creo que sea un problema.

Finalmente, hay otra métrica (aunque un poco controvertida) para indicar qué tan serios son esos vendedores sobre sus máquinas virtuales. Ese es el número de patentes relacionadas que emiten. Puede ser útil si necesita convencer a su jefe, o si le gusta leer patentes :)

Búsqueda de patentes: ibm y java - 4559 patentes.

Búsqueda de patentes: oráculo y java - 323.