Java Spring服务垃圾收集

Java Spring服务垃圾收集,java,spring,spring-boot,spring-mvc,garbage-collection,Java,Spring,Spring Boot,Spring Mvc,Garbage Collection,我有一个Spring服务,它调用一个API。此服务创建多个对象并将这些对象返回给客户端(REST请求)。 这是好的做法吗?我观察到每个请求的内存消耗都在增加。是否没有发生垃圾收集 @org.springframework.stereotype.Service("FanService") public class Service { private static final Logger log = LoggerFactory.getLogger(Service.class);

我有一个Spring
服务
,它调用一个API。此
服务
创建多个对象并将这些对象返回给客户端(REST请求)。 这是好的做法吗?我观察到每个请求的内存消耗都在增加。是否没有发生垃圾收集

@org.springframework.stereotype.Service("FanService")
public class Service {

    private static final Logger log = LoggerFactory.getLogger(Service.class);

    public List<String> allCLubsInLeague() {
        try {
            URI urlString = new URI("https://www.thesportsdb.com/api/v1/json/1/search_all_teams.php?l=German%20Bundesliga");
            RestTemplate restTemplate = new RestTemplate();

            TeamsList response = restTemplate.getForObject(urlString, TeamsList.class);
            List<BundesligaTeams> bundesligaTeams = response.getTeams();

            //ResponseEntity<List<BundesligaTeams>> test = t.getForEntity(urlString, BundesligaTeams.class);

            List<String> teamList = new ArrayList<>();
            bundesligaTeams.forEach(value -> teamList.add(value.getStrTeam()));
            log.info(bundesligaTeams.get(0).getStrAlternate());
            bundesligaTeams = null;
            response = null;
            urlString = null;
            restTemplate = null;

            return teamList;

        } catch (Exception e) {
            log.info(e.getMessage());
        }
        return null;
    }

}
@org.springframework.stereotype.Service(“FanService”)
公务舱服务{
私有静态最终记录器log=LoggerFactory.getLogger(Service.class);
公共列表allCLubsInLeague(){
试一试{
URI urlString=新URI(“https://www.thesportsdb.com/api/v1/json/1/search_all_teams.php?l=German%20Bundesliga");
RestTemplate RestTemplate=新RestTemplate();
TeamsList响应=restTemplate.getForObject(urlString,TeamsList.class);
列出德甲球队=response.getTeams();
//ResponseEntity test=t.getForEntity(urlString,BundesligaTeams.class);
List teamList=new ArrayList();
forEach(value->teamList.add(value.getStrTeam());
log.info(德甲球队.get(0.getStrAlternate());
德甲球队=零;
响应=空;
urlString=null;
restemplate=null;
返回团队列表;
}捕获(例外e){
log.info(如getMessage());
}
返回null;
}
}

如果您不使用零垃圾分配编写低延迟应用程序,那么您应该首先关注编写可读和可维护的代码。只有在性能不可接受时才调整性能

如果您有可用内存,创建对象是可以的,内存分配比GET请求便宜。看

  • 除非您试图删除安全凭据,否则没有理由
    null
    局部变量。不要写
    bundesligaTeams=null和其他语句结束时,一旦无法访问这些对象,就会收集它们

  • restemplate
    应该是一个单独的bean。如果底层HTTP客户机的创建成本很高,那么创建此对象的成本可能会很高。考虑Spring Bug提供的默认代码<代码> RestMase。< /P>
  • 如果数据不经常更改,则在本地缓存GET请求的结果。德甲所有俱乐部的名单每年只会改变一次

  • 如果未启用
    info
    日志记录级别,则应避免为
    log.info()
    调用创建
    String
    。使用占位符语法或在前面调用
    log.isInfoEnabled()
    。查看常见问题解答


  • 我在这段代码中没有看到任何内存泄漏

    • 您的内存在每个请求中都在增加,因为垃圾收集器在决定这样做时会对未使用的对象进行垃圾处理。所以你的物品可以在10或20次请求后被丢弃——你永远不知道
    • 发生这种情况是因为堆上仍然有大量可用内存,所以垃圾收集器还没有被强制清理。如果您尝试调用多个请求,您很快就会看到垃圾收集器活动
    • 如果您想查看更多详细信息,可以始终运行JDK附带的
      jvisualvm
      ,并观察堆内存如何根据垃圾收集器活动增加/减少

    2。默认情况下,已由Spring Boot提供。4.这里并没有真正改变,因为它只适用于字符串concat,使用占位符将实际创建2个字符串,并且仍然不进行日志记录,因此SLF4j不需要使用
    IsInfo启用