3

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 查看服务器内存。

clipboard.png

②、使用top 命令查看 cpu 个数
clipboard.png
输入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...


心无私天地宽
513 声望22 粉丝