春季服务垃圾回收



我有一个SpringService,它调用了一个API。此Service创建多个对象并将这些对象返回到客户端(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;
}
}

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

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

如果您没有编写具有零垃圾分配的低延迟应用程序,则应首先专注于编写可读且可维护的代码。只有在不可接受的情况下,才调整性能。

如果您有可用内存,可以创建对象,与 GET 请求相比,内存分配很便宜。查看每个程序员都应该知道的延迟数字。

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

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

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

  4. 如果未启用info日志记录级别,则应避免为log.info()调用创建String。使用占位符语法或之前调用log.isInfoEnabled()。查看什么是最快的(不)日志记录方法?常见问题。

最新更新