gpt4 book ai didi

java - 单例与否。如何测量?

转载 作者:行者123 更新时间:2023-11-30 08:20:22 24 4
gpt4 key购买 nike

有时您必须决定是使用 Singleton 对象(真正的单例,还是实际上的单例,如注入(inject)的 bean),还是每次都使用 new。你做什么实际上取决于对象。

如果创建一个对象需要一分钟和 10MB 的内存,如果没有必要,您不想创建多个对象。但是,如果它只需要 1 毫秒和 20 字节的内存,谁会在乎你是否在整个应用程序中创建了 10 个,而且在我看来,单例的额外复杂性是不值得的。

但我想衡量一下。我找到了一些使用 Instrumentation 包查看内存使用情况的选项,但这似乎非常困难且使用起来很麻烦。所以我想知道,是否有一些我可以使用的好技巧,例如在单元测试中,只是为了获得关于对象的内存和计时属性的一些大概数字?

澄清一下:在这种情况下,我的意思是单例:您只创建其中一个对象。不是真正的单例,您强制要求只有一个。

例如,我们使用resteasy来生成REST代理。您可以通过依赖注入(inject)获取代理:

@Bean
@Autowired
public AccountRequestResource accountsServiceClient(JaxRsProxyClientBuilder builder) {
return builder.createProxy(AccountRequestResource.class, accountsServiceBaseUrl);
}

@Autowired
AccountRequestResource accountsServiceClient

或者您可以为每个需要的类构建一个新类:

AccountRequestResource accountsServiceClient = 
builder.createProxy(AccountRequestResource.class, accountsServiceBaseUrl)

我想在一般情况下衡量这类问题(不仅仅是 resteasy,而是任何类型的注入(inject)对象)。

最佳答案

您想要将某些东西设为单例的原因通常不是为了节省时间/内存。

假设您有一个维护DatabaseConnection 池的类。您需要确保只有其中一个,否则您的池将增加一倍/三倍,并可能使数据库不堪重负。

同样,您可能有一个Cache 类,并且您希望确保只有一个缓存副本,以便您的应用程序具有一致性。

在我看来,您不需要为单例创建大量小实例这一事实是次要考虑因素。

一般来说,在 spring 中注入(inject)的 bean 并不是真正的“单例”。它们仅由容器实例化一次。没有什么能阻止您执行 new YourBean();,从而创建该类的两个副本。 真正的单例 永远不会让您在同一个 JVM 中创建两个副本。

关于java - 单例与否。如何测量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26114782/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com