加速Java

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

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

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

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

我之前曾问过Python和Perl 。 对于Java,我想知道有哪些好的提示/技巧可以提高性能,以及是否有任何特别好的Java分析器。

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

除此之外,看看你可以消除多少尝试/捕获块。 看看你是否可以消除不必要的exception抛出。

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

阅读Effective Java,1st和/或2nd Edition

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

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

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

“措施,不要猜。”
这是一篇关于使用NetBeans Profiler加速iText PDF库的好文章 。 我自己使用过NetBeans Profiler,我发现它在跟踪我遇到的一些性能问题时非常容易和有用。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

一些比较

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

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

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

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

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

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

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

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

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

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

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

这似乎无关紧要,但Android开发者网站上有一系列速度提示 。 它在非标准dalvik字节码的手机上运行,​​但其中列出的许多技巧通常普遍适用于Java。