由于客户端库中的一个非常愚蠢的错误,我们的生产系统存在一个特殊的问题。
发生了什么事
public <T> ResponseEntity<T> executePut(String url,JsonObject payload,Class<T> t) {
String payloadString = payload != null ? payload.toString() : null;
HttpEntity<String> entity = new HttpEntity<>(payloadString,getcommonHeaders());
restTemplate.getMessageConverters()
.add(0,new StringHttpMessageConverter(Charset.forName("UTF-8")));
return restTemplate.exchange(url,HttpMethod.PUT,entity,t);
}
从上述方法可以看出,客户端库正在使用自动装配的(单个)对象,并继续在MessageConverters列表中添加该元素。
问题:过一会儿,对restTemplate对象的引用也给NPE带来了空堆栈跟踪。
PS:我指出这是可能的原因,因为这是两次部署之间发生的唯一代码更改。
此外,大对象是否应该导致堆内存不足?在我们的案例中,这也没有发生,其他应用程序流程也完美无缺。