工作经验总结

2023-01-13  本文已影响0人  洪兴掌管一代

文件上传

1.编写上传大文件的功能时, 不要将文件内容或者部分内容读到内存中,比如将流读入字节数组或字符串。应该直接作为请求参数。比如通过aws s3的presign url上传文件。

2.map用完了 及时清理,否则累积造成OOM。

3.大文件multipart上传时遇到问题(工作中目前最大挑战,上传超大文件)

一些part在上传时会抛异常“ java.net.SocketException: Broken pipe (Write failed)“,在重试几次后会成功。

根本原因:写代码粗心,给每一个线程创建了一个独有的线程池,导致有几个线程就需要有几个线程池(太蠢了)。我想,应该是jvm发现有很多持续活跃一定时间(因为part小、也就是线程很快会执行完时不会出错),并且又利用率不高的线程池时,会进行回收,然后导致线程没执行完成就被停掉。

我最初怀疑是part对象太多,触发了jvm垃圾回收。但是当part的大小很小(6MB)的时候,即使线程池很多也不会有问题。而part大时(128MB),我检测了GC,发现并没有full GC,所以应该对象会被放在老年代,不会被回收掉。但线程池却像是被回收了。不清楚JVM GC对于线程池的回收算法是否有特别之处。

4.方法的任何入参都应该是immutable的, 即都不应该在方法体内被修改。这是代码逻辑的设计原则

上一篇 下一篇

猜你喜欢

热点阅读