簡體   English   中英

如何在Java中管理大型緩沖區? 超出了GC開銷限制

[英]How to manage a large buffer in java? GC overhead limit exceeded

我嘗試使用SAXParser解析2GB的XML文件。 我的任務是關於信息檢索,並被告知處理內存中所需的信息。 該文件分為單詞組成的文檔。 每個單詞都是一個對象,應該在其他文檔中存儲其外觀。

當下一個文檔開始時,我彈出所有這些對象,然后將它們放入一個大小合適的數組中,以盡可能提高內存效率。 現在的問題:該方法創建了太多的臨時對象,因此垃圾收集器完成了太多的工作。 有沒有辦法避免創建那么多臨時對象或使緩沖區不與GC沖突?

public class Stack<T> {
StackObject<T>  top;
boolean empty;
int entryCounter;
Stack(){
    empty = false;
}   
public void init(T obj){
    top = new StackObject<T>(obj);
}
public T pop(){ 
    T tmp = top.self;
    if(top.next != null){
        top.self = null;
        top = top.next;
    }
    else{
        empty = true;
    }
    return tmp;
}
public void push(T obj){
    StackObject<T> tmp = new StackObject<T>(obj);
    tmp.next = top;
    top = tmp;
    entryCounter += 1;
    if(tmp.next == tmp){
        System.out.println("ERROR");
    }
}
}

class StackObject<T>{
T self = null;
StackObject<T> next = null;
StackObject(T obj){
    self = obj;
}
}

您的Stack類在使用內存方面效率低下。 每個堆棧條目使用的內存大約是ArrayList 4倍。

你這樣說:

例如,由於調整大小需要太多時間,因此使用Arraylist太慢了。

解決該問題的一種方法是實現基於數組的堆棧,該堆棧在調整大小時將支持數組的大小加倍。 如果使用此策略調整大小,則由於調整大小, N被推入空堆棧的副本將提供N2N額外的副本。

無論如何,盡管您可能節省了調整大小的CPU的負擔,但另一方面是,當前的實現在構建許多StackObject實例的開銷中損失了很多收益,並且間接產生了垃圾回收成本,局部性差和內存增加腳印。

暫無
暫無

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

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