13

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

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

我知道在 C++ 世界中,例如剥离调试符号的编译器选项会产生巨大的影响,但我从未见过类似 Java 的情况。

4

11 回答 11

12

查看此页面以获取有关如何使 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 将优化它,因此没有额外的开销。

于 2009-11-24T13:26:15.010 回答
11

您可以使用

javac -g:none

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

您对下载时间是瓶颈的确信程度如何?小程序有多大?除非它很大,否则我怀疑下载后大小会产生很大差异。

于 2009-11-24T13:24:15.013 回答
6

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

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

于 2009-11-24T13:26:01.063 回答
3

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

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

于 2009-11-24T13:41:59.923 回答
3

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

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

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

  3. 代码更改- 我看到您并不想这样做,但值得查看您的 Jar 文件并检查生成了多少类。最简单的类将花费大约 500 字节。如果您有很多匿名内部类,则可能值得重构。

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

于 2010-01-08T00:11:41.453 回答
2

pack200(和 gzip)生成的文件比 jars(实际上是 zip 文件)小得多。

于 2009-11-24T13:49:48.690 回答
1

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

于 2009-11-24T13:24:46.947 回答
1

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

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

于 2009-11-24T13:26:30.830 回答
0

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

于 2009-11-24T13:25:13.593 回答
0
  1. 打包 JAR 文件时禁用压缩。
  2. 使用 HTTP 压缩来传输 JAR 文件。

HTTP 压缩通常只消耗比 JAR 压缩 50%-80% 的带宽,尤其是当您创建大量类时,例如 Scala 程序。

于 2014-07-24T02:03:33.373 回答
-1

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

于 2009-11-24T13:56:08.850 回答