在Java中,如何提高对象创建的性能?

时间:2012-03-16 02:45:37

标签: java multithreading performance object

对象创建是我的应用程序的瓶颈。

我认为为对象创建添加更多线程会使情况变得更糟,因为对象创建是一个受CPU限制的任务,对吗?

然后,如何提高绩效?

4 个答案:

答案 0 :(得分:2)

问题通常不是对象创建本身,而是重复的对象创建和垃圾生成。这导致了两个性能命中:创建所有这些对象和额外的垃圾收集停顿。

首先,您应该使用性能分析工具来验证过多的对象创建是性能问题的根源。假设您已经确认这是问题所在,需要寻找各种方法和尝试的策略。这一切都取决于你的代码是如何编写的,所以没有一个推荐可行。这个Java performance guidelines from IBM列表绝对值得申请。它确定了如何避免许多最常见的错误:不要在循环内创建对象;使用StringBuilder而不是一系列字符串连接表达式;使用原始类型并尽可能避免自动装箱/拆箱;缓存经常使用的对象;分配具有显式容量的集合类,而不是允许它们增长;等

另一个不错的资源是Java性能调优一书的第4章。 (您可以在线阅读here。)

如果您在网上搜索过多的对象创建java ,您可以找到许多其他建议。

答案 1 :(得分:1)

当您的应用在具有多个处理器的计算机上运行时,您仍然可以通过多线程CPU绑定任务获得显着的性能提升。

答案 2 :(得分:1)

正如@Pst所说 - 你确定它是瓶颈吗?因为这些日子并不常见。

但鉴于此。您可以尝试的一件事是通过缓存和重用实例来避免创建。但这完全取决于你的计划的作用。

答案 3 :(得分:1)

Java对中小型对象使用TLAB(线程本地分配缓冲区)。这意味着每个线程可以同时分配对象。即使使用多个线程不会减慢速度。

通常,更多的CPU可以改善CPU限制的问题。它的IO绑定任务,其中一个CPU可以使用所有可用带宽,如磁盘访问,当您使用多个CPU时,这些任务不会更快。

降低对象创建成本的最简单方法是创建/丢弃较少的对象。有一个共同的假设是对象创建是不可避免的,但是过去2。5年我一直在研究GC每天不到一次的应用程序,即使在生产负载下也是如此。

大多数应用程序不能以这种方式工作,因为它们不需要。但是,如果您需要最小化对象创建,则可以。