春季服务垃圾收集

时间:2019-03-19 12:41:45

标签: java spring spring-boot spring-mvc garbage-collection

我的问题专家,我有一个服务类,可调用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;
}
}

2 个答案:

答案 0 :(得分:0)

如果您不使用零垃圾分配来编码低延迟应用程序,则应首先集中精力编写可读性和可维护性的代码。只有在不可接受的情况下,才能调整性能。

如果有可用内存,则可以创建对象,与GET请求相比,内存分配便宜。参见Latency Numbers Every Programmer Should Know

  1. 除非您要删除安全凭证,否则没有理由null使用本地变量。不要在末尾写bundesligaTeams = null;和其他语句,一旦无法访问这些对象将被收集。

  2. RestTemplate应该是一个单独的bean。如果底层HTTP客户端创建成本很高,则创建该对象可能会很昂贵。考虑自动装配Spring Boot提供的默认RestTemplate

  3. 如果数据不经常更改,则在本地缓存GET请求的结果。德国德甲所有俱乐部的名单每年只会更改一次。

  4. 如果未启用String日志记录级别,则应避免为log.info()调用创建info。使用占位符语法或在之前调用log.isInfoEnabled()。请查看What is the fastest way of (not) logging?常见问题解答。

答案 1 :(得分:0)

在此代码中我看不到任何内存泄漏。

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