公司业务复杂,开始的时候并没有注意到该错误,而是按照业务流程去排查,后又去代码中查找,由于我才来公司,只能边排查边了解了。
在进行了本地调试、添加log在测试机跑,最后发现日志中有一条数据缺失,于是追溯发现另一个子系统在执行的过程中爆出了OOM,如下:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Unknown Source)
at java.io.ByteArrayOutputStream.grow(Unknown Source)
at java.io.ByteArrayOutputStream.ensureCapacity(Unknown Source)
at java.io.ByteArrayOutputStream.write(Unknown Source)
at org.springframework.util.StreamUtils.copy(StreamUtils.java:138)
at org.springframework.http.converter.ResourceHttpMessageConverter.writeContent(ResourceHttpMessageConverter.java:110)
at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:102)
at org.springframework.http.converter.ResourceHttpMessageConverter.writeInternal(ResourceHttpMessageConverter.java:45)
at org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:227)
at org.springframework.http.converter.FormHttpMessageConverter.writePart(FormHttpMessageConverter.java:373)
at org.springframework.http.converter.FormHttpMessageConverter.writeParts(FormHttpMessageConverter.java:353)
at org.springframework.http.converter.FormHttpMessageConverter.writeMultipart(FormHttpMessageConverter.java:342)
at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:257)
at org.springframework.http.converter.FormHttpMessageConverter.write(FormHttpMessageConverter.java:89)
at org.springframework.web.client.RestTemplate$HttpEntityRequestCallback.doWithRequest(RestTemplate.java:897)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:658)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:621)
at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:539)
......
多的不再展示,错误中有相关错误的类和方法,追溯进去发现,祖传代码,不敢动,作为新人的我只能另寻他法。既然暂时没法从根源上解决,那就简单粗暴点——JVM调参,我们使用的是tomcat8(Windows平台下),6.0版本之后修改jvm参数需要在tomcatw.exe中设置参数,运行该exe即可,如下图:
具体修改多少根据自己业务所需和服务器硬件来配置,我最后设置的是256和2048即:
// 堆区
-Xms256m
-Xmx2018m
// 非堆区(自行配置)
-XX:PermSize
-XX:MaxPermSize
至于年轻代、老年代等有机会补充