我發現了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