我知道创建一个对象需要时间,这就是享元模式存在的原因。我想知道的是什么增加了创建单个对象的时间最多?
我认为这可能是在内存中搜索稍大的空间,但我猜它只比对象所具有的每个字段稍大。那么,当我们在寻找特定字段的值时,可能是到内存中正确地址的旅行,但话又说回来:我们唯一添加的就是寻找对象的地址。
我知道创建一个对象需要时间,这就是享元模式存在的原因。我想知道的是什么增加了创建单个对象的时间最多?
我认为这可能是在内存中搜索稍大的空间,但我猜它只比对象所具有的每个字段稍大。那么,当我们在寻找特定字段的值时,可能是到内存中正确地址的旅行,但话又说回来:我们唯一添加的就是寻找对象的地址。
对象创建成本高的方式有 3 种:
1)对象分配。这实际上很便宜(像一些纳米),但是考虑到
许多对象具有“嵌入”对象,这些对象也被隐式分配和
此外,构造函数运行(初始化对象)的时间通常比实际分配的成本更高。
2)任何分配都会消耗Eden空间,所以分配率越高,GC消耗的CPU越多(NewGen GC运行更频繁)
3) CPU 缓存。如果您分配临时对象(例如,在放入 HashMap 时为整数,这些临时对象将被放入 L1 缓存中,驱逐一些其他数据。如果您只使用一次,这不会得到回报。因此分配率很高(尤其是临时/不可变)导致缓存未命中,以防万一(取决于应用程序实际尝试实现的目标)。
另一个问题是生命周期。VM 可以处理最好的短寿命或非常长寿命的对象。如果您的应用程序创建了很多中年死亡的对象(例如缓存),您将获得更频繁的 Full GC。
关于享元模式。这取决于。如果它是一个非常小的物体,蝇量级通常不会得到回报。但是,如果您的使用模式涉及到享元候选对象的许多分配,享元将得到回报。这就是热点默认在内部缓存 10.000 个 Integer 对象的原因
在现代 JVM 中,对象创建不像以前那么昂贵。它主要需要碰撞指针。事实上,在现代 JVM 中,许多对象实际上是在机器堆栈上秘密分配的,这基本上是免费的——根本不需要时间。
关于享元模式:没有使用享元模式,因为创建对象的成本很高,而是通过与其他类似对象共享尽可能多的数据来最小化内存使用。