1. 程式人生 > >ByteArrayInputStream之記憶體溢位(IoUtils)

ByteArrayInputStream之記憶體溢位(IoUtils)

 今天一同事做了批量匯入資料的功能,但是伺服器老是宕機。檢視伺服器記憶體8G的記憶體佔了7G多,很明顯是記憶體洩漏。後來發現對檔案的操作的時候用到了ByteArrayInputStream,仔細檢視程式碼看到了ByteArrayInputStream並沒有釋放,問題差不多就是這個了,然後想著關閉流,自然的想到了ByteArrayInputStream.close()方法。後經網路查證,close方法在ByteArrayInputStream宣告的是空的,原來ByteArrayInputStream是基於記憶體Byte陣列的流,不需要close,當沒有強引用的時候會自動被垃圾回收了,所以close實現為空。而後想辦法關掉流,用到了org.apache.commons.io.IoUtils工具類。

  引用網上的介紹:

該類為input/output操作提供了通用靜態方法,可以無條件的關閉任何流。

包括功能:

•closeQuietly——這些關閉一個流的方法將忽略nulls和例外的情況。

•toXxx/read-這些方法從一個流讀取資料。

• write這些方法將資料寫到一個流裡。

copy——這些方法用於從一個流的所有的資料複製到另一個流。

•contentEquals——這些方法用於比較兩個流的內容。

下面是一個關閉的例項(紅色的部分):

package org.test.toolkit.file;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import org.apache.commons.io.IOUtils;

import org.apache.poi.poifs.filesystem.DirectoryEntry;

import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class DocFile extends RandomFile {

        public static final String EXTENSION = FileType.DOC.toString();

        private static final String WORD_TYPE = "WordDocument";

        private static byte[] getContentBytes() {

                byte byteArray[] = FileUtil.getRandomBytes();

                ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArray);

                ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

                try {

                        POIFSFileSystem fs = new POIFSFileSystem();

                        DirectoryEntry directory = fs.getRoot();

                        directory.createDocument(WORD_TYPE, byteArrayInputStream);

                        fs.writeFilesystem(byteArrayOutputStream);

                        return byteArrayOutputStream.toByteArray();

                } catch (IOException e) {

                        throw new RandomFileException("create doc file content fail", e);

                } finally {

                        IOUtils.closeQuietly(byteArrayInputStream);

                        IOUtils.closeQuietly(byteArrayOutputStream);

                }

        }

        public DocFile() {

                super(EXTENSION, getContentBytes());

        }

}

相關推薦

ByteArrayInputStream記憶體溢位IoUtils

 今天一同事做了批量匯入資料的功能,但是伺服器老是宕機。檢視伺服器記憶體8G的記憶體佔了7G多,很明顯是記憶體洩漏。後來發現對檔案的操作的時候用到了ByteArrayInputStream,仔細檢視程式碼看到了ByteArrayInputStream並沒有釋放,問題差不多就

Storm排錯調優Spout拉取造成記憶體溢位OOM

                                          &

記憶體溢位OOM

什麼是OOM?      OOM是out of memory的簡稱,也稱記憶體溢位。       什麼樣的場景下會出現OOM?        1、在對圖片進行記憶體快取處理的時候就

C++物件模型記憶體佈局3

轉載地址:https://mp.weixin.qq.com/s/dTyAC2IQ50c9nmQGOC0c2A   經過兩天的摸索,今天終於搞清楚C++物件模型.前兩篇C++物件模型之記憶體佈局(2)C++物件模型之記憶體佈局(1)(請戳我)已經講解了單繼承,多重繼承和多繼承的物件模

C++物件模型記憶體佈局2

轉載地址:https://mp.weixin.qq.com/s/UQhTAXIHffN3Now4_utb6g   在C++物件模型之記憶體佈局(1)一文中分別講了無多型和有多型時單繼承的物件記憶體佈局,這篇文章將深入講解多重繼承和多繼承.   多重繼承 &nb

C++物件模型記憶體佈局1

轉載地址: https://mp.weixin.qq.com/s/LMJ4Hsa1hmued2egk9uWMQ   如果想學習在linux或者在linux平臺下開發,學習C/或C++是非常好的選擇.俗話說,術業有專攻,學一門技術,就儘量學得深,也可以作為行走江湖,混口飯吃的一項本領

【原創】技術系列 記憶體管理

作者:CppExplore 地址:http://www.cppblog.com/CppExplore/(2)boost::pool系列。boost的記憶體池最低層是simple_segregated_storage,類似於Loki中的chunk,在其中申請釋放block(boost中把block稱為c

分享一次解決線上java應用導致JVM記憶體溢位OOM的問題

