我的问题专家,我有一个服务类,可调用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;
}
}
答案 0 :(得分:0)
如果您不使用零垃圾分配来编码低延迟应用程序,则应首先集中精力编写可读性和可维护性的代码。只有在不可接受的情况下,才能调整性能。
如果有可用内存,则可以创建对象,与GET请求相比,内存分配便宜。参见Latency Numbers Every Programmer Should Know。
除非您要删除安全凭证,否则没有理由null
使用本地变量。不要在末尾写bundesligaTeams = null;
和其他语句,一旦无法访问这些对象将被收集。
RestTemplate
应该是一个单独的bean。如果底层HTTP客户端创建成本很高,则创建该对象可能会很昂贵。考虑自动装配Spring Boot提供的默认RestTemplate
。
如果数据不经常更改,则在本地缓存GET请求的结果。德国德甲所有俱乐部的名单每年只会更改一次。
如果未启用String
日志记录级别,则应避免为log.info()
调用创建info
。使用占位符语法或在之前调用log.isInfoEnabled()
。请查看What is the fastest way of (not) logging?常见问题解答。
答案 1 :(得分:0)
在此代码中我看不到任何内存泄漏。
jvisualvm
,并观察堆内存如何根据垃圾回收器的活动增加/减少