Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何发送带有大附件的电子邮件?(OutOfMemoryError:java堆空间)_Java_Jakarta Mail_Attachment_Out Of Memory_Large File Upload - Fatal编程技术网

如何发送带有大附件的电子邮件?(OutOfMemoryError:java堆空间)

如何发送带有大附件的电子邮件?(OutOfMemoryError:java堆空间),java,jakarta-mail,attachment,out-of-memory,large-file-upload,Java,Jakarta Mail,Attachment,Out Of Memory,Large File Upload,当我试图附加一个大附件时,我遇到了一个OutOfMemoryError:Java堆空间。当发送带有一些大文件(比如50万)的电子邮件时,将抛出错误。 代码如下所示: //add attaches if (vo.getAttaches() != null) { InputStream iStream = null; ByteArrayDataSource bdSource = null; String filename = null; for (int i = 0

当我试图附加一个大附件时,我遇到了一个
OutOfMemoryError:Java堆空间。当发送带有一些大文件(比如50万)的电子邮件时,将抛出错误。

代码如下所示:

//add attaches
if (vo.getAttaches() != null) {
    InputStream iStream = null;
    ByteArrayDataSource bdSource = null;
    String filename = null;

    for (int i = 0; i < vo.getAttaches().length; i++) {
         iStream = new FileInputStream(vo.getAttaches()[i]);
         bdSource = new ByteArrayDataSource(iStream, null);
         filename = vo.getAttachesFileName()[i];
         email.attach(bdSource, MimeUtility.encodeText(filename), filename);
    }
}

问题是,在编写消息时,您试图将整个文件存储在内存中,这实际上不是必需的。如果您要附加真实的文件,那么最好使用
javax.activation.FileDataSource
而不是
javax.mail.util.ByteArrayDataSource
(两者都实现
数据源
接口)因为这样可以使数据流化,而不是保存在内存中。

对于您的更新:这似乎是JamesSpoolManager的一个旧的(?)变体,当转换为中的“邮件格式(ascii)”时,该问题似乎已解决


ByteArrayDataSource
将从提供的输入流中读取完整输入,请参阅javadoc:

使用指定的InputStream中的数据和指定的MIME类型创建ByteArrayDataSource输入流被完全读取,数据存储在字节数组中。

因此,如果要读取的文件“大于”堆大小(JVM限制),它将抛出
OutOfMemoryException


因此,要回答您的问题,您(至少)有两个选择:

  • 像这样使用
    FileDataSource
  • 给你的程序更多的内存(在这种情况下可能不是一个好的解决方案.)

  • 我也面临同样的问题。但是,在同时发送多封电子邮件时。 这会导致日志中出现两个错误

    1. OutOfMemoryError: Java Heap Space
    重新启动服务器后,错误消失,邮件发送接收正在工作

    考虑将JVM堆空间增加到256MB,这可能还不够,因为您正试图上载大文件。谢谢您的好意。我使用FileDataSource而不是ByteArrayDataSource,在我的send()函数中似乎没有异常。但我仍然无法发送带有大附件的电子邮件。apache james在java.io.ByteArrayOutputStream.ToByteArrayoutPutStream(ByteArrayOutputStream.java:133)的java.util.Arrays.copyOf(Arrays.java:2786)处得到了这个错误:java.lang.OutOfMemoryError:java堆空间……听起来邮件服务器也被一个大附件阻塞了。这不是客户端代码的错误,而是ApacheJames中的错误。提交错误报告。谢谢。我想也许我可以单独存储这个大文件。我将尝试将其存储到一个“LargeAttach”表中,该表中有一个blob,并将一个链接字符串存储到James中。也许这样可以避免错误。谢谢。FileDataSource可以很好地工作。但是ApacheJames抛出了一个例外。我将尝试用blob将大文件保存到单独的表中,而不是存储到电子邮件中。但是在这种情况下,接收者应该链接到我的站点以查看attach.Cleb,即使我也不确定,为什么会这样?我面临着这个问题,因为我每分钟的邮件数超过了500封/分钟。因此,我增加了堆大小 1. OutOfMemoryError: Java Heap Space 2. Maximum number of connections exceeded
    #wrapper.java.initmemory=16
     wrapper.java.initmemory=32
    
    #wrapper.java.maxmemory=64
    wrapper.java.maxmemory=128