我知道创建一个对象需要时间,这就是享元模式存在的原因。 我想知道什么增加了创建单个对象的时间最多?
我认为这可能是在内存中搜索稍大的空间,但我猜它只比对象拥有的每个字段稍大一些。那么,当我们寻找特定字段的值时,也许它会移动到内存中的正确地址,但话又说回来:我们唯一添加的就是寻找对象的地址。
最佳答案
对象创建的成本有 3 种:
1) 对象分配。这实际上相当便宜(就像一些纳米),但是请考虑到
许多对象都有“嵌入”对象,这些对象也是隐式分配的,并且
此外,构造函数运行(初始化对象)的时间通常比实际分配的时间成本更高。
2)任何分配都会消耗Eden空间,因此分配率越高,GC消耗的CPU就越多(NewGen GC运行更频繁)
3) CPU 缓存。如果您分配临时对象(例如,在放入 HashMap 时分配 Integer),这些临时对象将被放入 L1 缓存中,逐出一些其他数据。如果您只使用它一次,则不会有返回。因此高分配率(特别是临时/不可变)导致缓存未命中,从而导致速度显着减慢(取决于应用程序实际试图实现的目标)。
另一个问题是生命周期。虚拟机可以处理最好的短生命周期或非常长生命周期的对象。如果您的应用程序创建了大量中年垂死的对象(例如缓存),您将获得更频繁的 Full GC。
关于享元模式。这取决于。如果它是一个非常小的物体,flyweight 通常不会有返回。但是,如果您的使用模式涉及享元候选对象的多次分配,享元将会得到返回。这就是热点默认在内部缓存 10.000 个 Integer 对象的原因
关于java - 什么对创建对象的时间影响最大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19741122/