java.lang.OutOfMemoryError:向大量收件人发送电子邮件时的Java堆空间

时间:2012-05-04 05:42:03

标签: java smtp

我收到java.lang.OutOfMemoryError:向大量收件人发送电子邮件时的Java堆空间。 我尝试了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());
        }
    }

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

使用 -

增加堆大小
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

more help

答案 2 :(得分:1)

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

请参阅:Java Tuning White Paper

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