首页 > 解决方案 > 使用带有泛型的原始类型时减少潜在的多余垃圾?

问题描述

我有这个系统,允许我为每个玩家创建和实现类型安全的变量。每个变量的定义如下

@Foo
public static final Bar KILLS = new Bar();

注释标记要在运行时获取的变量以用于注册目的。这些变量本质上是静态变量方法,可以像这样调整相关玩家的基础值

KILLS.set(player, 10);

该系统运行良好,然而,每种类型(Object、int、String 等)都由一个可变类型支持,该类型会延迟加载到相应玩家的变量映射中。我很好奇随着玩家数量的增加,这种设计可能会引入潜在的垃圾问题。我知道由于 java 的自动装箱机制,有些事情是不可避免的,但也许其他地方还有一些改进的余地。我对 java 内存模型并不完全熟悉,所以请原谅我的解释或缺乏解释。

编辑:

为了更清楚一点,每个变量类型都扩展了一个父类并分别提供了一个 T 类型。然后,这些子类可以访问覆盖所需的方法,这些方法允许它们改变相关玩家变量的值。 类层次结构的可视化

标签: javaoptimization

解决方案


首先,我想说我对你提到的“垃圾问题”有点困惑,因为你的上下文并不完全清楚你是指 Java 的运行时内存的隐式垃圾收集还是你关心这个注册数据在其他地方堆积,比如数据库。

如果您指的是 Java 的运行时内存管理:Java(您可能知道)会自动进行垃圾收集,但您可以建议(但不保证)Java 随时使用System.gc(). 这几乎总是一种微优化,几乎没有带来任何真正的好处,因为 Java 在没有你的情况下确定正确的时间进行垃圾收集已经很了不起了。我什至不会在 Java 中担心它。

如果您指的是存储此数据的外部模型,会担心。通过使用抽象的“setter”方法,由于缺少更好的术语,您正在暴露错误或副作用来破坏该内存。这需要双重管理以在 Java 实现中尽可能无错误,但您还需要自己管理外部存储上的内存。

尽管如此,这种情况几乎肯定表明支持代码需要重组和更多方向。这个抽象的 setter 方法(在我看来)是一种代码味道。


推荐阅读