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

标签 java oop flyweight-pattern

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

我认为这可能是在内存中搜索稍大的空间,但我猜它只比对象拥有的每个字段稍大一些。那么,当我们寻找特定字段的值时,也许它会移动到内存中的正确地址,但话又说回来:我们唯一添加的就是寻找对象的地址。

最佳答案

对象创建的成本有 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/

相关文章:

java - 启动 Android 应用程序时出错

java - 无法在 Play 2 中使用多个 ebean 数据库

c# - 通用等级系统

java - 享元模式中描述的内在状态和外在状态有什么区别?

database - 在数据库驱动的应用程序中使用享元模式

Java 享元模式 : Extrinsic and Intrinsic states?

java - 使用 spring SecurityWebFilterChain 如何禁用/阻止除少数已知路径之外的所有非 https 请求

java - Java 中的简单数学/转换错误我一直在想念?

c++ - 我的指针违反了访问限制错误,我想解释一下我应该在 Book 非默认构造函数中做什么

c# - 这是糟糕的 oop 设计吗?