每次启动jar,接口都超时,一开始我以为是服务器性能不行,让我很是苦恼。在分析了一波之后,我开始尝试查找具体原因,发现在调用接口之后,内存飙升直到产生了oom。
以下是部分错误日志:
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332) ~[na:1.8.0_121]
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124) ~[na:1.8.0_121]
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448) ~[na:1.8.0_121]
at java.lang.StringBuffer.append(StringBuffer.java:270) ~[na:1.8.0_121]
at java.io.StringWriter.write(StringWriter.java:101) ~[na:1.8.0_121]
at java.io.StringWriter.append(StringWriter.java:143) ~[na:1.8.0_121]
at java.io.StringWriter.append(StringWriter.java:41) ~[na:1.8.0_121]
at com.google.gson.stream.JsonWriter.value(JsonWriter.java:566) ~[gson-2.9.0.jar!/:na]
发现报错位置在copyOf()方法内,如下:
public static char[] copyOf(char[] original, int newLength) {
char[] copy = new char[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
可以发现,每次调用copyOf方法时都会new一个char[],我在构建响应数据时使用了new Gson().toJson(),因此,一旦响应数据过多,就可能会造成oom。
网上搜索了一波后,暂时用fastjson的JSON.toJSONString()方法代替可以解决。