Java中的String与StringBuffer

Java中的String与StringBuffer,java,string,garbage-collection,Java,String,Garbage Collection,经过长时间的研究,我知道字符串是不可变的。如果程序涉及很多计算,字符串缓冲区比字符串更有效。 但我的问题与这些略有不同 我有一个传递字符串的函数。字符串实际上是一篇文章的文本(大约3000-5000个字符)。该函数是在线程中实现的。我的意思是,每次都有不同字符串文本的函数调用..函数的后期计算太大了。现在,当我为大量线程运行代码时,我得到了一个错误消息:超出了GC开销限制 现在我无法减少函数后期的计算,我的问题是,如果我将文本类型从字符串更改为字符串缓冲区,它真的会有帮助吗?此外,我不会对文本字

经过长时间的研究,我知道字符串是不可变的。如果程序涉及很多计算,字符串缓冲区比字符串更有效。 但我的问题与这些略有不同

我有一个传递字符串的函数。字符串实际上是一篇文章的文本(大约3000-5000个字符)。该函数是在线程中实现的。我的意思是,每次都有不同字符串文本的函数调用..函数的后期计算太大了。现在,当我为大量线程运行代码时,我得到了一个错误消息:超出了GC开销限制

现在我无法减少函数后期的计算,我的问题是,如果我将文本类型从字符串更改为字符串缓冲区,它真的会有帮助吗?此外,我不会对文本字符串执行任何连接操作

我已经发布了我的代码的小片段:

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;

}
公共静态列表线程\u启动器(列表线程、字符串文件名、ArrayList属性、记录器L、记录器L1、int seq\u no)
{String text=”“;
if(prop.get(7.matches)(“txt”))
text=读取内容。从txt(文件名,L,L1)读取内容;
else if(prop.get(7.matches)(“xml”))
text=读取内容。从xml(文件名,L,L1)读取内容;
else if(prop.get(7.matches)(“html”))
text=读取内容。从html(文件名,L,L1)读取内容;
其他的
{
System.out.println(“不是有效的配置”);
L1.info(“错误:未正确定义i/p文件类型的配置文件”);
}
/*待办事项*/
//System.out.println(文本);
/*要在此处执行的TODO更改*/
如果(text.length()>0)
{
Runnable任务=新的MyRunnable(文本、文件名、属性、文件名、L、L1、序号);
线程工作者=新线程(任务);
worker.start();
//记住线程以便以后使用
线程。添加(worker);
}
其他的
{
main\u entry\u class.file\u mover(文件名,false);
}
返回线程;
}
我使用以下代码反复调用上述函数:

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);
List threads=new ArrayList();
螺纹计数=10;
int file_pointer=0;//整数指针变量
做
{

如果(file.size()如果超过了错误GC开销限制,则可以先尝试介于
-Xmx512m
之间的方法。此外,如果有大量重复字符串,则可以对它们使用
String.intern()

您可以检查以下内容:


查看此链接以了解超出GC开销限制的错误是什么


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

你怎么看所谓“计算”?您的内存不足,无法顺利运行进程。是否存在内存泄漏或jvm堆增加size@David华莱士:通过计算,我实际上是指进行名称实体识别。名称实体识别需要巨大的内存。而且,由于我不能减少任何内部部分,我只想知道是否更改从一个字符串到另一个字符串缓冲区会有所帮助。您的问题与使用字符串或字符串缓冲区无关。这是另外一回事。请不要混淆这两个。问题中提到的“每次都有不同字符串文本的多个函数调用”我已经尝试过。我的系统内存为2GB。我尝试过设置Xmx1g、Xmx1500m等,但还是一样吗error@kiran:-我不认为你的问题是因为String或StringBuffer,但rathher我认为你基本上没有足够的内存来顺利运行进程。你能分享你的代码吗?@Youngistan:我的意思是我正在创建多个线程来处理多篇文章。这个函数是线程的一部分。因此:在每个线程中都会创建一个新的文章文本字符串dso@kiran您能粘贴代码吗?可能是有人优化了代码
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;

}
-XX:+UseConcMarkSweepGC