一、什么是内存泄漏
内存泄漏是指,有未被释放的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...