1

我在向大量收件人发送电子邮件时收到 java.lang.OutOfMemoryError: Java heap space。我尝试让 150 个收件人正常工作,但 200 个收件人不工作。

    public static void sendMessage(String subject, String text, String sender, String to, String cc, byte[] data, String type) throws Exception {
        try {
            String EmailServer = "";
            String EmailPort = "";
            Properties props = new Properties();
            ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
            InputStream in = in = classLoader.getResourceAsStream("/resources/config.properties");

            props.load(in);
            if (in != null)
                in.close();

            EmailServer = props.getProperty("SMTP_SERVER");

            System.out.println("EmailServer================:" + EmailServer);

            Properties prop = new Properties();
            System.out.println("Properties================:" + prop);
            prop.put("mail.smtp.host", EmailServer);
            // set the port
            //prop.put("mail.smtp.port", EmailPort);
            Session session = Session.getInstance(prop, null);

            Message msg = new MimeMessage(session);
            msg.setSubject(subject);
            msg.setReplyTo(InternetAddress.parse(sender));
            msg.setFrom(new InternetAddress(sender));
            msg.addRecipients(Message.RecipientType.TO, InternetAddress.parse(
                    to, false));
            msg.addRecipients(Message.RecipientType.CC, InternetAddress.parse(
                    cc, false));
            msg.setContent(text, "text/plain");
            msg.setSentDate(new Date());
            System.out.println("Before Transport.send================:" + new Date());
            Transport.send(msg);
            System.out.println("After Transport.send================:" + new Date());
        } catch (javax.mail.SendFailedException e) {

            e.printStackTrace(System.out);
            String invalid = "";
            Address[] address = e.getInvalidAddresses();
            for (int i = 0; i & lt; address.length ;
            i++)
            {
                if (i == 0)
                    invalid = invalid + address[i];
                else
                    invalid = invalid + "," + address[i];
            }
            throw new InvalidEmailAddressException(e.getMessage() + ":" + invalid);
        } catch (javax.mail.MessagingException e) {

            e.printStackTrace(System.out);
            throw new Exception(e.getMessage());
        }
    }
4

4 回答 4

2

你增加堆大小使用 -

java -Xms64m -Xmx256m HelloWorld

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

更多帮助

于 2012-05-04T05:48:24.697 回答
1

您应该先为他们创建一个组,而不是向单个收件人发送邮件。关于您遇到的错误,您似乎应该为 JVM 分配更多内存(但这完全取决于您的要求、项目等,因此不是最佳解决方案)。

在后期阶段,您可以考虑优化代码以防止与内存相关的问题。

于 2012-05-04T05:47:13.963 回答
1

大多数情况下,OutOfMemory 错误可以通过增加堆大小来解决。但我建议您对应用程序进行性能分析,检查是否存在内存泄漏,或者是否可以(重新)使用某些变量或内存。

请参阅:Java 调优白皮书

此外,如果您可以在此处发布代码,会员可以帮助您改进代码设计并可能发现问题(如果有)。

于 2012-05-04T05:49:55.730 回答
0

为时已晚,尽管我回答了这个问题,因为我遇到了与您相同的问题。

我无法更改堆大小,因为它是客户端的服务器,因此不允许我更改设置。

相反,我使用了一个技巧。建议我有一千个收件人。我可以发送 10 次电子邮件,而不是一次向 1000 个收件人发送电子邮件——每次我向 100 个收件人发送电子邮件。

for(int idx = 0; idx < emailList.size() ;  idx++){
    msg.addRecipient(Message.RecipientType.TO, new InternetAddress(emailList.get(idx))); //set recipient
    if(( idx != 0 && idx % 100 == 0) || idx == emailList.size() - 1) {
        /* this works when the remainder of idx is 0(when idx is multiple of 100)
            or when idx is the largest one in this loop*/
        Transport.send(msg); //send emails
        msg.setRecipients(Message.RecipientType.TO, new Address[]{}); //clear recipients so that the recipients set in message object changes to 0
    }
}

我希望这个答案可能对遇到此类问题的任何人有所帮助。

于 2021-11-26T04:57:48.793 回答