三行代码  ›  专栏  ›  技术社区  ›  edith finch

关于在短时间内创建新对象

  •  1
  • edith finch  · 技术社区  · 3 周前

    我正在使用 JDK-21 我正试图为MMORPG游戏创建一个人工智能系统。我更喜欢使用java库中可用的stream/Optional编写代码,而不是if/for。

    我的代码每400毫秒为大量的人工智能玩家执行一次。这意味着400-500名玩家每400毫秒可以执行大约20个Optionals。这意味着java每400毫秒创建4.000个Optionals对象。这很糟糕吗?这会在以后引发问题吗?垃圾收集器能处理这个任务吗?有时我想得太多了,使用Optionals制作如此复杂的代码并生成越来越多的代码可能会导致以后出现RAM问题。

    我更喜欢用这种方式写作

    1 回复  |  直到 3 周前
        1
  •  0
  •   Silvio Mayolo    3 周前

    我更喜欢用这种方式写作

    你应该这样做。现代垃圾收集器针对创建一堆短期对象的用例进行了大量优化。这是因为JVM的垃圾收集器(事实上,现在大多数垃圾收集器) 世代 。一代垃圾收集器运行的前提是,系统中创建的大多数对象要么(A)寿命极短,要么(b)寿命超长。

    垃圾收集器中至少有两个独立的代。为了简单起见,我假设只有两个( This 似乎表明有几个,但那个页面也相当旧)

    • 所有新对象都是在“年轻”一代中创建的。年轻一代是一个较小的内存池,构建成本低且免费。在这一代人中,大多数物体的寿命都很短。“年轻”一代相对较小,垃圾收集成本较低。
    • 如果一个对象在足够多的“年轻”垃圾回收中幸存下来,那么它就会转移到“旧”一代。“旧”一代由寿命较长的物体组成,这些物体不太可能被释放。如果“年轻”的垃圾收集没有释放足够的内存,我们将在下一代释放“老”一代,这是一个较慢的操作。

    因此,直接回答你的问题:尽情地创建短命的对象,并相信像Java这样的高级语言足够聪明,可以用你的代码做一些聪明的事情。如果您后来发现(通过评测和基准测试工具)某个特定的热代码路径是一个瓶颈,那么(而且只有到那时)您才能讨论切换到较低级别的构造并消除分配。但现在这样做还为时过早。

    相关问题: