`
xiejin2008
  • 浏览: 123879 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

SmartUpload缺陷:不能上传大文件,占内存耗CPU

阅读更多

最近我们的网站项目,有一段时间,服务器运行到一定的时候时,就会出现cpu占用率非常大,而且内存消耗也非常大.(当然服务器的配置还是比较高的).
    经过很多代码的优化和重构,还是没有解决这个问题.或许没有找到根本原因.
    其中
         1.我们有把单例类重新有换成普通的类.直接new 出一个实例.而不是调用一个静态方法去获得实例.(在网上搜索资料发现,单例模式用的不好的话,确实会有内存泄露的

情况.仔细分析了一下代码,如果很多用户同时并发访问的时候,确实会出现这种内存泄露和数据错误的情况).
          2.有把某些对象(包括String类型引用)在finally置为null的.尽管如此,还是发现内存有缓慢泄露的情况,cpu任然占用很高.
          3.后来我们用Jprofeil工具测试代码(该工具,可以测试具体调用某个方法时候,内存的使用情况和cpu的占用率).结果发现我们网站上传功能出现很大的问题.
          我们使用的上传组件:smartUpload.如果传大一点点的文件(我们网站限制为2M),或者网速不行并且用户多次点击上传按钮的时候,smartUpload组件上传会使得cpu占用率很 高而且消耗内存.

 

 

最终在网上搜索了commons-fileupload和smartUpload区别.及其相应的优点缺点.后来我们改用了commons-fileupload组件.
      并且把上传按钮,再点击之后就让它disabled,以免用户多次点击上传按钮..

服务器运行了一段时间,太神奇了.内存消耗率超级少.

 

真是太高兴啦....

分享到:
评论
10 楼 nbsven 2009-08-02  
我用的是UFOUpload组件(www.gm365.com上发布的),一直没出现过问题。
9 楼 mycybyb 2009-06-09  
使用commons-fileupload的时候,即使你设置最大上传大小为2M。这时候如果上传一个1G的文件,你会发现虽然上传不成功,但是在任务管理器里看网络活动,就会发现还是都上传了。
8 楼 xiejin2008 2009-06-08  
好的.试验一下
7 楼 lancer 2009-06-06  
但从性能考虑 推荐 cos
6 楼 kjj 2009-06-06  
cos 性能可能比commons 还好!!!
5 楼 kimmking 2009-06-06  
smartUpload比较简单,就3-4个类。
原理:
【把post上来的数据全部拿到。
分出request头。拿到分割字符串。
按这个把报文体切割成不同的form field区。
然后拿出来form-field数据,填到自己定义的request的参数map中。
文件数据提出来。】
整个过程在内存操作,文件大了,分割字符串位置计算很慢。再大,挂了。

-------------
apache的fileupload提供了使用临时文件的方式分片处理http报文。
最后再处理完毕后合并成一个大的临时文件。
所以可以处理大文件,没有内存问题。
4 楼 Bernard 2009-06-06  
分析输入流的同时将文件写入临时文件,最后操作临时文件即可。
文本字段还是放在内存里,这样就不需要占用太多的内存。
需要写一个简单的词法分析器和一个可以Pushback的输出流。
参考:http://tools.ietf.org/html/rfc1867
3 楼 willgo 2009-06-06  
恰好最近也遇到这个问题
我刚接触java
调试了一下之后发现,smartuplaod里面(或者是smartfile)有一个写入文件的方法,会先获得要写入文件的总字节,然后
new byte[字节大小]
一旦文件超过40M左右此处就会出现异常
这样来看,smartupload是不能支持大文件上传的

ps:我用的代码是框架里面的,经过其他人修改的。不过我想这个地方应该是smartupload原有的代码。
建议更换其他上传组件
2 楼 xiejin2008 2009-01-07  
是呀.我们用fileupload的时候,设置的缓存是4k,所以上传时候内存最多占用4K.还设置了临时文件存储目录.里面会生成tmp文件.好像有个web 的FTP的上传也蛮好的
1 楼 sdh5724 2009-01-07  
commons-fileupload 我记得会把上传的数据比较的大的时候, 写到文件里去。 所以, 降低了内存需求。 你可以DEBUG看看, 有个FileItem MemoryItem类似的对象。

相关推荐

Global site tag (gtag.js) - Google Analytics