2010-11-07 27 views
6

¿Cuál es el subconjunto más pequeño de clases con el que una máquina virtual Java puede iniciarse?¿Qué clases son absolutamente necesarias para ejecutar una VM Java?

Supongo que cosas como Object, String y primitves son absolutamente necesarios porque están cableados en muchas partes de la máquina virtual.

Me interesan las dimensiones de las dependencias entre JVM y JDK.

La pregunta básica que me pregunto acerca es:

Si me decidir el reparto de una JVM con un lenguaje de programación diferente y diferentes librerías estándar, cómo gran parte de las clases "Java" hacer Tengo para llevar a cabo para hacer feliz a la JVM?

+1

Probablemente dependa de lo que quiere decir con "iniciar" la máquina virtual. ¿Tiene que incluir un cargador de clases más dependencias para cargar un programa? –

+1

¿Por qué está etiquetado 'language-agnostic'? – casablanca

+0

Porque la JVM solo ejecuta bytecode. Hay múltiples lenguajes y compiladores que pueden generar ese bytecode. – soc

Respuesta

3

La mejor manera de averiguarlo es probarlo y ver; p.ej. use java -verbose. para ejecutar el programa mínimo en una variedad de lenguajes alojados en JVM.

Pero la respuesta es probable que sea:

  • versión de la JVM específica, y
  • lenguaje de programación específico.

Debo señalar también que la (s) respuesta (s) que obtenga no serán de ninguna utilidad práctica (... a menos que planee crear un JRE reducido, y si ese es el caso, lea el seguimiento a continuación.)

¿Sabe si todas las clases son estrictamente necesarias o la VM también precarga las clases que espera que sean utilizadas en todos los casos por las aplicaciones?

La JVM no precarga cosas sobre esa base. Más bien, carga el cierre de dependencia del que su código depende estáticamente. Dependiendo de las clases que use su aplicación, esto puede dar como resultado la carga de clases que realmente no se utilizan. Los ingenieros de Sun han trabajado arduamente para tratar de reducir este efecto a lo largo de los años, pero, sin duda, aún sucede en cierta medida.

SEGUIMIENTO

Leyendo entre líneas, parece que la intención es crear un paquete JVM corte hacia abajo para soportar los requisitos de tiempo de ejecución de algún otro idioma.Si es así, tenga en cuenta estos puntos:

  • Hay requisitos de licencia sobre lo que puede hacer con Java vis-a-vis la creación de versiones de corte hacia abajo. Específicamente, Java, JVM y JRE son términos de marca registrada, y Oracle podría ser que venga después de usted si los usa en el contexto de un JRE reducido. (No estoy diciendo que no pueda hacerlo, pero haga necesita verificar los aspectos legales para usted).

  • Definitivamente hay problemas de soporte. Por ejemplo, necesita rastrear los parches y problemas de seguridad relevantes de Java/JVM y crear nuevas versiones de su plataforma base como necesarias.

  • Si tiene la intención de proporcionar alguna forma de que los programas de aplicación en su nuevo idioma llamen a las bibliotecas Java, entonces usar un JRE reducido podría ser un serio inconveniente para algunos usuarios. Especialmente si empacas tus cosas de una manera que signifique que tienen que usar tu JRE reducido.

  • Hay herramientas en un JRE/JDK que pueden ser útiles para usted/sus usuarios. Herramientas como perfiladores, depuradores, el comando JAR, etc. Su JRE debería incluir todas las clases necesarias para ejecutarlos.

Finalmente, una descarga de 100Mb no es un problema significativo para la MAYORÍA DE VARONES de los usuarios. Y si lo es, podría ganar un poco de dinero para respaldar su proyecto vendiendo DVD instaladores.

Enfóquese en lo que sea que realmente esté tratando de hacer aquí ... y deje la optimización del instalador cuando tenga algo de calidad de producción para optimizar.

1

Si ejecuta el comando:

java -verbose 

