2012-02-29 28 views
0

私はスレッドプールを使用して作業をしています。私のプールサイズがちょうど8 あるしかし、私は次のエラーました:java.lang.OutOfMemoryError:新しいネイティブスレッドを作成できません

java.util.concurrent.ExecutionException: java.lang.OutOfMemoryError: unable to create new native thread 
    at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:222) 
    at java.util.concurrent.FutureTask.get(FutureTask.java:83) 
    at com.TransferFiles.transferFilesToHadoop(TransferFiles.java:88) 
    at com.TransferJob.execute(TransferJob.java:25) 
    at org.quartz.core.JobRunShell.run(JobRunShell.java:202) 
    at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:525) 
Caused by: java.lang.OutOfMemoryError: unable to create new native thread 
    at java.lang.Thread.start0(Native Method) 
    at java.lang.Thread.start(Thread.java:640) 
    at org.apache.hadoop.ipc.Client$Connection.setupIOstreams(Client.java:555) 
    at org.apache.hadoop.ipc.Client$Connection.access$1800(Client.java:184) 
    at org.apache.hadoop.ipc.Client.getConnection(Client.java:1140) 
    at org.apache.hadoop.ipc.Client.call(Client.java:986) 
    at org.apache.hadoop.ipc.RPC$Invoker.invoke(RPC.java:225) 
    at $Proxy1.getFileInfo(Unknown Source) 
    at sun.reflect.GeneratedMethodAccessor12.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:82) 
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:59) 
    at $Proxy1.getFileInfo(Unknown Source) 
    at org.apache.hadoop.hdfs.DFSClient.getFileInfo(DFSClient.java:676) 
    at org.apache.hadoop.hdfs.DistributedFileSystem.getFileStatus(DistributedFileSystem.java:521) 
    at org.apache.hadoop.fs.FileSystem.exists(FileSystem.java:692) 
    at org.apache.hadoop.fs.FileUtil.checkDest(FileUtil.java:349) 
    at org.apache.hadoop.fs.FileUtil.copy(FileUtil.java:205) 
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1119) 
    at org.apache.hadoop.fs.FileSystem.copyFromLocalFile(FileSystem.java:1095) 
    at com.FileCopyRoutine.call(TransferFiles.java:325) 
    at com.FileCopyRoutine.call(TransferFiles.java:257) 
    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:138) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 

を私が使用しています:= 8

Future<Boolean> futureTask = exec.submit(new FileCopyRoutine(srcSubResultPath, destSubResultPath,execId)); 

private static final ExecutorService exec = Executors.newFixedThreadPool(TransferToHadoopUtilities.numOfThreads); 

numOfThreadsをFileCopyRoutineが呼び出し可能な実装しています。私は同時に何百もの提出をするかもしれない。 誰でもこのエラーについてのヒントを教えてください。

ありがとうございます!

+0

「hadoop」タグがこの文脈に関連するように追加されました。 – home

+0

まあ、明らかにjvmは空きメモリを使い果たしました。追加のメモリを割り当てたか、デフォルトのメモリ設定でアプリケーションを起動していますか? –

+0

あなたはプールにいくつのジョブを提出していますか?それは本当に100sかそれ以上ですか? – Gray

答えて

0

スレッドを作成できません。ヒープではなくネイティブメモリを示します。 32ビットシステムの場合、-XmxがTOOを高く設定すると、実際にネイティブメモリが枯渇する可能性があります。

+1

スレッドスタックは、ネイティブメモリに作成されます。ヒープの一部ではありません。現在、ヒープ上にある各スレッドに関連付けられた非常に小さなTLH(スレッドローカルヒープ)がありますが、ここではそうではありません。 32ビット/ 64ビットの場合、どのJDKが使用されているか、最大heapsizeがどのように設定されているか、etcetcetc – cathy

関連する問題