Java 在将基元类型与泛型一起使用时减少潜在的多余垃圾?

Java 在将基元类型与泛型一起使用时减少潜在的多余垃圾?,java,optimization,Java,Optimization,我有一个系统,允许我为每个玩家创建和实现类型安全变量。每个变量都是按照 @Foo public static final Bar KILLS = new Bar(); 注释将变量标记为在运行时拾取以进行注册。这些变量本质上是静态的mutator方法,可以像这样调整相关玩家的基本值 KILLS.set(player, 10); 系统工作得很好,但是,每种类型(Object、int、String等)都有一个可变类型作为后盾,该类型被惰性地加载到各自玩家的变量映射中。我对这种设计可能会带来的潜在垃

我有一个系统,允许我为每个玩家创建和实现类型安全变量。每个变量都是按照

@Foo
public static final Bar KILLS = new Bar();
注释将变量标记为在运行时拾取以进行注册。这些变量本质上是静态的mutator方法,可以像这样调整相关玩家的基本值

KILLS.set(player, 10);
系统工作得很好,但是,每种类型(Object、int、String等)都有一个可变类型作为后盾,该类型被惰性地加载到各自玩家的变量映射中。我对这种设计可能会带来的潜在垃圾问题很好奇,因为玩家数量会上升。我知道由于java的自动装箱机制,有些事情是不可避免的,但在其他地方可能还有一些改进的空间。我并不完全熟悉java内存模型,所以请原谅我的解释或缺乏解释

编辑:

为了更清楚一点,每个变量类型都扩展了一个父类,并分别提供了一个T类型。然后,这些子类可以访问重写所需的方法,这些方法允许它们改变相关player变量的值。

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

如果您指的是Java的运行时内存管理:Java(正如您可能知道的)是自动垃圾收集的,但是您可以建议(没有任何保证)Java随时使用
System.gc()
收集垃圾。这几乎总是一个微观优化,几乎没有真正的好处,因为Java在确定正确的时间进行垃圾收集方面已经非常出色了。我甚至不用担心Java中的问题

如果您指的是存储这些数据的外部模型,我会很担心。通过使用抽象的“setter”方法,由于缺少更好的术语,您暴露了bug或副作用,从而破坏了内存。这是需要双重管理的东西,以便在Java实现上尽可能避免bug,但您也需要自己管理外部存储上的内存


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

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

如果您指的是Java的运行时内存管理:Java(正如您可能知道的)是自动垃圾收集的,但是您可以建议(没有任何保证)Java随时使用
System.gc()
收集垃圾。这几乎总是一个微观优化,几乎没有真正的好处,因为Java在确定正确的时间进行垃圾收集方面已经非常出色了。我甚至不用担心Java中的问题

如果您指的是存储这些数据的外部模型,我会很担心。通过使用抽象的“setter”方法,由于缺少更好的术语,您暴露了bug或副作用,从而破坏了内存。这是需要双重管理的东西,以便在Java实现上尽可能避免bug,但您也需要自己管理外部存储上的内存


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

谢谢您的输入。我在帖子中有点含糊不清,但总的来说,我需要一双(或更多)眼睛来剖析我目前的想法,并指出任何危险信号。是的,我关心的是java不能保证垃圾何时被清理,这就是为什么我想尝试让GC尽可能地“轻松”处理垃圾的原因。我相信当新内存被放在堆上时,GC会进行扫描,这让我相信“死”内存或在那一刻之前没有被清理的东西都会被放在那里。谢谢你的澄清。请允许我更好地回答:直到最后一个引用对象不再引用该内存,内存才会被清除。例如:如果一个对象仅在For循环或方法中初始化,并且从未从方法中抛出,则该对象可以在该方法返回后立即被清除。请欣赏这些信息。你给了我一些我需要的见解。谢谢你的意见。我在帖子中有点含糊不清,但总的来说,我需要一双(或更多)眼睛来剖析我目前的想法,并指出任何危险信号。是的,我关心的是java不能保证垃圾何时被清理,这就是为什么我想尝试让GC尽可能地“轻松”处理垃圾的原因。我相信当新内存被放在堆上时,GC会进行扫描,这让我相信“死”内存或在那一刻之前没有被清理的东西都会被放在那里。谢谢你的澄清。请允许我更好地回答:直到最后一个引用对象不再引用该内存,内存才会被清除。例如:如果一个对象仅在For循环或方法中初始化,并且从未从方法中抛出,则该对象可以在该方法返回后立即被清除。请欣赏这些信息。你给了我一些我需要的洞察力。