添加參數啟動java進程:
java -jar -Xms512m -Xmx512m -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps demo-0.0.1-SNAPSHOT.jar
java -jar -Xms64m -Xmx64m -XX:+UseConcMarkSweepGC -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDetails -XX:+PrintGCDateStamps demo-0.0.1-SNAPSHOT.jar
這里使用CMS垃圾收集器, 並在console里打印GC日志:
也可以在啟動參數里加上
-Xloggc:./gclogs
把GC日志輸出到文件里
據說各項含義如下:
查看gc信息:
jstat -gcutil <pid>1000 100
目前一切正常
用Jmeter進行壓力測試, 上500個用戶, 每個1秒請求一次后, 老生代直接被占滿了:
神奇的是這個時候再用瀏覽器訪問我的spring boot 8000的地址, 有時候還是可以打開, 要知道我設置了最大連接數也是200, 而spring boot內置的tomcat默認線程數也是200, 這意味着200個請求進來就可以處理, 多一個都會丟棄.
而設置最大連接數為1000的話, 壓力消失后老生代會穩定在85%左右, 而這些, 是不是就是泄露的內存了? 要不然為什么壓力消失后也很久不恢復?:
最大連接為320時, 老生代占用也很快長滿, 壓力消失后, 穩定在78%左右:
可以使用如下語句查看連接情況:
netstat –nat | grep 8083
通過如下命令,可以看到該進程內有多少個線程;其中,nlwp含義是number of light-weight process。
ps –o nlwp 27989