Java Spring服务垃圾收集
我有一个SpringJava 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);
服务
,它调用一个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> info
日志记录级别,则应避免为log.info()
调用创建String
。使用占位符语法或在前面调用log.isInfoEnabled()
。查看常见问题解答我在这段代码中没有看到任何内存泄漏
- 您的内存在每个请求中都在增加,因为垃圾收集器在决定这样做时会对未使用的对象进行垃圾处理。所以你的物品可以在10或20次请求后被丢弃——你永远不知道
- 发生这种情况是因为堆上仍然有大量可用内存,所以垃圾收集器还没有被强制清理。如果您尝试调用多个请求,您很快就会看到垃圾收集器活动
- 如果您想查看更多详细信息,可以始终运行JDK附带的
,并观察堆内存如何根据垃圾收集器活动增加/减少jvisualvm
IsInfo启用
。