内存调优实战
@RestControllerpublic class GcTestController {private Queue<Greeting> objCache = new ConcurrentLinkedDeque<>();@RequestMapping("/greeting")public Greeting greeting() {Greeting greeting = new Greeting("Hello World!");if (objCache.size() >= 200000) {objCache.clear();} else {objCache.add(greeting);}return greeting;}}@Data@AllArgsConstructorclass Greeting {private String message;}
java -Xmx32m -Xss256k -verbosegc -Xlog:gc*,gc+ref=debug,gc+heap=debug,gc+age=trace:file=gc-%p-%t.log:tags,uptime,time,level:filecount=2,filesize=100m-jar target/demo-0.0.1-SNAPSHOT.jar


图中上部的蓝线表示已使用堆的大小,我们看到它周期的上下震荡,这是我们的对象池要扩展到 200000 才会清空。
图底部的绿线表示年轻代 GC 活动,从图上看到当堆的使用率上去了,会触发频繁的 GC 活动。
图中的竖线表示 Full GC,从图上看到,伴随着 Full GC,蓝线会下降,这说明 Full GC 收集了年老代中的对象。
GC 活动频繁:年轻代 GC(绿色线)和年老代 GC(黑色线)都比较密集。这说明内存空间不够,也就是 Java 堆的大小不够。
Java 的堆中对象在 GC 之后能够被回收,说明不是内存泄漏。

java -Xmx2048m -Xss256k -verbosegc -Xlog:gc*,gc+ref=debug,gc+heap=debug,gc+age=trace:file=gc-%p-%t.log:tags,uptime,time,level:filecount=2,filesize=100m-jar target/demo-0.0.1-SNAPSHOT.jar


文章转载自Alleria Windrunner,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




