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

ほとんどの場合、ヒープ サイズを増やすことで OutOfMemory エラーを解決できます。ただし、アプリケーションのパフォーマンス分析を行い、メモリ リークがないか、変数やメモリを (再) 使用できるかどうかを確認することをお勧めします。

参照: Java チューニング ホワイト ペーパー

さらに、ここにコードを投稿していただければ、メンバーはコードの設計を改善し、問題があればそれを発見するのに役立ちます。

于 2012-05-04T05:49:55.730 に答える
1

個々の受信者にメールを送信する代わりに、最初にグループを作成する必要があります。取得しているエラーについては、JVM により多くのメモリを割り当てる必要があるようです (ただし、それは要件やプロジェクトなどに完全に依存するため、最適なソリューションにはなりません)。

後の段階で、メモリ関連の問題を防ぐためにコードを最適化することを検討できます。

于 2012-05-04T05:47:13.963 に答える