我可以做些什么来使jar /类变小?

时间:2009-11-24 13:22:30

标签: java jar applet size java-web-start

我正在开发一个Java Applet,减少二进制代码的大小将使applet更快地打开并改善用户体验。

有什么办法可以减少类和/或jar文件的大小吗?我想确定我没有错过明显的技巧。

我知道在C ++世界编译器选项中,例如剥离调试符号可以产生巨大的差异,但我从来没有见过类似Java的东西。

11 个答案:

答案 0 :(得分:11)

您可以使用

javac -g:none

删除调试信息 - 我不知道它可能会有多大差异。

您有多确信下载时间是瓶颈?小程序有多大?除非它是巨大的,否则我怀疑它在下载后会有很大的不同。

答案 1 :(得分:11)

查看此页面,了解有关如何使jar文件变小的一些提示 - http://wiki.java.net/bin/view/Games/4KGamesDesign。即使有些可能不适用,因为您没有尝试绝对最小化,但有一些常规提示可以应用而不会影响代码质量。

但总结如下:

将您的代码保持在一个级别。每个类都会增加JAR文件中条目的开销,以及全新的常量池和类列表。

将您的方法保持在最低限度。每种方法都会增加类文件的开销。您需要的只是一个main()方法,以及实现键盘和/或鼠标例程的方法。

不要使用全局变量。全局变量需要类中的特殊元数据来识别。但是,方法局部变量只是堆栈条目,使用时不需要额外费用。

使用7Zip或KZip这样的好压缩器来创建JAR文件。 JAR实用程序主要是为了正确而非压缩比而设计的。

使用像ProGuard,JoGa或JShrink这样的混淆器来优化班级的大小。

使用单个字符作为类文件名。这会在内部减小其大小,减少Zip程序存储的信息量,并减少清单的大小。

尽可能少引用类。您引用的每个类都会添加完整的包和类名,以及您正在调用的方法签名。

冗余(例如对所有方法,类和字段使用相同的名称)可提高压缩率。

私有和最终的方法可以由类优化器内联。

使用String.valueOf()方法将基元转换为字符串。例如,""+number扩展为:new StringBuffer?().append("").append(number).toString()在新的类和方法引用中浪费了大量空间。

源代码中使用的静态字符串,浮点数和整数存储在常量池中。结果,你可以重用更多的静态值, 你的班级会变小。

您可以自由地使用常量的静态最终变量。这将使您的代码更具可读性,ProGuard将对此进行优化,因此不会产生额外开销。

答案 2 :(得分:6)

  

Proguard是一个免费的Java类文件收缩器,优化器,混淆器和预验证器。它检测并删除未使用的类,字段,方法和属性。它优化字节码并删除未使用的指令。

关于proguard网站的报告显示减少的例子,范围从19%到90%。

答案 3 :(得分:3)

在Jini世界中使用

Classdepandjar来减少jar文件大小(Jini附带了很多远程代码,因此这个要求)。它删除了在同一个jar中没有引用的类。

显然这有例外(按名称等加载的类),因此您可以在配置中容纳这些。您应该最有可能测试“摇晃”的jar,以确定相关的依赖性仍然存在。

答案 4 :(得分:3)

改善小程序大小的一些建议:

  1. 混淆 - Proguard对我来说是整体表现最好的 - 对我来说减少了25%以上。此外,它将在Jar期间提供适当的压缩。

  2. 优化所有资源 - 使用图片优化工具减少附加图片,如果合适,质量会降低。

  3. 代码更改 - 我发现您并不是真的想要这样做,但是值得查看您的Jar文件并检查生成的类数。最琐碎的类将花费大约500字节。如果您有许多匿名内部类,则可能值得重构。

  4. 根据需要加载资源 - 加载初始小程序。启动后异步加载其他资源。

答案 5 :(得分:2)

pack200(和gzip)生成的文件比jars(有效的zip文件)小得多。

答案 6 :(得分:1)

试试这个工具。 http://proguard.sourceforge.net/

答案 7 :(得分:1)

据我所知,你不能从Java类文件中删除符号,但可以缩短标识符。但是,这可能会使堆栈跟踪变得无用,所以我不提倡它。

但是,您可以通过使用AdvanceCOMP project中改进的deflate算法重新压缩您的.jar文件来无损地减小文件大小。(.jar档案只是里面的普通.zip文件)。

答案 8 :(得分:0)

您可以使用工具应用代码混淆。这通常会缩小变量和方法名称,并显着减少类大小。这通常在将代码部署到J2ME平台时完成。

答案 9 :(得分:0)

  1. 打包JAR文件时禁用压缩。
  2. 使用HTTP压缩传输JAR文件。
  3. HTTP压缩通常仅比JAR压缩消耗50%-80%的带宽,尤其是当您创建了许多类时,例如Scala计划。

答案 10 :(得分:-1)

如果使用NetBeans,则可以设置构建脚本以在项目配置中生成压缩的JAR文件(在Build-> Packaging下)。可能没有其他解决方案那么有效,但它只是一个复选框。 : - )

相关问题