Недостаточно памяти при использовании почты Java

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

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

В не-сыром режиме я должен сделать следующее, так как может быть любой тип пантомимы, поэтому я должен использовать 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 ответа

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

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

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

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

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

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

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

Другие вопросы по тегам