2014-03-12 72 views
0

經過長期的研究後,我知道了這個字符串是不可改變.String緩衝區比字符串更爲有效,如果該程序涉及到很多計算。 但我的問題是從這些字符串VS StringBuffer的Java中

我有一個功能,我傳遞一個字符串略有不同。該字符串實際上是文章的文本(近3000-5000個字符)。該函數在線程中實現。我的意思是說,每次都有不同的字符串文本的多個函數調用。函數的後期計算過大。現在,當我爲大量線程運行我的代碼時,出現錯誤提示:超出了GC開銷限制。 。現在

,我不能減少功能的後一階段的計算,我的問題是,如果我改變從串來串緩衝區中的文字類型將它真的有用嗎?另外,我不對文本字符串進行任何連接操作。

我已經發布了我的代碼小snipet:

public static List<Thread> thread_starter(List<Thread> threads,String filename,ArrayList<String> prop,Logger L,Logger L1,int seq_no) 
{ String text=""; 
    if(prop.get(7).matches("txt"))   
     text=read_contents.read_from_txt(filename,L,L1); 
    else if(prop.get(7).matches("xml")) 
     text=read_contents.read_from_xml(filename,L,L1); 
    else if(prop.get(7).matches("html")) 
     text=read_contents.read_from_html(filename,L,L1); 
    else 
    { 
     System.out.println("not a valid config"); 
     L1.info("Error : config file not properly defined for i/p file type"); 

    } 

    /*TODO */ 
    //System.out.println(text); 
    /*TODO CHANGES TO BE DONE HERE */ 
    if(text.length()>0) 
    { 
    Runnable task = new MyRunnable(text,filename,prop,filename,L,L1,seq_no); 
    Thread worker = new Thread(task); 
    worker.start(); 
     // Remember the thread for later usage 
    threads.add(worker); 
    } 
    else 
    { 
     main_entry_class.file_mover(filename, false); 
    } 
    return threads; 

} 

而且我多次撥打上面的函數使用下面的代碼:

List<Thread> threads = new ArrayList<Thread>(); 
thread_count=10; 
int file_pointer=0;// INTEGER POINTER VARIABLE 
do 
{ 
      if(file.size()<=file_pointer) 
       break; 
      else 
      { String file_name=file.get(file_pointer);   
       threads=thread_starter(threads,file_name,prop,L,L1,seq_no);  
       file_pointer++; 
       seq_no++; 
      }  
}while(check_status(threads,thread_count)==true); 

而且檢查狀態功能:

public static boolean check_status(List<Thread> threads,int thread_count) 
{ 
    int running = 0; 
    boolean flag=false; 
    do { 
     running = 0;   
     for (Thread thread : threads) {    
     if (thread.isAlive()) { 
      //ThreadMXBean thMxB = ManagementFactory.getThreadMXBean(); 
      //System.out.println(thMxB.getCurrentThreadCpuTime()); 
      running++; 
     } 
     } 
     if(Thread.activeCount()-1<thread_count) 
     { 
      flag=true; 
      break; 
     }   
    } while (running > 0); 
    return flag; 

} 
+1

你是什麼意思的「計算」? –

+0

你基本上內存不足以運行流程smooth.Find是否有任何內存泄漏或增加jvm堆大小 – Kick

+0

@David Wallace:通過計算,我的意思是執行名稱實體識別。名稱實體識別佔用大量內存。此外,因爲我不能減少NER部分中的任何內容,所以我只想知道從字符串更改爲字符串緩衝區是否有幫助。 – kiran

回答

0

如果您收到錯誤GC開銷超出限制,那麼你可以嘗試一些我n之間的第一個像-Xmx512m。另外如果你有很多重複的字符串,你可以在其上使用String.intern()

您可以檢查此doc

-XX:+UseConcMarkSweepGC 
+0

OP提到的問題'有多次調用不同的字符串文本函數每次' – Kick

+0

我已經試過..我有一個2GB的系統內存。我嘗試設置Xmx1g,Xmx1500m等,但仍然有相同的錯誤 – kiran

+0

@kiran: - 我不認爲你的問題是因爲字符串或StringBuffer,但相反,我認爲你基本上運行內存不足以順利運行的過程。你能分享你的代碼嗎? –

0

退房此鏈接瞭解GC開銷超限錯誤是GC overhead limit exceeded

隨着頁面提示,時內存的程序垃圾收集花費太多時間發生錯誤。所以,問題不在於你所做的計算的數量......而在於你實施它的方式。你可能有一個循環創建了太多的變量或類似的東西,所以字符串緩衝區可能無法幫助你。