Javamail フォーラムでこのリファレンスを見つけました Javamail
にメッセージ キャッシュを強制的にクリアする方法は?
そして、少し掘り下げました。「キャッシュ」を削除または縮小する方法は見つかりませんでしたが、そのキャッシュの最大の部分はメッセージのヘッダーであることがわかりました。IMAPMessage 内にはヘッダーのコピーが 2 つあります。1 つは IMAPMessage 内にあり、もう 1 つは 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);
}
}
それほどきれいではありませんが、1 つのフォルダーのメモリ使用量が 40MB から 20MB に減少します。これを行う他の方法があるかどうかを確認します。理想的には、オーバーライドされた独自の IMAPMessage クラスを作成すると思いますが、それを組み込むのは非常に難しいようです。