簡體   English   中英

在類中使用裝飾的OutputStream / InputStream字段

[英]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類使用所有這些不同的裝飾器,但我想了解為什么會發生這些內存不足錯誤?

  • 多次裝飾IO流有什么根本性的錯誤嗎?
  • 在實際使用它之前按需裝飾流是否更好,然后讓垃圾收集器在不再需要它時處理它?
  • 作為上述問題的擴展,在一切工作沒有內存錯誤之前,我實際存儲的唯一對象是OOS。 然而,現在,內存錯誤與OOS有關。 DOS或OS的創建是否導致垃圾收集器無法正常運行?

將相同的InputStream包裝在兩個獨立的包裝器中是一種不受支持的習慣用法。 第一個包裝器可能會立即讀取一些輸入以填充其緩沖區; 第二個可能會嘗試做同樣的事情。 每個包裝器都是免費的(甚至鼓勵),以便它可以自行決定是否可以完全讀出其底層流。

所以,簡而言之,

多次裝飾IO流有什么根本性的錯誤嗎?

就在這里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM