[英]Using decorated OutputStream/InputStream fields in your class
這個問題起初可能看起來有點微不足道,但是自從我開始實現這個問題以來,我遇到了奇怪的OutOfMemory問題。 查看Java Heap Dumps后,我知道內存泄漏與ObjectOutputStream變量有關。 不用多說,這里是代碼:
在我的構造函數中,我正在設置將保存輸入/輸出流變量的字段變量。 與此同時,我正在創建另外兩組變量,以便我在自定義對象和純基元上專門執行IO時:
public SingleServer(Socket s, int maxThreads) {
client = s;
serversCreated.incrementAndGet();
try {
is = client.getInputStream();
os = client.getOutputStream();
ois = new ObjectInputStream(is);
oos = new ObjectOutputStream(os);
dis = new DataInputStream(is);
dos = new DataOutputStream(os);
} catch (Exception e) {
// ...
}
print("Client Connected");
}
現在,之前,所有存在OOS,即對象輸出流。 那么,你可能會問為什么我要經歷創建這些字段的麻煩? 答案是我想將基元的發送與發送自定義對象與發送純字節分開。 我認為Java可以像這樣分離出來。
我注意到的是突然而且難以預測的一些對象現在導致OutOfMemory錯誤導致我的程序崩潰。 我知道我可以忘記為IO類使用所有這些不同的裝飾器,但我想了解為什么會發生這些內存不足錯誤?
將相同的InputStream
包裝在兩個獨立的包裝器中是一種不受支持的習慣用法。 第一個包裝器可能會立即讀取一些輸入以填充其緩沖區; 第二個可能會嘗試做同樣的事情。 每個包裝器都是免費的(甚至鼓勵),以便它可以自行決定是否可以完全讀出其底層流。
所以,簡而言之,
多次裝飾IO流有什么根本性的錯誤嗎?
就在這里。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.