有人可以推荐一个包含Java最新性能提示的网站吗?我发现的大多数网站看起来都很旧,我想新版本(1.5 - 1.7)可能已经淘汰了一些建议。
修改
我最关心的是减少内存使用/垃圾收集,并确保在必要时可以内联简单的方法。
代码涉及使用大量小对象在线程中处理大量数据。为每个数据项创建了一些对象,而其他对象的寿命更长。这些对象通常实现接口或扩展抽象类。
答案 0 :(得分:3)
更新:对我来说,调整Sun虚拟机的参考文档是Java SE 6 HotSpotTM Virtual Machine Garbage Collection Tuning(这也会为您提供方法)。
正如评论中所提到的, ergonomics 功能在调优现代JVM方面做得非常出色,应该先测试一下,然后再测试更详细的控件。
如果您没有获得满意的结果,请设置最大堆大小并开始使用生成大小,更准确地说是Young Generation。来自FAQ about Garbage Collection in the HotspotTM JavaTM Virtual Machine:
年轻一代的体型应足够大,以便在下一代年轻一代之前,短命物体有机会死亡。这是一个权衡,因为较大的年轻一代将有更多的时间让物体死亡,但也可能需要更长的时间来收集。尝试年轻一代的规模,以优化年轻一代的收集时间或应用程序吞吐量。
我会遵循建议的方法:
服务器的经验法则 应用程序是:
- 首先确定您可以承担的最大堆大小 机。然后绘制你的表现 针对年轻一代规模的指标 找到最好的设置。
- 注 最大堆大小应该 总是小于金额 内存安装在机器上,到 避免过多的页面错误和 抖动。
- 如果总堆大小是固定的,则增加年轻代的大小 要求减少终身职位 世代大小。保持终身 一代人足以容纳所有人 应用程序使用的实时数据 在任何给定的时间,加上一些 松弛空间(10-20%或更多)。
- 受限于终身代的上述限制:
- 格兰特 给年轻人留下了充足的记忆 代。
- 增加年轻人 生成大小随着你增加 自分配以来的处理器数量 可以并行化。
然后,如果应用程序仍未达到所需的性能,请从另一个收集器开始(参见Selecting a Collector)。
除非您的应用程序具有相当严格的暂停时间要求,否则首先运行您的应用程序并允许VM选择收集器。如有必要,请调整堆大小以提高性能。如果性能仍然无法达到您的目标,请使用以下指南作为选择收集器的起点。
- 如果应用程序的数据集很小(最多约100MB),那么
- 使用
-XX:+UseSerialGC
选择序列收集器。- 如果应用程序将在单个处理器上运行,并且没有暂停时间要求,那么
- 让VM选择收集器,或
- 使用
-XX:+UseSerialGC
选择序列收集器。- 如果(a)峰值应用性能是第一优先级,(b)没有暂停时间要求或暂停一秒或更长时间是可以接受的,那么
- 让VM选择收集器,或
- 选择带有
-XX:+UseParallelGC
的并行收集器,并(可选)启用与-XX:+UseParallelOldGC
的并行压缩。- 如果响应时间比总吞吐量更重要,那么垃圾收集暂停必须保持短于大约一秒钟
醇>
- 选择
-XX:+UseConcMarkSweepGC
的并发收集器。如果只有一个或两个处理器可用,请考虑使用增量模式,如下所述。
实际上,只需仔细阅读整篇文档(并确保理解错误决定的含义:)并且不要忘记:
如果无法衡量,则无法改善。 - Lord Kelvin
在我的初步答案之下,一些读者可能仍然感兴趣:
Java Performance Tuning是Java性能的众所周知的参考,仍然更新。您可能还想查看Kirk Pepperdine的blog(实际上是以前网站的贡献者)。
答案 1 :(得分:0)
我在WebLogic上的Web应用程序中遇到内存泄漏问题。 http://middlewaremagic.com中的文章非常有用,我从中学到了很多关于JVM,GC,Coherence等的知识。
以下是本网站中有关JVM调优的有用链接: