start run chrome java jar applet size java-web-start

java - chrome - run jnlp



¿Qué puedo hacer para reducir el tamaño de las jar/classes? (11)

Proguard es un reductor , optimizador, ofuscador y preverificador gratuito de archivos de la clase Java. Detecta y elimina clases, campos, métodos y atributos no utilizados. Optimiza bytecode y elimina las instrucciones no utilizadas.

Los informes en el sitio de proguard muestran ejemplos de la reducción, que van del 19 al 90%.

Estoy desarrollando un Applet de Java, y la reducción del tamaño del código binario hará que el applet se abra más rápido y mejorará la experiencia del usuario.

¿Hay algo que pueda hacer para reducir el tamaño de las clases y / o archivos jar? Quiero asegurarme de no perderme trucos obvios.

Sé que en C ++ las opciones del compilador mundial para, por ejemplo, quitar los símbolos de depuración pueden marcar una gran diferencia, pero nunca he visto algo así para Java.


  1. Deshabilite la compresión al empaquetar un archivo JAR.
  2. Use compresión HTTP para transmitir el archivo JAR.

La compresión HTTP generalmente solo consume un 50% -80% de ancho de banda que la compresión JAR, especialmente cuando se crean muchas clases, por ejemplo, un programa Scala.


Algunas sugerencias para mejorar el tamaño del applet:

  1. Ofuscación : Proguard fue lo mejor para el rendimiento general para mí: más del 25% de reducción para mí. Además, proporcionará una compresión decente durante el Jar.

  2. Optimice cualquier recurso : reduzca las imágenes adjuntas utilizando optimizadores de imagen, de menor calidad, si corresponde.

  3. Cambios de código : veo que realmente no desea hacer esto, pero vale la pena echarle un vistazo a sus archivos Jar y comprobar cuántas clases se producen. La clase más trivial costará alrededor de 500 bytes. Si tiene muchas clases internas anónimas, puede valer la pena refactorizar.

  4. Cargue recursos según sea necesario : cargue el applet inicial. Cargue recursos adicionales de forma asíncrona después de comenzar.


Por lo que puedo decir, no puedes quitar símbolos de los archivos de la clase Java, pero puedes acortar los identificadores. Sin embargo, esto probablemente hará que los rastros de pila sean inútiles, así que no lo defiendo.

Sin embargo, puede reducir el tamaño de archivo sin pérdidas al volver a comprimir sus archivos .jar utilizando algoritmos de desinflado mejorados del proyecto AdvanceCOMP (los archivos .jar son simplemente archivos .zip dentro).


Puede usar una herramienta para aplicar la ofuscación del código. Esto a menudo reducirá los nombres de variables y métodos y reducirá significativamente el tamaño de las clases. Esto a menudo se hace cuando se implementa código en la plataforma J2ME.


Puedes usar

javac -g:none

para eliminar la información de depuración, no sé cuánta diferencia es probable que haga.

¿Cuán convencido está de que el tiempo de descarga es el cuello de botella? ¿Qué tan grande es el applet? A menos que sea enorme, dudo que el tamaño haga mucha diferencia después de que se haya descargado.


Si usa NetBeans, puede configurar el script de compilación para generar un archivo JAR comprimido en la configuración del proyecto (en Build-> Packaging). Quizás no sea tan efectivo como otras soluciones, pero solo está a una casilla de verificación. :-)


consulte esta página para obtener algunos consejos sobre cómo puede hacer que sus archivos jar sean más pequeños: http://wiki.java.net/bin/view/Games/4KGamesDesign . Aunque es posible que algunos no se apliquen, ya que no está intentando la minimalización absoluta, existen algunos consejos generales que puede aplicar sin comprometer la calidad del código.

pero un resumen aquí:

Mantenga su código en una clase. Cada clase agrega la sobrecarga de una entrada en el archivo JAR, así como una nueva lista constante de grupos y clases.

Mantenga sus métodos al mínimo. Cada método agrega sobrecarga en el archivo de clase. Todo lo que debe necesitar es un método main() y métodos para implementar las rutinas del teclado y / o el mouse.

No use variables globales. Las variables globales requieren metadatos especiales en la clase para identificar. Las variables locales del método, sin embargo, son solo entradas de la pila y no cuestan nada adicional.

Use un buen compresor como 7Zip o KZip para crear sus archivos JAR. La utilidad JAR está diseñada principalmente para corrección, no para relaciones de compresión.

Use un ofuscador como ProGuard, JoGa o JShrink para optimizar el tamaño de su clase.

Use un solo caracter para el nombre de archivo de la clase. Esto reduce su tamaño internamente, reduce la cantidad de información que almacena el programa Zip y reduce el tamaño del manifiesto.

Haga referencia a la menor cantidad de clases posible. Cada clase de referencia agrega el paquete completo y el nombre de clase, más la firma de método a la que llama.

La redundancia (como usar el mismo nombre para todos sus métodos y clases y campos) mejora las relaciones de compresión.

Los métodos hechos privados y finales pueden ser subrayados por un optimizador de clase.

Utilice el método String.valueOf() para convertir primitivas en cadenas. Por ejemplo, ""+number expande a: new StringBuffer?().append("").append(number).toString() perdiendo una gran cantidad de espacio en las nuevas referencias de clases y métodos.

Las cadenas estáticas, flotantes y enteros utilizados en el código fuente se almacenan en el conjunto constante. Como resultado, cuanto más pueda reutilizar un valor estático, menor será su clase.

Puede hacer un uso liberal de variables finales estáticas para constantes. Esto hará que su código sea más legible y ProGuard optimizará esto para que no haya gastos adicionales.



pack200 (y gzip) produce archivos mucho más pequeños que jar (efectivamente archivos zip).


Classdepandjar se usa en el mundo de Jini para reducir el tamaño de los archivos jar (Jini envía una gran cantidad de código remoto, de ahí este requisito). Elimina las clases que no están referenciadas desde ese mismo contenedor.

Obviamente, hay excepciones a esto (clases cargadas por nombre, etc.) y entonces puede acomodarlas en la configuración. Lo más probable es que pruebe contra su jar ''agitado'' para determinar que las dependencias relevantes permanecen.