1、什么是內存泄漏
內存泄漏是指,有未被釋放的java對象,一直停留在內存中。GCRoot 無法追蹤到此對象,導致此對象無法被回收。
2、什么是內存溢出
內存溢出是指,java程序創建對象需要內存,但是卻沒有內存可用了,內存就溢出了。
溢出:從字面理解,桶不夠裝,水溢出了
3、當時的環境:
打包成jar后,直接 運行 java -jar xx.jar。默認的jvm 運行參數 -Xms 。 因此給jvm分配的內存比較小。然后,當時上傳了1個有10W條的數據的excel插入到數據庫。結果就是,運行了幾分鐘,用top命令查看,java 的 cpu使用率為 99%。結果就是程序直接報錯。
4、當時情況
1、當時不清楚自己服務器的配置情況(阿里云學生機)
2、在本地測試好好的,在服務器端就不行了,懷疑是文件沒上傳,懷疑內存溢出
5、解決過程
1、先查看服務器配置
①、使用free -h 查看服務器內存。
②、使用top 命令查看 cpu 個數
輸入top 后, 按 1
2、診斷是文件在服務端沒讀取到,還是內存溢出。
①上傳小量的數據,發現上傳成功,也就是是內存不大夠
②使用top 命令。 客戶端上傳大文件。使用top命令時,發現上傳后,jvm 的cpu 使用率 直接飆到 99%。內存從5% 飆到 35%。最后客戶端直接報錯
3、設置 jvm 的啟動參數
-Xms : 初始堆大小(堆在java中是用于給對象分配內存的)
-Xmx : 最大堆大小
jcmd [pid] VM.flags
①查看 jvm 啟動參數,看是否設置小了
jcmd [pid] VM.flags
②發現確實是設置下小了,重新設置,并啟動
nohup java -Xms512m -Xmx512m -jar xx.jar &
最后的結果就是,程序運行稍微快了,之前上傳1000條左右的數據都很慢,現在就快很多了
總結:
原本是想著能不能通過把jvm的啟動參數設置大一點,進而來支持10W條數據的上傳。無耐,阿里云學生機配置不好,只能稍微修改一點,再將文件切割為小文件上傳了!
jvm參數請參考: https://segmentfault.com/a/11...