[英]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
被推入空堆棧的副本將提供N
到2N
額外的副本。
無論如何,盡管您可能節省了調整大小的CPU的負擔,但另一方面是,當前的實現在構建許多StackObject
實例的開銷中損失了很多收益,並且間接產生了垃圾回收成本,局部性差和內存增加腳印。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.