1. 报错信息
2021-10-29 08:44:56 WARN [,,,] [main] o.a.c.loader.WebappClassLoaderBase - The web application [ROOT] appears to have started a thread named [spring.cloud.inetutils] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: sun.misc.Unsafe.park(Native Method)
2021-10-29 08:45:00 ERROR [,,,] [main] o.s.boot.SpringApplication - Application run failed java.lang.IllegalArgumentException: Conflicting setter definitions for property "cur_page": com.example.demo.xxxClass#setSortTag(1 params) vs com.example.demo.xxxClass#setCurPage(1 params)
2. 错误代码
错误代码在第 2️⃣ 行:
@JsonProperty()
的 value 值跟下边的 curPage 的相同,就导致了 setter 定义冲突。
@ApiModelProperty(value = "排序标签") @JsonProperty(value = "cur_page") private Integer sortTag; @ApiModelProperty(value = "当前页") @JsonProperty(value = "cur_page") private Integer curPage;
3. 原因分析
遇到内存泄漏的次数不多,值得分析一下,我们看一下编译后的代码:
@JsonProperty("cur_page") public Demo setSortTag(final Integer sortTag) { this.sortTag = sortTag; return this; } @JsonProperty("cur_page") public Demo setCurPage(final Integer curPage) { this.curPage = curPage; return this; }
在JSON反序列化过程中,JSON需要和定义的实体类的属性对应,当属性名称不一致的时候我们会使用@JsonProperty("")
来映射属性,编译后的代码除了@JsonProperty("curPage")
相同看不出其他的异常,实际上 @JsonProperty("")
在序列化时也起到作用了:
// 序列化前(不同的KEY) { "sort_tag" : "1", "cur_page" : "2" } // 理论上序列化后(具有相同的KEY) { "curPage" : null, "curPage" : "2" }
所以猜想内存泄漏有可能就是出现在对象的序列化过程中。