如果我從SOAP響應接收到的內存中已經有一個大的字節數組。write(byte [] b)大字節數組的優化用法
我必須將這個字節數組寫入OutputStream。
這是OK只是用寫:
byte [] largeByteArray=...;
outputstream.write(largeByteArray);
...
outputstream.flush();
...
或者是更好的分裂在小塊和編寫的OutputStream中的ByteArray?
如果我從SOAP響應接收到的內存中已經有一個大的字節數組。write(byte [] b)大字節數組的優化用法
我必須將這個字節數組寫入OutputStream。
這是OK只是用寫:
byte [] largeByteArray=...;
outputstream.write(largeByteArray);
...
outputstream.flush();
...
或者是更好的分裂在小塊和編寫的OutputStream中的ByteArray?
如果你已經了大陣,那麼就寫出來 - 如果輸出流實現選擇塊吧,它可以作出這樣的決定。我看不出有什麼好處 - 如果它能夠處理大塊的話,它可能會使的效率降低。
你使用什麼類型的輸出流? 有輸出流可以寫入數據塊。 一般而言,我相信如果您爲每個單字節發出I/O操作(寫入),性能可能會很差,因爲I/O操作很昂貴。
如果你想讓這個效率更高,我會在你得到它的時候寫數據,而不是建立一個大的字節[](並且等到結束纔開始寫入)。如果這是一個選項,它可以更快,更高效。但是,如果這不是一個選項,請使用一個大的寫入。
如果largeByteArray
是一些真正的大,寫作業成本時間長了,內存是一個相當大的條件:
斯普利特陣列的部分,寫後的一個部分,設置部分= null,則此釋放該部分的引用,將盡快使JVM/GC成爲其中的一部分。
通過拆分和釋放,您可以在發生OOM-ERROR之前同時執行更多寫入(largeByteArray)作業。在拆分階段,JVM需要雙重陣列化內存才能這樣做,但在拆分之後,原始陣列最終會得到GC'd,您將重新使用與之前相同的內存量。
示例:服務器有1GB內存。它可以運行最多100個線程,每個線程同時持有和發送10MB數據給客戶端。
如果使用大10MB的數組,內存使用總是1GB,即使所有線程都有1MB數據也不會發送備件。
我的解決方案是將10MB分割爲10 * 1MB。發送一些MB部分後,發送的部分可能會得到JVM/GC,並且每個線程在整個生命週期內的平均內存消耗較少。所以服務器可能會運行更多的任務
使JVM gc - 不是靠我自己......我如何解引用數組的一部分?不確定是否在較小的陣列中進行高效複製......等等...... – Cris
爲什麼?他已經有了大型陣列,爲什麼使用更多*內存創建小型副本?他如何'釋放陣列早期部分的參考'? – EJP
是的,將數組拆分爲數組。設置原始數組= null讓jvm完成它。然後寫一個,寫完一個後,設置data(i)= null;在對數據(i)進行低級流完成io操作之後,jvm現在可以釋放數據(i)數組。如果將數據保存在一個大數組中,arrrrrrrrrrrrrrrrrrrrrrrray只能在所有io完成後才能釋放。當許多工作在同一時間時,可能會發生。這是權衡,CPU的內存。我只是說,如果largeByteArray是一個非常大的東西,並且寫作業需要很長時間,而且內存是一個相當重要的條件。 – swanliu
我能想到沒有可以想象的理由,它會更好,沒有得到真正的離奇和荒謬。一般來說,如果您可以在不需要額外努力的情況下以較大的塊傳遞數據,那麼您應該這樣做。通常,這樣做甚至需要額外的努力才能做到這一點,那麼爲什麼你想要付出額外的努力來做更多的工作?
我會做同樣的...但該字節數組進來的肥皂響應的有效載荷,這是不流...我剛剛收到它..我必須像這樣使用它... – Cris