2014-06-25 87 views
0

我想將pojo對象轉換爲字節數組。我的所有對象都是可序列化的。我用Java將對象轉換爲字節數組的有效方法

ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 

     ObjectOutputStream o = new ObjectOutputStream(byteArrayOutputStream); 
     o.writeObject(myobject); 

     byte [] byteArray=byteArrayOutputStream.toByteArray(); 
     o.flush(); 
     o.close(); 
     byteArrayOutputStream.flush(); 
     byteArrayOutputStream.close(); 

當對象被轉換成字節數組具有許多線程,這種轉換需要時間越來越每次轉換的時間量(相同的對象成字節數組)被逐漸增加。 (例如,第一個線程轉換需要200ms,第二個線程轉換爲同一個對象需要300ms)。任何人都可以讓我知道爲什麼這個對象轉換時間逐漸增加並且是一種更好的轉換方式。 (我發現了一種使用Externalization的方法,但後來我的所有對象都必須用Externalizable來重寫。)

+0

配置文件管理器在您的應用程序配置文件中說什麼?性能瓶頸在哪裏? –

+0

我不使用精確的分析器。但是當我計算每次轉換的頂部和底部的時間間隔(long beginig = System.currentTimeMillis(),long endTime = System.currentTimeMillis(),gap = endTime-beginig),並將間隙打印到控制檯,時間間隔正在增加。 –

+1

您正在早點調用'toByteArray()'。刪除最後兩行,'o.flush()'。你可以做'新的ByteArrayOutputStream(SIZE)'。 –

回答

1

任何人都可以讓我知道爲什麼這個對象轉換時間逐漸增加,並有更好的轉換方式。

ObjectOutputStream創建了很多垃圾,這會對L3緩存,主內存總線和GC造成壓力。這些是共享資源,即一個線程的工作影響所有其他線程。

注意:無論您的套接字上有1個核心還是12個核心,這都會成爲問題。

我找到了一種使用外部化的方法。

這可能是最簡單的解決辦法,如果你想避免使用其他序列化liibrary如KRYO,節儉,protobuf的等我有一個,我算得上是最快的,但它是不明確的簡單。例如它將直接從/轉換爲本地內存,並完全跳過字節[];)

但是然後我的所有對象都必須用Externalizable重寫。

您可以從一個類開始,即添加最高負載的類,不需要全部完成。

相關問題