某個線上的應用執行幾天後,總是出現卡死甚至出現OOM的情況。 注:文中圖片可能與描述不符,僅作為演示! 通過Linux的top命令檢視cpu佔比 首先通過top命令檢視,發現某個java程式佔用了較高記憶體: JDK的jps命令確定是哪個j

android 記憶體溢位oom產生原因和記憶體優化

public abstract class WeakAsyncTask<Params, Progress, Result, WeakTarget> extends          AsyncTask<Params, Progress, Result> {      protected

初探jvm虛擬機器記憶體管理

本篇記錄一些概念性的東西,後續結合例項分析虛擬機器的記憶體機制。java虛擬機器在程式執行時將記憶體劃分為以下幾個區域,每個區域作用,生命週期各不相同程式計數器 虛擬機器棧 本地方法棧 方法區 堆程式計數器 執行緒執行的位元組碼行號指示器。 多執行緒是通過時間片輪轉法獲取cp

技術系列 記憶體管理

2、定長記憶體池。典型的實現有LOKI、BOOST。特點是為不同型別的資料結構分別建立記憶體池,需要記憶體的時候從相應的記憶體池中申請記憶體,優點是可以在使用完畢立即把記憶體歸還池中,可以更為細粒度的控制記憶體塊。    與變長的相比,這種型別的記憶體池更加通用,另一方面對於

技術系列 記憶體管理

(2)boost::pool系列。boost的記憶體池最低層是simple_segregated_storage,類似於Loki中的chunk,在其中申請釋放block(boost中把block稱為chunk,暈死,這裡還是稱其為block)採用了和loki的chunk中同樣

jdbc在操作oracle海量資料的時候用ResultSet獲取所有的返回資料出現記憶體溢位

來自網路,我在做生成excel的時候也遇到這個吐血問題。 jdbc在操作oracle海量資料的時候用ResultSet獲取所有的返回資料出現記憶體溢位 處理: 出錯的原因是ResultSet用的是可滾動結果集,正常情況下ResultSet是指標指向資料庫的資料,本身是不儲

Android 記憶體溢位OOM問題分析方法

oom的原因? 1)物件設計不合理(單個物件的記憶體佔用過大、同類物件未重複利用); 2)一次性申請很大記憶體導致超出了系統對單個應用設定的記憶體上限(Dalvik Heap Size); 3)記憶體洩漏 如何利用工具定位oom? 1) 先查詢發生oom的是哪個activi

ViewPager或ImgeView載入圖片出現記憶體溢位OOM

package com.example.viewpager_demo; import java.io.InputStream; import java.util.ArrayList; import android.app.Activity; import android.graphics.Bitmap; i

JAVA 虛擬機器記憶體管理

JMM ( Java Memory Model )概要 如圖:為java執行時資料區,在程式執行過程中對記憶體的分配、垃圾的回收都在執行時資料區中進行。 方法區和堆被執行緒所共享(藍色區塊) JVM棧、本地方法棧、程式計數器為執行緒所獨享(綠色區塊)

Android記憶體溢位oom總結

避免記憶體溢位的方法,主要是對以下三個方面對程式進行優化 記憶體引用 在處理記憶體引用之前,我們先來複習下什麼是強引用、軟引用、弱引用、虛引用 強引用:強引用是使用最普遍的引用。如果一個物件具有強引用,那垃圾回收器絕不會回收它。 當記憶體空間不足,Java虛擬機器

Java 記憶體溢位java.lang.OutOfMemoryError: Java heap space分析與解決

說明:下面出現的問題為本人在myeclips開發過程中,開發工具時獲取海量資料時出現的問題報錯。由於本人開發電腦使用的4g記憶體,虛擬記憶體與myeclips相關記憶體設定無法滿足要求。 問題分析:(網上資料整合與翻譯) java.lang.OutOfMemo

記憶體洩漏和記憶體溢位不看後悔,一看必懂

​​​​​​​記憶體洩漏 記憶體洩漏是指不再被程式使用的物件或者變數還在記憶體中佔儲存空間 記憶體洩漏主要有兩種情況:一是在堆中申請的空間沒有被釋放;二是物件已經不再使用,但仍然在記憶體中保留著,垃圾回收器則無法保證不再使用的物件會被釋放.因此java語言中的記憶

Qt總結十一:記憶體洩漏彙總

一、簡介        Qt記憶體管理機制:Qt 在內部能夠維護物件的層次結構。對於可視元素,這種層次結構就是子元件與父元件的關係;對於非可視元素,則是一個物件與另一個物件的從屬關係。在 Qt 中,在 Qt 中,刪除父物