2010-05-27 63 views
4

在Java中沒有序列化總是必須縮小用於容納對象結構的內存嗎?或者是可能是那個序列化會有更高的成本?Java序列化是縮小內存佔用量的工具嗎?

換句話說:序列化是一種縮小Java中對象結構的內存佔用量的工具嗎?


編輯
我完全知道是何意序列化,但我還是謝謝你:-) 但是你要知道,工具可以被濫用。我的問題是,它是否是減少內存使用量的好工具。

那麼原因你能想象,爲什麼內存使用量應該增加/減少?大多數情況下會發生什麼

+0

當你說「收縮」時,你的意思是「增長」/「增加」嗎? – 2010-05-27 08:06:03

+0

無論哪種方式:-)如果內存使用量增加或減少,我還未確定。這就是爲什麼我想讓問題保持開放的原因。 – 2010-05-27 09:02:29

+0

你有沒有考慮過測試? – 2010-05-27 10:00:04

回答

2

我的問題是,無論是減少存儲器利用的好工具。

不,它不是這樣做的一個很好的工具。序列化的對象表示包含很多描述對象類型和表示的'元數據'。除非將大量對象序列化爲一個「流」,否則「元數據」開銷會使序列化表單大於原始表單。忽略這種開銷,序列化的表示通常更加緊湊,但節約將在很大程度上取決於對象的表示類型。 (請看"Object Serialization Stream Protocol"瞭解更多詳細信息。)

而其他答案中提到,在序列化和反序列化時暫時增加內存使用量,因爲您必須同時保存串行和對象表示以及用於處理週期的映射等

如果你想在一個緊湊的形式在內存中表示一個數據結構,你最好開發自己的應用程序特定的序列化方案。但IMO,最好還是將數據寫入文件系統或數據庫。

+0

事實上,可能與這個問題平行的測試似乎揭示出,對象結構必須比某個閾值更大/更復雜。然後減少內存以抵消相對較大的元數據開銷。因此我選擇了這個答案是正確的。謝謝。 – 2010-05-31 07:23:19

6

否...序列化是一種將對象狀態表示形式寫入或讀取爲字節數組的方法。這不是內存表示的替代方法。對象的序列化形式可能消耗或不消耗比JVM內部多的字節;通常情況下它會非常可比。在極少數情況下,它可能更多,並且有時對象的狀態可以完全序列化,其方式消耗的字節數少於堆中的字節數。但是,不回答這個問題,它不是一個「縮小內存佔用的工具」。

0

使用對象序列化,所有(非瞬態)字段和某些其他管理數據的值都寫入緩衝區(流)。通常的意圖是將此緩衝區寫入文件或套接字。序列化的對象不受影響。

所以實際上它是反之亦然:序列化(暫時)增加了內存佔用,因爲對象的序列化表示將駐留在內存中了。

0

序列化不與萎縮的內存佔用,無論如何,它基本上保存對象的狀態,以一個字節序列的過程中,和重建這些字節到現場對象在未來某個時間conserned。 它主要用於存儲對象狀態,以便它們可以超越thr虛擬機的生命週期使用,該對象可以在需要時重新創建和使用。

+0

我認爲關鍵是通過寫入文件系統來縮小內存需求。他並不是說序列化會自動節省內存。 – 2018-03-06 21:05:35

0

我說可能是(如果收縮==增長/增加),因爲序列化過程中保留對象在內存中的表示。

如果你想停止,你需要呼籲的ObjectOutputStream接近或reset

如果您調用新的ObjectOutputStream/close,關閉後內存上沒有足跡。

1

它可以縮小內存佔用的唯一方法是通過序列具有瞬態域的一些對象,傾倒原始對象和反序列化 - 這樣,你在瞬間失去了領域對象。