gpt4 book ai didi

java - 如何强制 Javamail 清除其邮件缓存?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:42:31 24 4
gpt4 key购买 nike

我正在运行一个使用 Javamail 的服务器。它有一个带有 IMAP IDLE 的计数监听器,这样当收到新邮件时,就会执行特定的代码段。新消息列表作为参数提供给我的听众。我读了它的信息并完成了它。一切都很好,除了我的服务器泄漏了很多内存!!我做了堆转储,发现类 [Lcom.sun.mail.imap.IMAPMessage 正在使用大量内存。对象 com.sun.mail.imap.MessageCache 似乎引用了一个 IMAPMessage 数组。

是否有一些缓存正在进行?我不需要再次访问这些消息,除非是第一次进入。我如何强制清除缓存?我怎样才能阻止 javamail 泄漏?

最佳答案

我在 Javamail 论坛中找到了这个引用 How to force Javamail to clear its message cache?

然后做了一些挖掘。虽然我还没有找到删除或缩小“缓存”的方法,但我发现该缓存的最大部分是消息的 header 。 IMAPMessage 中有两个 header 副本,一个是它拥有的,另一个是它填充的 MIMEMessage 中的。现在,当您想要清除此信息时,麻烦就来了,因为它们只允许您访问清除 IMAPMessage 中的信息。无法清除 MIMEMessage 中的 header 。此外,它们不能被删除。这是来自 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 类,但这似乎很难深入研究。

关于java - 如何强制 Javamail 清除其邮件缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1466720/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com