我发现了JavaMail论坛 How to force Javamail to clear its message cache?
这个参考
然后做了一些挖掘。虽然我还没有找到一种方法来删除或缩小“缓存”,但我发现缓存的最大部分是消息的标题。 IMAPMessage中有两个头部副本,一个是它的内部MIMEMessage,另一个是MIMEMessage。现在,当您想清除这些信息时会遇到麻烦,因为它们只允许您访问清除IMAPMessage中的信息。 MIMEMessage中的标题不能被清除。此外,他们不能被删除。下面是从InternetHeaders.remove(string)的代码
/**
* Remove all header entries that match the given name
* @param name header name
*/
public void removeHeader(String name) {
for (int i = 0; i < headers.size(); i++) {
InternetHeader h = (InternetHeader)headers.get(i);
if (name.equalsIgnoreCase(h.getName())) {
h.line = null;
//headers.remove(i);
//i--; // have to look at i again
}
}
}
无论如何,我能戏剧性地进入和归零了所有这些值来降低由MessageCache存储内存。
Field headerField = MimeMessage.class.getDeclaredField("headers");
headerField.setAccessible(true);
InternetHeaders headers = (InternetHeaders) headerField.get(imapMessage);
if (headers != null) {
Enumeration<?> allHeaders = headers.getAllHeaders();
ArrayList<String> headerNames = new ArrayList<String>();
while (allHeaders.hasMoreElements()) {
Header header = (Header) allHeaders.nextElement();
headerNames.add(header.getName());
}
for (String headerName : headerNames) {
headers.setHeader(headerName, null);
}
}
不是最漂亮的,但它将一个文件夹的内存占用从40MB减少到20MB。我会看看是否有其他方法可以做到这一点。理想情况下,我认为我会创建自己的重写IMAPMessage类,但这似乎很难进入。
这不是清除/清空Javamail缓存的答案。 – GreenKiwi 2012-02-08 21:11:30