Javamail读取邮件列表出现OutOfMemery

本文介绍了使用JavaMail解析带有大型附件的邮件时遇到的内存溢出问题,并提供了一个有效的解决方案,即通过调用((POP3Message)message).invalidate(true)来释放已解析邮件占用的缓存空间。

用Javamail解析多个邮件的时候,如果个别邮件的附件过大,就会造成OutOfMemery的情况,如下

 

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Arrays.java:2786)
	at java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.java:71)
	at com.sun.mail.pop3.Protocol.multilineCommand(Protocol.java:362)
	at com.sun.mail.pop3.Protocol.retr(Protocol.java:237)
	at com.sun.mail.pop3.POP3Message.getContentStream(POP3Message.java:115)
	at javax.mail.internet.MimePartDataSource.getInputStream(MimePartDataSource.java:60)
	at javax.mail.internet.MimeMultipart.parse(MimeMultipart.java:259)
	at javax.mail.internet.MimeMultipart.getCount(MimeMultipart.java:159)
	at com.gdcn.mail.util.Pop3Util.hasAttachment(Pop3Util.java:1148)
	at com.gdcn.mail.util.Pop3Util.analysisMessage(Pop3Util.java:774)
	at com.gdcn.mail.util.Pop3Util.getMessages(Pop3Util.java:561)
	at com.gdcn.mail.util.Pop3Util.main(Pop3Util.java:1338)
 

原因是JavaMail会将这些Messages读入内存,由于这些邮件包含了附件等等,所以会造成这样的结果。

 

网上很多都说增加JVM或者Tomcat等的内存,但是这样仍然不能达到预期的效果。或来查阅了相关的文档和网上的结果,发现了解决这个问题的方法,我们只需要在解析完邮件之后增加这句

 

((POP3Message) message).invalidate(true);

 

sun有这样的解析

http://java.sun.com/products/javamail/javadocs/com/sun/mail/pop3/POP3Message.html

invalidate

public void invalidate
(boolean invalidateHeaders)
Invalidate the cache of content for this message object, causing it to be fetched again from the server the next time it is needed. If invalidateHeaders is true, invalidate the headers as well.

 

Parameters:
invalidateHeaders - invalidate the headers as well?

 

这样就很好地将原来读取的message从cache里面擦除了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值