什么对创建对象的时间影响最大​​?

时间:2013-11-02 10:48:16

标签: java oop flyweight-pattern

我知道创建一个对象需要时间,这就是flyweight模式存在的原因。 我想知道的是增加创建单个对象的时间最多的是什么?

我认为它可能是在内存中搜索稍微大一点的空间,但我猜它只比对象的每个字段略大。然后,当我们寻找特定字段的值时,可能是在内存中移动到正确的地址,但是再次:我们添加的唯一内容是查找对象的地址。

2 个答案:

答案 0 :(得分:1)

对象创建的成本有三种方式:

1)对象分配。这实际上非常便宜(比如一些纳米),但考虑到了

  • 许多对象都有“嵌入”对象,这些对象也被隐含地分配了

  • 此外,构造函数运行(初始化对象)的时间通常比实际分配的成本更高。

2)任何分配都会消耗Eden空间,因此分配率越高,GC消耗的CPU越多(NewGen GC运行频率越高)

3)CPU缓存。如果你分配临时对象(例如放入HashMap时的Integer,那些临时对象被放入L1缓存中驱逐一些其他数据。如果你只使用它一次,这不会得到回报。因此高分配率(特别是temporarys / immutables)导致缓存未命中,导致案件显着减速(取决于应用实际尝试实现的目标)。

另一个问题是生命周期。 VM可以处理最佳短期或非常长寿的对象。如果你的应用程序创建了许多中年死亡对象(例如缓存),你将会更频繁地使用Full GC。

关于flyweight模式。这取决于。如果它是一个非常小的物体,轻量级经常不会得到回报。但是,如果您的使用模式涉及轻量级候选对象的许多分配,则轻量级将获得回报。这就是hotspot默认在内部缓存10.000个Integer对象的原因

答案 1 :(得分:1)

在现代JVM中,对象创建并不像以前那样昂贵。它主要需要撞击指针。事实上,在现代JVM中,许多对象实际上是在机器堆栈上秘密分配的,而且基本上是免费的 - 它根本不需要时间。

关于flyweight模式:不使用flyweight模式,因为对象创建成本高,而是用于通过与其他类似对象共享尽可能多的数据来最小化内存使用。