2009-12-22 1 views
0

자바 메일 API는 스트리밍을 사용합니까? 이 부분을 확인하려면 소스 코드를 어디에서 얻을 수 있습니까? 또한 raw 및 non-raw 모드를 사용하여 메일을 보내려하고 있습니다. [/ B] 비원 모드out of memory 자바 메일

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

제가 어떤 MIME 유형이있을 수 있으므로 다음 할 필요, 그래서에있다 : 원료 모드 난의 MimeMessage 생성자 입력 스트림을 전달할 수 DataHandlerDataSource을 사용하십시오. DataSource 인터페이스 계약에서 getInputStream()을 호출 할 때마다 신선한 inputStream을 제공한다고 했으므로 큰 크기 나 문서를 위해 OOM을 던질 byte[] 데이터를 유지해야합니다.이를 피할 수있는 방법이 있습니까? 움 관해서는

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))); 
+1

첨부 파일을 메모리에 보관하는 데 문제가있는 경우 이메일 네트워크가 얼마나 잘 처리 할 것이라고 생각하십니까? – skaffman

답변

0

, 일반 메일에 차례로 바이트 배열 10메가바이트 이상 유지되지 않아야하는 10메가바이트보다 크지 않아야한다.

이론적 인 질문입니까? 아니면 실제로 이런 일이 벌어지고있는 것입니까?

위 코드가 다소 정확 해 보이기 때문에 힙 크기를 늘리십시오.

0

본문을 (임시) 파일로 덤프하고 덤프 된 bArr이 범위를 벗어나거나 null로 설정되도록 한 다음 FileDataSource를 사용할 수 있습니까?

1

하나의 메일 만 처리하거나 여러 메일을 처리 (및 캐싱) 한 후 OOM을 얻으면 문제가 발생합니까?

힙 크기를 늘리는 것은 옵션이지만, 다음 OOM에서 다룰 때까지 시간이 길어지면 원시 바이트 배열을 메모리에 유지하는 방법을 고려해야합니다.

ByteArrayDataSource(byte[] bArr, String type) 생성자를 사용하면 이 그대로 DataSource에 저장되기 때문에 전체 바이트 배열을 메모리에 복제 할 수 없습니다. 다른 생성자는 8k 바이트 배열로 시작하고 더 많은 공간이 필요할 때마다 크기를 두 배로 만듭니다. 이렇게하면 많은 메모리를 낭비하고 문제의 원인이 될 수 있습니다. (source)

+0

Ours는이 기능 중 하나를 제공하는 B2B 제품입니다. 그렇습니다. ByteArrayDataSource (byte [] bArr, String type)는 바이트 []의 사본 하나만 보관할 것이지만 클라이언트 메일 크기는 1 기가입니다. 스트리밍을 사용하는 대신 데이터를 메모리에 저장합니다. –

+0

그러나 ByteArrayDataSource는 항상 바이트 배열 데이터를 메모리에 저장하고, 입력 스트림에서 생성 된 경우 데이터의 내부 바이트 배열을 만들고 크기를 조정합니다. 1 GByte 메일? 세상에... –