【问题标题】:Does it take heap to store constants (Java objects)? And how much?是否需要堆来存储常量(Java 对象)?多少钱?
【发布时间】:2020-04-02 16:19:25
【问题描述】:

所以在我的程序中我有很多检查,例如:

return Optional.ofNullable(issuer)
    .orElseThrow(() -> new OAuth2AuthenticationException
        new OAuth2Error(code, description, null));

所以我开始考虑创建一个包含大约 6 个字段的常量类,例如:

public static final OAuth2AuthenticationException ISSUER_IS_NOT_TRUSTED_EXCEPTION =
    new OAuth2AuthenticationException(new OAuth2Error(
        INVALID_ISSUER, "Issuer is not trusted", null));

现在我有类似的东西:

return Optional.ofNullable(issuer)
    .orElseThrow(() -> ISSUER_IS_NOT_TRUSTED_EXCEPTION);

我的问题是:这款游戏值得吗?因为如果每次都创建这些对象可能会占用更多内存一段时间(如果有很多并发用户试图非法访问 moemt 中的资源),但所有这些对象都会被 GC 销毁。

需要多少堆来存储类似 6 的异常,我应该这样做吗?

【问题讨论】:

  • “存储 6 个异常需要多少堆”可以忽略不计。但是您为什么不使用分析器并亲自查看呢?
  • @FedericoklezCulloca 因为在这里问比较容易,如果没人给我答案,我应该自己检查一下
  • 这样存储异常(或大多数对象)没有意义。
  • @Kayaman 为什么不呢?
  • @Kayaman 不仅如此,使用堆栈跟踪存储异常是没有意义的,而堆栈跟踪在引发异常时并不指示堆栈。

标签: java constants heap-memory


【解决方案1】:

记住:异常只能用于表示异常的事物。

如果某件事实际上是异常的,它很少发生,因此创建一个新对象的额外成本在所有情况下平均基本上为零,即使该对象的构建成本适中。

此外,异常有一个堆栈跟踪,它显示了引发异常时的调用堆栈(以及原因和抑制的异常等)。将其存储为常量是没有意义的,除非您(以某种方式)可以保证在具有完全相同的调用堆栈等的同一线程中引发异常。

只需创建一个新对象。

如果您使用此异常来表示并不罕见的事物,那么它并不是真正的异常。用其他东西来表示这一点。

【讨论】:

    【解决方案2】:

    大量检查

    大量支票是什么意思?如果它每秒发生数百或数千次,您将需要使用常量。当您改为使用常量时,它不需要每次都创建一个对象。如果你只做几次,那么你可以换一种方式。

    一个好的经验法则是,如果它被使用超过 10 次(给予或接受),那么只需将其设为一个字段以避免创建额外的对象。

    编辑:当然,这也取决于对象最初的大小,但对于像这种情况下这样的小对象,则规则成立

    【讨论】:

    • 大声笑,这些对象肯定被使用了数百次,但我仍然认为我不应该创建一个常量
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多