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