记一次,jvm 内存溢出
1、什么是內(nèi)存泄漏
內(nèi)存泄漏是指,有未被釋放的java對象,一直停留在內(nèi)存中。GCRoot 無法追蹤到此對象,導(dǎo)致此對象無法被回收。
2、什么是內(nèi)存溢出
內(nèi)存溢出是指,java程序創(chuàng)建對象需要內(nèi)存,但是卻沒有內(nèi)存可用了,內(nèi)存就溢出了。
溢出:從字面理解,桶不夠裝,水溢出了
3、當(dāng)時(shí)的環(huán)境:
打包成jar后,直接 運(yùn)行 java -jar xx.jar。默認(rèn)的jvm 運(yùn)行參數(shù) -Xms 。 因此給jvm分配的內(nèi)存比較小。然后,當(dāng)時(shí)上傳了1個(gè)有10W條的數(shù)據(jù)的excel插入到數(shù)據(jù)庫。結(jié)果就是,運(yùn)行了幾分鐘,用top命令查看,java 的 cpu使用率為 99%。結(jié)果就是程序直接報(bào)錯(cuò)。
4、當(dāng)時(shí)情況
1、當(dāng)時(shí)不清楚自己服務(wù)器的配置情況(阿里云學(xué)生機(jī))
2、在本地測試好好的,在服務(wù)器端就不行了,懷疑是文件沒上傳,懷疑內(nèi)存溢出
5、解決過程
1、先查看服務(wù)器配置
①、使用free -h 查看服務(wù)器內(nèi)存。
②、使用top 命令查看 cpu 個(gè)數(shù)
輸入top 后, 按 1
2、診斷是文件在服務(wù)端沒讀取到,還是內(nèi)存溢出。
①上傳小量的數(shù)據(jù),發(fā)現(xiàn)上傳成功,也就是是內(nèi)存不大夠
②使用top 命令。 客戶端上傳大文件。使用top命令時(shí),發(fā)現(xiàn)上傳后,jvm 的cpu 使用率 直接飆到 99%。內(nèi)存從5% 飆到 35%。最后客戶端直接報(bào)錯(cuò)
3、設(shè)置 jvm 的啟動參數(shù)
-Xms : 初始堆大小(堆在java中是用于給對象分配內(nèi)存的) -Xmx : 最大堆大小 jcmd [pid] VM.flags①查看 jvm 啟動參數(shù),看是否設(shè)置小了
jcmd [pid] VM.flags②發(fā)現(xiàn)確實(shí)是設(shè)置下小了,重新設(shè)置,并啟動
nohup java -Xms512m -Xmx512m -jar xx.jar &最后的結(jié)果就是,程序運(yùn)行稍微快了,之前上傳1000條左右的數(shù)據(jù)都很慢,現(xiàn)在就快很多了
總結(jié):
原本是想著能不能通過把jvm的啟動參數(shù)設(shè)置大一點(diǎn),進(jìn)而來支持10W條數(shù)據(jù)的上傳。無耐,阿里云學(xué)生機(jī)配置不好,只能稍微修改一點(diǎn),再將文件切割為小文件上傳了!
jvm參數(shù)請參考: https://segmentfault.com/a/11...
總結(jié)
以上是生活随笔為你收集整理的记一次,jvm 内存溢出的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性能测试调优篇---未完待续
- 下一篇: (十三)java版spring clou