首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java服务SPI和内存泄漏

Java服务SPI和内存泄漏
EN

Stack Overflow用户
提问于 2019-06-12 05:26:59
回答 1查看 113关注 0票数 0

我有1000多个服务,我正在对这些服务进行改进/清理,以便将它们的实现复杂性抽象出来。然而,我注意到的是,java没有提供基于单例的SPI设置。相反,它为如何在处理基于SPI的服务时实现这一目标提供了指导。

https://docs.oracle.com/javase/tutorial/ext/basics/spi.html#singleton

以下代码

ServiceProvider sp = ServiceLoader.load(ProvierAPI.class).iterator().next()

每次查询ServiceProvider时都会加载ServiceLoader的一个新实例。但是,我不太确定它是,而不是,这是一种内存安全操作,因为下面的代码将确保在上下文离开堆栈帧后发生垃圾回收。

代码语言:javascript
复制
    public void doFoo() {

     ServiceProvider sp = ServiceLoader.load(ProvierAPI.class).iterator().next();

     sp.doServiceFoo();

     doSomethingElse();

     return;
}

使用单身者“真的”在这里有什么好处吗?据我所知,Singleton在技术上意味着内存中的许多永久对象引用(所谓的静态getInstance() )。

使用Singleton的SPI相关实现更好吗?

EN

回答 1

Stack Overflow用户

发布于 2019-06-12 18:50:02

IMHO将问题减少到内存需求,忽略了重要的方面。

代码语言:javascript
复制
ServiceLoader.load(ProvierAPI.class).iterator().next()

每次运行此代码时,ServiceLoader都必须查找和读取提供程序配置文件,这意味着检查类路径上的所有jar文件,以检查提供程序配置文件。

光是这一点就会对性能产生一定的影响。

另一点是服务提供者在实例化时所做的事情。如果他们只是创建一个Map并用几个值填充它,那么什么都不会发生。

但是,假设一个字典服务在每次实例化服务时从一个文件中读取数千个单词的字典及其定义。当然,您更喜欢这样做一次,而不是每次用户在TextArea中的某个单词上悬停鼠标光标时。

最后,这在很大程度上取决于您的服务提供者以及它们是如何实现的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56555188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档