le mostrará todas las clases que se carga con el fin de iniciar la máquina virtual. Si agrega -verbose cuando inicia un programa java, obtendrá una lista completa de lo que ese programa necesita para comenzar. Pero esto no incluye otras clases que pueda necesitar ya que es su trabajo.

¿Por qué necesita saber qué clases se necesitan?

+0

¿Sabe si todas las clases son estrictamente necesarias o la VM también precarga las clases que espera que sean utilizadas en todos los casos por las aplicaciones? Me pregunto cuán grandes son las dependencias entre la JVM y el JDK. La pregunta básica que me pregunto es: "Si decidiera distribuir una JVM con un lenguaje de programación diferente y diferentes bibliotecas estándar, ¿cuántas de las clases de" Java "tengo que llevar para hacer feliz a la JVM? – soc

+0

Realmente no va a ser una pregunta acerca de cómo iniciar la máquina virtual. Va a ser una pregunta sobre qué necesita tu otro lenguaje de programación. La última respuesta, creo, es que lo que se necesita depende totalmente del programa para el que se está iniciando la VM. Si está implementando algún tipo de lenguaje, entonces no puede predecir qué será necesario, por lo que deberá suministrar todo. ¿Por qué querrías recortarlo? ¿O es solo un ejercicio técnico? :-) – drekka

+0

Si ejecuta este experimento y envía solo aquellas clases que terminan en esta lista, sin duda encontrará que hay clases en la lista que tienen métodos (que no se llamaron en el momento del inicio) que construyen objetos de tipos que no están en la lista. En otras palabras, incluso si su VM se inicia, las clases que envió no serán un conjunto independiente, y es probable que se rompan por otras clases que faltan. –

0

Está intentando separar una aplicación de clase 7000 para ver cuáles son esenciales. Si lo hizo, no hay forma de que pueda garantizar que la JVM no fallaría en algún punto aleatorio en el futuro. Peor aún si explotara por alguna razón, es probable que el dedo le apunte primero hasta que pueda probar que no tuvo nada que ver con la eliminación de las clases.

Si está utilizando un dispositivo móvil y necesita ahorrar capacidad, le sugiero que utilice el JME. Sin embargo, si está usando una computadora de escritorio donde 200 MB cuestan menos de un centavo, ¿realmente vale la pena el riesgo? Si explota te costará más de un centavo, sospecho que lo hará.

Una analogía, estás caminando por una carretera principal y ves lo que podría ser un centavo en el otro lado. ¿Cruzas el camino a través del tráfico pesado para conseguirlo? Te sugiero que sigas caminando.

EDITAR: Si desea una versión reducida de Java, puede probar la versión incrustada. http://www.oracle.com/technetwork/java/embedded/downloads/index.html

Tiene una variedad de 32 MB y 70 MB.

+0

La descarga de 200MB puede costar fácilmente más de un centavo * por descarga *, si eres el pobre imbécil ejecutando el servidor, esto está en marcha. –

+0

@Steve, debe hacer suposiciones sobre qué software debe instalarse primero, p. el sistema operativo debe estar instalado y, en este caso, Java debe estar instalado. –

+0

@Steve, me duele cualquiera que instale esta versión especial de Java y luego intente ejecutar un programa o applet de Java normal. No sabrán por dónde empezar a arreglarlo. –

0

IANAL, pero se corre el riesgo de ser demandado por Oracle si se tira hacia abajo los java.* clases, porque la concesión de patentes pública Sun/Oracle para las patentes de JDK requiere que implemente las java.* las interfaces completas, y que lo haga de forma compatible con la norma . (Creo que esto es parte de lo que depende de la demanda de Google).

Aparte de eso, creo que Project Jigsaw developers están teniendo un tiempo no trivial para decidir qué pertenece a la base de instalación de JDK, y qué pertenece a un módulo.Recuerdo leer una publicación de blog (no puedo encontrarla ahora) sobre algunos problemas que rompen las dependencias circulares entre cosas que deberían estar en módulos (XML, IIRC) y la instalación base.

Cuestiones relacionadas