簡體   English   中英

netty文件上載內存不足錯誤

[英]netty file upload out of memory error

我正在使用netty 3.5.0,並且已經實現了上載示例HttpUploadServerHttpUploadServerHandlerHttpUploaderServerPipeLineFactory

HttpUploadServerHandler ,有一些注釋掉的行

// fileUpload.isInMemory();// tells if the file is in Memory
// or on File
// fileUpload.renameTo(dest); // enable to move into another
// File dest
// decoder.removeFileUploadFromClean(fileUpload); //remove
// the File of to delete file

當我在這些行中添加注釋時,特別是renameTo(dest) ,我發現它在大文件傳輸時間歇性失敗,並出現內存不足錯誤。

撇開: removeFileUploadFromClean似乎無法解決

誰能告訴我怎么回事或如何解決?

我希望能夠傳輸大文件,然后將它們從臨時位置移動到其最終目的地。 當您不使用renameTo ,到臨時位置的傳輸似乎非常好,但是我認為由於清理,文件很快就被刪除了。

HttpUploadServerHandler::messageReceived
HttpUploadServerHandler::messageReceived
HttpUploadServerHandler::messageReceived
HttpUploadServerHandler::messageReceived
renaming fileoxygen.exe
fileUpload.getFilename() oxygen.exe
fileUpload.getName() myfile
java.io.IOException: Map failed
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:748)
at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:437)
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:510)
at org.jboss.netty.handler.codec.http.multipart.AbstractDiskHttpData.renameTo(AbstractDiskHttpData.java:292)
at org.jboss.netty.handler.codec.http.multipart.MixedFileUpload.renameTo(MixedFileUpload.java:117)
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.writeHttpData(HttpUploadServerHandler.java:317)
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.readHttpDataChunkByChunk(HttpUploadServerHandler.java:253)
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.messageReceived(HttpUploadServerHandler.java:208)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.handler.codec.http.HttpContentEncoder.messageReceived(HttpContentEncoder.java:67)
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:95)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:359)
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:568)
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:437)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:558)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102)
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.OutOfMemoryError: Map failed
at sun.nio.ch.FileChannelImpl.map0(Native Method)
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:745)
renamed file to c:\temp\oxygen.exe
HttpUploadServerHandler::messageReceived
renaming fileoxygen.exe
fileUpload.getFilename() oxygen.exe
fileUpload.getName() myfile
... 32 more
java.io.IOException: Map failed
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:748)
at sun.nio.ch.FileChannelImpl.transferToTrustedChannel(FileChannelImpl.java:437)
at sun.nio.ch.FileChannelImpl.transferTo(FileChannelImpl.java:510)
at org.jboss.netty.handler.codec.http.multipart.AbstractDiskHttpData.renameTo(AbstractDiskHttpData.java:292)
at org.jboss.netty.handler.codec.http.multipart.MixedFileUpload.renameTo(MixedFileUpload.java:117)
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.writeHttpData(HttpUploadServerHandler.java:317)
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.readHttpDataAllReceive(HttpUploadServerHandler.java:236)
at com.vayyoo.vaf.nettyapp.upload.HttpUploadServerHandler.messageReceived(HttpUploadServerHandler.java:211)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.handler.codec.http.HttpContentEncoder.messageReceived(HttpContentEncoder.java:67)
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:95)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:791)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:296)
at org.jboss.netty.handler.codec.frame.FrameDecoder.unfoldAndFireMessageReceived(FrameDecoder.java:359)
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.callDecode(ReplayingDecoder.java:568)
at org.jboss.netty.handler.codec.replay.ReplayingDecoder.messageReceived(ReplayingDecoder.java:437)
at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:563)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:558)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255)
at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:91)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:373)
at org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:247)
at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:35)
at org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:102)
at org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:42)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.OutOfMemoryError: Map failed
at sun.nio.ch.FileChannelImpl.map0(Native Method)
at sun.nio.ch.FileChannelImpl.map(FileChannelImpl.java:745)
... 32 more
renamed file to c:\temp\oxygen.exe
HttpUploadServerHandler::messageReceived

在我看來, renameTo()的目的地與臨時文件不屬於同一文件系統。 因此,嘗試移動文件失敗, renameTo()將文件復制到目標位置並刪除了臨時文件。 但是,似乎renameTo()以一種奇怪的方式實現了文件復制操作。 (即錯誤)。 在修復該錯誤之前,您可以:

  1. 指定與臨時文件目錄屬於同一分區的目標,或者
  2. 獲取臨時文件的路徑並自己執行復制操作。

您可以在這里跟蹤此問題: https : //github.com/netty/netty/issues/398

您提出的問題將在3.5.1.Final版本中修復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM