加速Java

时间:2008-10-07 18:28:03

标签: java optimization performance

这实际上是两个问题,但它们非常相似,为了保持简单,我想我只是把它们放在一起:

  • 首先:鉴于已建立的Java项目,除了简单的代码内优化之外,有什么方法可以加快速度?

  • 其次:在Java中从头开始编写程序时,有哪些好方法可以大大提高性能?

请远离常规优化技术,除非它们是 Java特定的

我之前提到了PythonPerl这个问题。对于Java,我想知道有哪些好的提示/技巧可以提高性能,以及是否有任何特别好的Java分析器。

15 个答案:

答案 0 :(得分:19)

首先:通过代码优化,我会假设您已经完成了正确的算法和正确的算法实现。在这种情况下,您将使用分析器并查看您的垃圾收集器(GC)收集垃圾的频率以及它用于执行此操作的时间。然后你开始研究GC选项 - 但要注意,如果你不知道你在做什么,你可能会遇到麻烦 我假设您使用的是java 5/6。在这种情况下,我将在http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html处阅读java 5调优指南。还有一个非常好的关于Java性能的新信息,称为http://www.javaperformancetuning.com/,你可以订阅它。

除此之外,看看你可以消除多少个try / catch块。看看你是否可以消除不必要的异常抛出。

使用Caches,但不要过度使用。

阅读有效的Java,第1版和/或第2版

Profilers:我使用你的套件。这对于java 1.5及以上版本来说非常好。您可以获得个人许可。其他的分析师也很好。

就像你有单元和集成测试一样,在你的连续集成(CI)构建中运行一些性能测试也没什么坏处。通过这种方式,您可以了解何时退化,尤其是在使用良好的CI构建服务器时。

答案 1 :(得分:12)

确保您的日志级别不会意外地留在DEBUG:)

答案 2 :(得分:11)

“测量,不要猜。”
使用article来加速iText PDF库是一个很好的NetBeans Profiler。我自己使用过NetBeans Profiler,我发现它在跟踪我遇到的一些性能问题时非常容易和有用。

对于较旧的应用程序,只需迁移到Java 6可能会提升性能。有关Java 6中性能改进的信息,请参阅this whitepaper

答案 3 :(得分:8)

使用最新的VM - 它们一直在变得越来越好。

简介和测试。除非您完全确定需要,否则永远不要优化您的代码。

如果它是一个GUI应用程序,从Swing切换到AWT或者Eclipse的工具包,它应该很快。这在较旧的VM上更为重要(我已经嵌入了一段时间,我们实际上是1.0.x vm,甚至没有摆动)

我知道这并不是特定于Java,而是分配对象 - 这包括循环中的字符串连接(在循环之外它是非常可接受的。这是你可能做的最重要的事情。

您还可以保留对象,而不是释放/重新分配它们。有一些“引用”类可用于保存您不需要但可能需要重用的对象 - 除非需要空间,否则GC不会删除它们。

如果需要,使用-MX参数分配更多空间。

很难加速Java - HotSpot已经为你做了很多事情,你所做的任何事情你认为可能会加速你的代码往往会减慢它。

答案 4 :(得分:5)

使用StringBuilder代替大量的字符串连接可以提高相对性能。

然而,我无法避免说一般的练习表现获益,分析。我不知道Java分析(仅在学术上使用该语言),但分析可以帮助您识别代码的问题部分,并且由于您需要查找某些部分,因此修复特定部分要容易得多。

答案 5 :(得分:5)

不要盲目优化。 使用Yourkit或任何其他优秀的分析器查找应用程序中的“热点”。

您不仅需要查看CPU时间,还需要查看分配的内存量  释放了一定的步骤。 您还希望确保没有内存泄漏或高内存消耗。 我所知道的分析内存消耗的最佳工具是Eclipse Memory Analyzer(http://www.eclipse.org/mat)。

其他维度是线程争用和IO问题。 有关分析争用问题的简单方法,请查看https://www.sdn.sap.com/irj/sdn/weblogs?blog=/pub/wlg/4737

上的旧博客

答案 6 :(得分:3)

通过切换到更快的VM可以实现另一个潜在的性能提升。它们并非都是平等的,有些更适合不同类型的应用程序。它们也可能都具有它们支持的特定类型的自定义,以及标准类型。

Some comparisons

另外,要谨慎使用微基准测试来测试性能,因为由于大多数VM的工作方式,它们没有意义。因此,一些非常简单的性能测试可能由于不明显的原因而表现不同。

只需运行测试,然后更改一小段代码或VM选项并再次运行,可能会产生不同的结果,但与您所做的更改无关。

答案 7 :(得分:2)

对于分析,请尝试JAMON进行时间监视,使用NetBeans分析器进行一般性能和内存监控。

答案 8 :(得分:2)

与任何语言相同,使用适当的算法和数据结构。

OOP的一个好处是,您可以在不更改界面的情况下更改对象的实现。这使您可以开始使用天真的实现进行编码,并在需要时替换它们。

答案 9 :(得分:2)

你也问过这个关于C#的问题,我会给出相同的答案,并且开始是特定语言是错误的。一旦你用一般的技巧和方法挤压了你可以获得的每个周期,那么语言特定的东西可能会有所不同。

答案 10 :(得分:1)

我已经看到,有时只给JVM更多堆内存将有助于缓慢的应用程序。这在启动时使用-xmx-xms JVM选项进行控制。

答案 11 :(得分:1)

从项目一开始就应该做一件事,这将是一个巨大的帮助:编写可读代码。

不要尝试编写长方法来避免方法调用。如有必要,编译器将内联,但可能会为长方法生成较差的代码。如果代码难以阅读,那么通常会出现性能问题,因为它会做一些你无法看到的精神错乱。

答案 12 :(得分:1)

Java 1.6_07 +附带自己的探查器。它被称为Java VisualVM。如果您的PATH上有%JAVA_HOME%/ bin,只需在命令提示符下键入jvisualvm。

答案 13 :(得分:0)

这是Peter Sestoft的一篇(较旧的)文件,值得一读:Performance in java。有些建议可能不再适用,因为Java在优化的后期版本中得到了更好的效果。但是,当探查器发现了一些你不能做任何其他方式的事情(即,通过算法改变)时,仍然有一组很好的宝石可供使用和尝试。

答案 14 :(得分:0)

这似乎无关紧要,但Android开发者网站上有list of speed tips。它在非标准dalvik字节码的手机上运行,​​但其中列出的许多技巧通常适用于Java。