单身或不单身。如何测量?

时间:2014-09-30 07:09:08

标签: java singleton

有时你必须决定使用Singleton对象(一个真正的单例,或者只是一个事实上的单例,如注入的bean),或者每次只使用new。你的所作所为取决于对象。

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

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

澄清:在这个上下文中使用单例我的意思是:你只创建一个对象。不是一个真正的单例,你强制只有一个。

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

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

@Autowired
AccountRequestResource accountsServiceClient

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

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

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

2 个答案:

答案 0 :(得分:2)

你想要制作单身的原因通常不是为了节省时间/内存。

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

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

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

一般来说,春天注入的豆子并不是真正的“单身人士”。它们只是由容器实例化一次。没有什么能阻止你做new YourBean();,从而创建了两个类的副本。 true singleton 永远不会让你在同一个JVM中制作两个副本。

答案 1 :(得分:1)

你应该让一个单项成为单身的唯一原因是,只有一个可能。

这与以下内容无关: - 创建所需的时间 - 它使用的内存 - 您只在当前设计中使用一个实例。

关于最后一项:假设您制作文本编辑器。您确定文档是单例。但是,稍后您认为拥有多个文档会很好...所以在将实例设为单例之前要三思而后行。单身人士应该只是单身人士,如果你知道现在和以后只有一个实例(即使那时我只在我需要从各个点访问时使用它)。