не хватает памяти с помощью Java-почты - PullRequest
0 голосов
/ 22 декабря 2009

API Java использует потоковую передачу? Где я могу получить исходный код, чтобы подтвердить это. Также я пытаюсь отправить письмо, используя сырой и не сырой режим. в необработанном режиме я могу передать входной поток в конструктор MimeMessage: [/ b]

new MimeMessage(session, doc.getBodyInputStream());

В режиме Non-raw я должен сделать следующее Так как может быть любой тип пантомимы, поэтому я должен использовать DataHandler и DataSource. Поскольку интерфейсный контракт DataSource говорит о предоставлении нового inputStream каждый раз, когда мы вызываем getInputStream(), нам нужно хранить данные в byte[], который будет генерировать OOM для большого размера или документов. Есть ли способ избежать этого? *

MimeMessage msg = new MimeMessage(session);
byte[] bArr = doc.getBody();
ByteArrayInputStream ins = new ByteArrayInputStream(
    bArr != null && bArr.length > 0 ?  bArr : "".getBytes());
msg.setDataHandler(new DataHandler( new ByteArrayDataSource(ins, mimeType)));

Ответы [ 3 ]

1 голос
/ 22 декабря 2009

Возникает ли проблема, если вы просто обрабатываете одну почту или получаете OOM после обработки (и кэширования!) Нескольких писем?

Опция увеличения размера кучи - это вариант, но если он просто увеличивает время, пока вы не пострадаете от следующего OOM, вы подумаете об альтернативах хранению необработанных байтовых массивов в памяти.

И вы должны использовать конструктор ByteArrayDataSource(byte[] bArr, String type), это предотвращает дублирование полного байтового массива в памяти, поскольку bArr просто хранится в источнике данных как есть. Другой конструктор начинается с 8-байтового массива и удваивает его размер каждый раз, когда требуется больше места - это тратит много памяти и может стать причиной вашей проблемы. ( источник )

0 голосов
/ 22 декабря 2009

Можно ли выгрузить тело во (временный) файл, позволить выгруженному bArr выйти из области видимости (или установить значение null) и затем использовать FileDataSource?

0 голосов
/ 22 декабря 2009

Что касается OOM, в общем случае ваша почта не должна превышать 10 МБ, что, в свою очередь, не должно превышать 10 МБ в массиве байтов.

Это теоретический вопрос? Или вы на самом деле видите, как это происходит?

Если вы видите, что это происходит, увеличьте размер кучи, поскольку приведенный выше код выглядит более или менее правильным.

...