Ich habe diesen Hinweis im Javamail Forum gefunden Wie kann ich Javamail zwingen, seinen Nachrichten-Cache zu löschen?
Und dann habe ich ein bisschen gegraben. Ich habe zwar keine Möglichkeit gefunden, den "Cache" zu entfernen oder zu verkleinern, aber ich habe herausgefunden, dass der größte Teil des Cache die Kopfzeilen der Nachrichten sind. Es gibt zwei Kopien der Kopfzeilen in IMAPMessage, eine, die es hat, und eine in MIMEMessage, die es auffüllt. Die Schwierigkeit besteht nun darin, diese Informationen zu löschen, da Sie nur Zugriff auf die Informationen in IMAPMessage haben. Die Kopfzeilen in MIMEMessage können nicht gelöscht werden. Außerdem können sie nicht entfernt werden. Hier ist der Code von 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
}
}
}
Unabhängig davon war ich in der Lage, den vom MessageCache gespeicherten Speicher drastisch zu verringern, indem ich alle diese Werte löschte.
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);
}
}
Das ist zwar nicht das Schönste, aber es verringert den Speicherbedarf eines Ordners von 40 MB auf 20 MB. Ich werde sehen, ob es noch andere Möglichkeiten gibt, dies zu tun. Idealerweise denke ich, dass ich meine eigene überschriebene IMAPMessage-Klasse erstellen würde, aber das scheint sehr schwierig, in zu loten.