是否需要堆来存储常量(Java对象)?多少钱?

是否需要堆来存储常量(Java对象)?多少钱?,java,constants,heap-memory,Java,Constants,Heap Memory,因此,在我的程序中,我有很多检查,如: return Optional.ofNullable(issuer) .orElseThrow(() -> new OAuth2AuthenticationException new OAuth2Error(code, description, null)); 因此,我开始考虑创建一个常量类,其中包含6个字段,如: public static final OAuth2AuthenticationException ISSUE

因此,在我的程序中,我有很多检查,如:

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);
我的问题是:这场比赛值得吗?因为在每次创建这些对象的情况下,可能会在一段时间内占用更多内存(如果有很多并发用户试图非法访问momemt中的资源),但所有这些对象都将被GC销毁


存储like 6异常需要多少堆?我应该这样做吗

很多支票

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

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


编辑:当然,这也取决于对象最初的大小,但对于像本例中这样的小对象,规则仍然有效。请记住:异常只应用于表示异常情况

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

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

只需创建一个新对象


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

“像6异常一样存储需要多少堆”可以忽略不计。但是你为什么不使用探查器自己查看呢?@FedericoklezCulloca因为在这里提问比较容易,如果没有人给我答案,我应该自己检查一下。这样存储异常(或大多数对象)是没有意义的。@Kayaman为什么不呢?@Kayaman不止这些,用堆栈跟踪存储异常是没有意义的,当抛出异常时,堆栈跟踪不指示堆栈。哈哈,这些对象肯定被使用了数百次,但我仍然认为我不应该创建一个常量