我的 Java 程序有问题。我用top查看了一下,发现RSS资源远大于堆内存的最大值。 这是我的代码,非常简单
@RequestMapping("/test")
public Mono<BridgeResopnse> test(@RequestParam("num") Integer num, @RequestParam("size") Integer size) {
log.info("PlatformDependent.usedDirectMemory(): {} MB", PlatformDependent.usedDirectMemory() / 1024 / 1024);
return Mono.fromCallable(() -> {
BridgeResopnse bridgeResopnse = new BridgeResopnse();
bridgeResopnse.setContent(getContent(num, size));
bridgeResopnse.setCrc("crc");
return bridgeResopnse;
});
}
private static String getContent(int num, int size) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < num; i++) {
sb.append(RandomUtil.randomString(size)).append(";\n");
}
return sb.toString();
}
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BridgeResopnse {
String content;
String crc;
}
这是我的java配置: java -Xms512m -Xmx512m -XX:+UseG1GC -jar demo.jar jdk:jdk1.8.0_151 netty 核心:4.1.94.Final 这是我的压力测试设置和 rss
/test?num=1000&size=2400 ,return response size is 2.29mb
另外,当我增加返回的数据量时,可能会导致OutOfDirectMemoryError。这时候日志就报错了。这是正常的,但是此时RSS也在增加,并且随着压力测试停止,RSS会很大。请看下图。 这是我的压力测试设置和 rss
/test?num=1000&size=5000 ,return response size is 4.77mb
抱歉,我忘记附上最后压测后的rss资源使用图了,rss占用了1069m,很不正常。直接删除内存会导致泄漏吗?查看netty源码没有发现重大泄露 在此输入图片描述