2015-11-09 120 views
0

我會用Java附帶的文檔發送一封電子郵件。 可悲的是我的JVM服務器堆內存很少,可以同時發送大文件。當我用附件發送電子郵件時,我會減少內存佔用。在JVM中發送帶附件的郵件的最佳策略

我的方法是將文件存儲在臨時位置並將其作爲流發送到smtp服務器,而無需將文件加載到JVM堆中。

哪個實現可以保證我這種方法?

回答

2

當使用JavaMail MimeBodyPart.attachFile方法,或者直接使用FileDataSource,JavaMail的(實際上JAF)的讀出使用一個FileInputStream到8K緩衝器中的文件,然後寫出來的緩衝液,再使用緩衝液來讀取整個文件。它絕對不會將整個文件讀入內存。

+0

謝謝比爾。你會引用一個確認這個8K緩衝區的參考文檔嗎?關於這一點,谷歌並不是我的朋友! –

+0

它只在[DataHandler源代碼](http://hg.openjdk.java.net/jdk8/jdk8/jaxws/file/d03dd22762db/src/share/jaf_classes/javax/activation/DataHandler.java#l302)中。 –

1
  1. 流是最好的方法,當然沒有緩衝。也刪除任何使用字符串保持代碼最C的儘可能。

  2. 限制工作線程的數量。

  3. 您還可以使用更積極的GC配置。

+0

不錯,但是GC選擇對OP來說無濟於事。從https://docs.oracle.com/cd/E13150_01/jrockit_jvm/jrockit/geninfo/diagnos/tune_footprint.html閱讀此內容 - 「*垃圾收集模式或靜態策略的選擇本身並不會顯着影響內存佔用,但選擇正確的垃圾回收策略可能會讓您減少堆大小,而不會導致性能嚴重下降。*「。 – hagrawal

+0

考慮到你想用盡可能小的堆運行,我不會依靠javamail來實現很多你可能不需要的東西。 –