经过长时间的研究,我知道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;
}
答案 0 :(得分:0)
如果您收到错误GC Overhead Limit Exceeded,那么您可以先尝试-Xmx512m
之间的某些内容。此外,如果你有很多重复的字符串,你可以使用String.intern()
。
您可以查看此doc:
-XX:+UseConcMarkSweepGC
答案 1 :(得分:0)
查看此链接,了解GC Overhead Limit Exceeded错误是GC overhead limit exceeded。
如页面所示,当程序在垃圾收集中花费太多时间时会发生内存不足错误。所以,问题不在于你做的计算次数......它与你实现它的方式有关。您可能有一个循环创建了太多变量或类似的东西,因此字符串缓冲区可能对您没有帮助。