有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在单例Springbean中声明静态方法

我们遇到了内存泄漏问题,我们怀疑下面的代码可能是原因,我们在一个单例类中有一个静态方法,并且怀疑它在被直接引用时导致内存泄漏

// This class is wired in spring xml and loaded as spring bean
public class SpringSingletonRestClient{

// instance method to make a web-service call
public ServiceResponse getResponseFromARestService(String RequestParam){.....}

// public static helper bean mapping method, that is used outside this class 
// for converting the service response object to different object
public static DomainResponse convertServiceResponseToDomainResponse(ServiceResponse serviceResponse){ //conversion logic.... }
 }

}

用法

Class MainClass {

//injected as spring bean
SpringSingletonRestClient client;

public void someMethod(){
ServiceResponse serviceResponse = client.getResponseFromARestService(...);
DomainResponse domainResponse =  SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse);
// use domainResponse object
.......
.......
}

}

请让我知道,如果需要更多的澄清,因为我刚刚添加了伪。 我们的内存使用率很高,我们怀疑使用由spring启动的类中声明的静态方法没有正确地进行垃圾收集,因此内存泄漏正在发生

问题-在Spring启动的singleton类中使用静态方法是否不好,即使该静态方法由直接引用使用,而不是由其实例变量使用


共 (1) 个答案

  1. # 1 楼答案

    静态方法不应导致内存泄漏。这只是意味着该方法不使用任何类字段,可以在没有类实例的情况下调用Java Documentation解释了这一点-检查节类方法

    内存泄漏的发生通常是因为“全局”字段保留引用并且从未停止使用它。这可能是一个收藏。您应该使用类似JConsole的东西来分析内存使用情况,并列出最常用的对象。这会帮助你缩小范围

    编辑(更多信息):您在调用静态方法时没有初始化对象。i、 e.任何地方都没有new SpringSingletonRestClient()

    DomainResponse domainResponse =  SpringSingletonRestClient.convertServiceResponseToDomainResponse(serviceResponse);
    

    在上面这句话中,春天是无关紧要的。这就好像该方法是过程语言中的一个简单函数。因此,这不会导致内存泄漏