簡體   English   中英

BufferedImage泄漏-有其他選擇嗎?

[英]BufferedImage leaks - are there any alternatives?

我在BufferedImage上遇到了奇怪的問題,在某些情況下,它占用了所有可用的系統內存(3 GB,1.5 GB可用空間)。

我創建了一個簡單的包裝器,並按如下方式使用它:

public ImageWrapper(final byte[] bytes) throws ImageWrapperException {
    this(new ByteArrayInputStream(bytes));
}



public ImageWrapper(final ByteArrayInputStream bis) throws ImageWrapperException {
    try {
        image = ImageIO.read(bis);
        bis.close();
    } catch (IOException e) {
        throw new ImageWrapperException(e);
    }
}

(我已經讓jsut驗證了即使在image = ImageIO.read(file);情況下也會發生)

在第一個“無法分配內存”之前,我沒有任何異常。

由於某種原因,當讀取特定類型的圖像時,圖像的讀取最終將消耗所有的系統內存。 我說的不是堆,而是系統內存。

它僅在某些環境中發生-它不會在OSX上發生,但是會在我的Debian服務器上發生。

  1. 您是否知道為什么會發生這種情況?
  2. 是否有BufferedImage的替代方案,可能效果更好?
  3. 有問題的機器是虛擬服務器。 可能是由於其配置引起的嗎?

謝謝

編輯:

  1. 范例圖片: http//cl.ly/1P430l0V1g133r0C291J
  2. 這只是將產生此結果的第一個也是唯一的實例。
  3. 我剛剛驗證了它也發生在: image = ImageIO.read(file); -我開始認為,它一定是Java之外的東西-一些原生的bug車...

EDIT2:

所以問題出在文件系統上-我有一個7GB目錄,里面有成千上萬張圖像。 當我嘗試讀取文件時,它會消耗所有內存-我認為這是某種文件系統問題。

BufferedImage肯定存在問題-我已經在兩台服務器上對其進行了測試,並且泄漏的結果相同-系統內存已完全耗盡。

最后,我用PHP編寫了一個簡單的包裝程序,現在我使用GD進行圖像處理。 現在工作正常。 感謝所有的建議!

嘗試將代碼移至java.nio並訪問memory mapped file 這些存儲在堆之外。

這樣的SO很有趣。

暫無
暫無

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

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