Java中的String vs StringBuffer

时间:2014-03-12 05:32:23

标签: java string garbage-collection

经过长时间的研究,我知道String是不可变的。如果程序涉及许多计算,则String String比String更有效。 但我的问题与这些

略有不同

我有一个传递字符串的函数。该字符串实际上是文章的文本(接近3000-5000个字符)。该函数在线程中实现。我的意思是说,每次都有多个带有不同String文本的函数调用。函数的后期计算过于庞大。现在,当我为大量线程运行我的代码时,我收到一条错误消息:GC Overhead Limit Exceeded。

现在我不能减少函数后期的计算,我的问题是,如果我将文本类型从String更改为String缓冲区,它真的有用吗?另外,我不对文本字符串进行任何连接操作。

我发布了一小段我的代码:

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;

}

2 个答案:

答案 0 :(得分:0)

如果您收到错误GC Overhead Limit Exceeded,那么您可以先尝试-Xmx512m之间的某些内容。此外,如果你有很多重复的字符串,你可以使用String.intern()

您可以查看此doc

-XX:+UseConcMarkSweepGC

答案 1 :(得分:0)

查看此链接,了解GC Overhead Limit Exceeded错误是GC overhead limit exceeded

如页面所示,当程序在垃圾收集中花费太多时间时会发生内存不足错误。所以,问题不在于你做的计算次数......它与你实现它的方式有关。您可能有一个循环创建了太多变量或类似的东西,因此字符串缓冲区可能对您没有帮助。