遇到一个很骚的问题。
java吧
全部回复
仅看楼主
level 6
占占子子 楼主
我的业务是从ftp上下载文件然后转换并且插入数据库,用了ByteArrayOutputStream来把输入流转成输出流,因为有多个文件就按文件一个个下载,每次用完流就关掉,结果oom了,我百思不得其解给代码都看了一遍,也没找到明显的问题,然后用jprofiler看了一下内存,好家伙这东西吃我600m内存且没法释放,我寻思我都关了流啊,怎么可能不释放,然后点进去发现这吊玩意close里面啥都没有,老子关了个寂寞,浪费我一下午时间。[怒][怒][怒]
2022年05月17日 11点05分 1
level 10
关闭流的意思是关闭占用操作系统的资源,比如文件描述符数量是有限制的,不关闭会超过限制,还有文件描述符表好像还记录了文件的元信息等等,这些都是资源。
这个类和操作系统无关,它已经把数据存到内存了,所以关闭流没意义。
你使用完就设置成null让垃圾回收吧,也可以找时机让虚拟机强制垃圾回收一下。
2022年05月17日 12点05分 3
学到了[真棒],已经强制关掉了,第一次用这个类。
2022年05月17日 12点05分
level 1
跟这个没关系,你要关文件流
2022年05月17日 13点05分 4
level 7
可以用buffer包一下sftp的下载流,readline然后解析入库,弄个bytearray 需要内存拷贝,又占内存又慢。进一步优化的话可以搞个生产者消费者模型,弄个有界队列(防止oom)一个线程下,一个线程插。
2022年05月17日 23点05分 5
level 1
跟这个没关系,他只是提供给你一个可调用的方法,实现在底层,多半的代理的,所以你看不到代码
2022年05月17日 23点05分 6
level 10
为啥不做成下载到本地然后数据库只存一个文件位置和下载地址呢
2022年05月18日 00点05分 7
因为这是个csv文件,数据就是别人公司的数据库,不能世界开放给我们,所以就用这种方式同步数据。
2022年05月18日 00点05分
level 6
第一眼我以为你用的vim
2022年05月18日 00点05分 8
level 14
存到mogo里
2022年05月18日 04点05分 9
level 8
没有被虚拟机回收掉么,不手动设置为null,应该也可以回收啊
2022年05月18日 04点05分 11
@ND_Zzx 他可能是循环,读取多个文件,来不及回收就内存溢出了
2022年05月18日 13点05分
level 12
用0拷贝处理吧
2022年05月18日 06点05分 12
这跟零拷贝有关系吗,零拷贝主要是减少cpu介入的吧
2022年05月19日 11点05分
level 7
主要看你流转换的逻辑,你是不是整个文件直接转换的?最好加上缓冲区,重新读过来,要不然文件太大了就容易oom。
2022年05月19日 03点05分 14
level 8
用sparksql
2022年05月20日 01点05分 15
1