我有一个包含数百万条消息的大邮箱。我只想学习每一个消息,无论它是否有附件。 (不感兴趣的大小,名称,附件数量,只有真假就足够了)。当我使用此代码并使用分析器工具进行监视时,我看到message.getContent()消耗内存并且不会清除它。因为处理数百万条消息,会发生内存不足问题。原因是,getContent()methot会缓存一些数据并保留它。
在不调用 getContent 的情况下,此代码的替代方法是什么? 或者我如何强制清除getContent设置的缓存? 如何为这种情况应用 message.writeTo()?
//processing million message instances in a loop i=1, 1000000
Multipart multiPart = (Multipart) message[i].getContent();
for (int i = 0; i < multiPart.getCount(); i++) {
MimeBodyPart part = (MimeBodyPart) multiPart.getBodyPart(i);
if (Part.ATTACHMENT.equalsIgnoreCase(part.getDisposition())) {
// yes, it has an attachment
return true;
}
}
return false;
答案 0 :(得分:0)
这是一个经典的java问题。一般模式是
while(true) {
Something foo = new Something();
processSomehow(foo);
someCollection.add(foo);
}
// at this point, all of the created objects remain reachable
每个foo在离开循环后都不会被使用,但它们都可以访问,因此JVM会变得非常大。经典的解决方案不是保留对您不需要的东西的引用。在您的情况下,message
数组保持可达。