gpt4 book ai didi

java - 在类中使用修饰的 OutputStream/InputStream 字段

转载 作者:行者123 更新时间:2023-12-02 06:47:39 26 4
gpt4 key购买 nike

这个问题一开始可能看起来有点微不足道,但自从我开始实现这个问题以来,我遇到了奇怪的 OutOfMemory 问题。查看Java堆转储后,我知道内存泄漏与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 可以像这样将事物分开。

我注意到,突然且难以预测的某些对象现在会导致内存不足错误,从而导致我的程序崩溃。我知道我可以忘记为 IO 类使用所有这些不同的装饰器,但我想了解为什么会发生这些内存不足错误?

  • 多次修饰 IO 流是否存在根本性错误?
  • 在实际使用流之前按需装饰流,然后在不再需要时让垃圾收集器处理它,这样更好吗?
  • 作为上述问题的扩展,在一切正常且没有内存错误的情况下,我实际存储的唯一对象是 OOS。然而现在,内存错误与 OOS 有关。 DOS或OS的创建是否会导致垃圾收集器无法正常运行?

最佳答案

将相同的InputStream 包装在两个独立的包装器中是不受支持的习惯用法。第一个包装器可能会立即读取一些输入来填充其缓冲区;第二个可能会尝试做同样的事情。每个包装器都可以自由(甚至鼓励)假设它可以自行决定完全读出其底层流。

所以,简而言之,

Is there something fundamentally wrong with decorating your IO stream multiple times?

是的,有。

关于java - 在类中使用修饰的 OutputStream/InputStream 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18449306/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com