【问题标题】:Java memory optimization (how to avoid memory-leak - concrete example)Java 内存优化(如何避免内存泄漏 - 具体示例)
【发布时间】:2011-06-17 02:59:54
【问题描述】:

我在我的 Java Web 应用程序中创建了一个 Pdf,并将其作为电子邮件附件发送。 Pdf 创建为 byte[] 数组。将它包装在ByteArrayInputStream 中更好还是我应该将其保留为byte[]

包装它对于内存释放可能更好(阅读this 线程中接受的答案),但缺点是InputStream(如果我是对的)创建数组的副本(阅读here )。

哪个更好地避免内存占用的可能性?

【问题讨论】:

  • “记忆拥抱”——我最喜欢的新短语!
  • 为什么要担心垃圾收集环境中的内存泄漏?除非您知道 JVM 中的某些特定错误会导致发生内存泄漏,但您没有提到过类似的事情。

标签: java memory-management memory-leaks garbage-collection iostream


【解决方案1】:

不,ByteArrayInputStream 包装数组,它不会复制它。来自the documentation(构造函数采用byte[]):

创建一个 ByteArrayInputStream 以便它使用 buf 作为其缓冲区数组。不复制缓冲区数组。 pos初值为0,count初值为buf的长度。

有可能无论使用输入流会复制它,但ByteArrayInputStream 本身不会。

我不相信您真的在担心一个特别重要的问题 - 我认为它实际上根本不会造成内存泄漏,只是使用字节数组。

【讨论】:

  • 我正在阅读一个答案,其中提到使用 byte[] 而不是 InputStream 来将 webapp 从内存中保存下来,我不知道这是否真的是一个问题。
  • @Atticus:如果不理解为什么该答案的作者声称它是“记忆猪”,我当然不会假设这是一个问题。我怀疑这是允许数据流式传输而不是全部复制到内存中 - 但这可能与您的情况相关,也可能不相关。与以往一样,了解其他答案的背景以及该背景是否适用于您也很重要。
猜你喜欢
  • 1970-01-01
  • 2020-05-13
  • 1970-01-01
  • 2018-04-08
  • 2013-06-24
  • 1970-01-01
  • 2015-02-18
相关资源
最近更新 更多