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



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

我认为这可能是对内存中稍大空间的搜索,但我想它只比对象拥有的每个字段略大。然后,当我们寻找特定字段的值时,也许是前往内存中的正确地址,但话又说回来:我们添加的唯一内容是查找对象的地址。

有 3 种方式使对象创建成本高昂:

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

  • 许多对象具有"嵌入"的对象,这些对象也被隐式分配和

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

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

3) CPU 缓存。如果您分配临时对象(例如,放入 HashMap 时的 Integer),这些临时对象将被放入 L1 缓存中,从而驱逐一些其他数据。如果您只使用它一次,这不会得到回报。因此,高分配率(尤其是临时/不可变)会导致缓存未命中,从而导致情况显着变慢(取决于应用程序实际尝试实现的目标)。

另一个问题是生命周期。VM 可以处理最佳短期或超长生存期对象。如果您的应用程序创建了大量中年对象(例如缓存),您将获得更频繁的完整 GC。

关于蝇量级模式。这要看情况。如果这是一个非常小的物体,蝇量级经常不会得到回报。但是,如果您的使用模式涉及蝇量级候选对象的许多分配,那么蝇量级将获得回报。这就是热点默认在内部缓存 10.000 个整数对象的原因

在现代 JVM 中,对象创建的成本并不像以前那么高。它主要需要碰指针。事实上,在现代JVM中,许多对象实际上是秘密分配在机器堆栈上的,这基本上是免费的 - 根本不需要时间。

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

最新更新