代码之家  ›  专栏  ›  技术社区  ›  amarillion

我该怎么做才能使jar/classes更小?

  •  13
  • amarillion  · 技术社区  · 15 年前

    我正在开发一个Java小程序,减少二进制代码的大小会使applet开放得更快,并且会提高用户体验。

    我能做些什么来减小类和/或JAR文件的大小吗?我想确定我没有遗漏明显的技巧。

    我知道,在C++世界中,编译器选项,例如剥去调试符号可能会产生巨大的差异,但我从来没有见过这样的Java。

    11 回复  |  直到 8 年前
        1
  •  11
  •   Jon Skeet    15 年前

    你可以使用

    javac -g:none
    

    删除调试信息-我不知道它有多大的区别。

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

        2
  •  11
  •   slim    8 年前

    查看此页面,了解如何缩小JAR文件的一些技巧。- http://wiki.java.net/bin/view/Games/4KGamesDesign .尽管有些可能不适用,因为您不是在尝试绝对最小化,但有一些一般的提示,您可以应用而不影响代码质量。

    但这里有一个总结:

    把你的代码控制在一个类中。每个类都添加了JAR文件中一个条目的开销,以及一个全新的常量池和类列表。

    尽量减少你的方法。每个方法都会在类文件中增加开销。你只需要一个 main() 方法和实现键盘和/或鼠标例程的方法。

    不要使用全局变量。全局变量需要类中的特殊元数据来标识。然而,方法局部变量只是堆栈项,使用起来不需要额外的费用。

    使用一个好的压缩程序,如7zip或kzip来创建JAR文件。jar实用程序主要是为正确性而设计的,而不是为压缩比而设计的。

    使用诸如proguard、joga或jshrink之类的模糊器来优化类的大小。

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

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

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

    私有方法和final方法可以由类优化器内联。

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

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

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

        3
  •  6
  •   miku    15 年前

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

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

        4
  •  3
  •   Brian Agnew    15 年前

    Classdepandjar 在Jini世界中用于减小JAR文件的大小(Jini提供了许多远程代码,因此这一要求)。它删除了同一个jar中没有引用的类。

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

        5
  •  3
  •   Pool    15 年前

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

    1. 混淆 - Proguard 对我来说是最好的整体表现-对我来说减少了25%以上。此外,它还可以在震击过程中提供适当的压缩。

    2. 优化任何资源 -使用图像优化器减少附加图像,适当时降低质量。

    3. 代码更改 -我看到您并不真的想这样做,但是值得一看您的JAR文件并检查生成了多少类。最普通的类将花费大约500字节。如果您有许多匿名的内部类,那么重构可能是值得的。

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

        6
  •  2
  •   Thomas Jung    15 年前

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

        7
  •  1
  •   Tommaso Taruffi    15 年前
        8
  •  1
  •   intgr    15 年前

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

    但是,您可以无损地将文件大小减少 再压缩 您的.jar文件使用改进的deflate算法 AdvanceCOMP project (.jar存档文件只是普通的.zip文件)。

        9
  •  0
  •   teabot    15 年前

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

        10
  •  0
  •   Bartek    10 年前
    1. 打包JAR文件时禁用压缩。
    2. 使用HTTP压缩来传输JAR文件。

    HTTP压缩通常只比JAR压缩消耗50%-80%的带宽,特别是当您创建了许多类(例如scala程序)时。

        11
  •  -1
  •   perp    15 年前

    如果使用NetBeans,可以将构建脚本设置为在项目配置中生成压缩的JAR文件(在build->packaging下)。也许不如其他解决方案有效,但只剩下一个复选框了。:-)