性能主题

如何提高Java性能?

确认提升性能重要方式

首先,你需要知道需要修复什么,然后再开始修复它。同样的规则也适用于这里。例如,如果您的应用程序通过网络接收数据存储。您应该关注网络的数据传输和数据存储在磁盘上,可能是一个RDBMS。
然后分离出它们,要做到这一点你的架构必须松耦合,比如引入异步等等。关于Ebay的架构之一Asynchrony Everywhere

避免堵塞

尽可能使用异步是一个关键的性能路径,如果你堵塞了一个网络调用, 你不仅是堵塞自己的程序,也许会挂起了其他调用这个API的程序。如果不妥善处理,等待传送的信息可以迅速堆满内存直至崩溃。这种情况下,一个简单的解决方案是使用队列和线程池。

读取数据 - 内存 vs 磁盘 vs 网络

NodeJS的创建者 Quoting Ryan Dahl认为:从内存中读取,就像是走到隔间你的同事房间里,并获得一个报告,通过网络读取数据到绕世界一半才到你的同事的办公室得到了一份报告。

不必要的网络通讯是自讨苦吃,最有可能是你最大的堵塞来源之一。识别数据来源,从磁盘读取,或可能是从一个RDBMS ,或在网络上,你会看到在这里如果是获取一遍又一遍相同的数据。是的,解决的办法是显而易见的。让我们记住内存与磁盘之间的差异,让我们拥抱缓存。如果你有复杂的缓存需求使用一个缓存库,如是一个简单的对象自己实现缓存。无论哪种方式,它会立刻提升你的性能表现很多倍。

上下文切换

线程对于异步操作很好,如果你有1000个线程应用程序中运行,上下文切换可能比你的业务实际工作还要做得多。克服这个问题的方法之一是使用'固定'的线程池。固定意思大小不变的有界的。

永远不要让它无限

您可以使用连接池,线程池,队列和许多其他机制来获得性能。可能在测试过程中,所有这些确实非常好,但是如果不限制最大值将自讨苦吃。,对不可预知的条件这是一个很好的防守的做法。

 

对象池