2016-11-02 20 views
2

これは、さまざまなStackoverflowユーザーによって報告された典型的なエラーメッセージですが、私の質問は、提案されたソリューションが問題を解決するかどうかを評価する方法に関連しています。評価 - OutOfMemoryError:新しいネイティブスレッドを作成できません

このエラーに関連した記事&を読んでいます。ほとんどのソリューションはLinux ulimitsにドリルダウンしていますが、私にとってもそうだと思います。

私のulimitの値は以下のとおりです。

STACK 10240k, CORE 0k, NPROC 1024, NOFILE 4096; 

私は問題がNOPROC/NOFILEは(単にデフォルト値を持つ)低すぎるとなることができると思います。

しかし、NOPROCが超過したなどの根本的な原因を特定する正確な方法があるかどうか、そして現在使用されているプロセス/ファイルハンドルの数を正確に評価する方法があるかどうかを知りたかった。あるいは、私が焦点を当てるべきいくつかの他の問題が統計的に評価できるか?

この問題が発生した場合、heapdumpは有効になっておらず、エラーの時点ではスレッド・データはありません。

これを評価して修正するために入力を評価してください。ここで

は簡単なスタックトレースです:ここでは

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:714) 

は、システムの値は次のとおりです。ここで

OS:Red Hat Enterprise Linux Server release 6.3 (Santiago) 
uname:Linux 2.6.32-279.el6.x86_64 #1 SMP Wed Jun 13 18:24:36 EDT 2012 x86_64 
libc:glibc 2.12 NPTL 2.12 
rlimit: STACK 10240k, CORE 0k, NPROC 1024, NOFILE 4096, AS infinity 
load average:0.11 0.10 0.03 
CPU:total 32 (8 cores per cpu, 2 threads per core) family 6 model 45 stepping 7, cmov, cx8, fxsr, mmx, sse, sse2, sse3, ssse3, sse4.1, sse4.2, popcnt, avx, aes, ht, tsc, tscinvbit, tscinv 

/proc/meminfo: 
MemTotal:  74206252 kB 
MemFree:   2788244 kB 
Buffers:   1042212 kB 
Cached:   58454988 kB 
SwapCached:   2860 kB 
Active:   38242540 kB 
Inactive:  29129604 kB 

は、JVMのクラッシュレポートからの情報です - hs_err_pidxxxxx.log:

# There is insufficient memory for the Java Runtime Environment to continue. 
# Cannot create GC thread. Out of system resources. 
... 
# Out of Memory Error (gcTaskThread.cpp:46), pid=20396, tid=140365307795200 

# JRE version: (7.0_80-b15) (build) 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode linux-amd64 compressed oops) 
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again 

Current thread (0x00007fa95400a800): JavaThread "Unknown thread" [_thread_in_vm, id=20458, stack(0x00007fa9583f5000,0x00007fa9584f6000)] 
Stack: [0x00007fa9583f5000,0x00007fa9584f6000], sp=0x00007fa9584f4540, free space=1021k 

Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
V [libjvm.so+0x9a320a] VMError::report_and_die()+0x2ea 
V [libjvm.so+0x498d3b] report_vm_out_of_memory(char const*, int, unsigned long, char const*)+0x9b 
V [libjvm.so+0x55943a] GCTaskThread::GCTaskThread(GCTaskManager*, unsigned int, unsigned int)+0x11a 
V [libjvm.so+0x5589b8] GCTaskManager::initialize()+0x2b8 
V [libjvm.so+0x843438] ParallelScavengeHeap::initialize()+0x6f8 
V [libjvm.so+0x97509a] Universe::initialize_heap()+0xca 
V [libjvm.so+0x976269] universe_init()+0x79 
V [libjvm.so+0x5b2f25] init_globals()+0x65 
V [libjvm.so+0x95db4d] Threads::create_vm(JavaVMInitArgs*, bool*)+0x1ed 
V [libjvm.so+0x63b2e4] JNI_CreateJavaVM+0x74 
C [libjli.so+0x2f8e] JavaMain+0x9e 
Java Threads: (=> current thread) 
Other Threads: 
=>0x00007fa95400a800 (exited) JavaThread "Unknown thread" [_thread_in_vm, id=20458, stack(0x00007fa9583f5000,0x00007fa9584f6000)] 
VM state:not at safepoint (not fully initialized) 
VM Mutex/Monitor currently owned by a thread: None 
GC Heap History (0 events): 
No events 
Deoptimization events (0 events): 
No events 
Internal exceptions (0 events): 
No events 
Events (0 events): 
No events 

答えて

1

I wanted to know if there is an exact way to identify the root cause say the NOPROC has been exceeded etc

JVMのように最終的には、システムコールを通じてカーネルと話をしなければなりません。新しいスレッドを生成するには、さまざまなエラーコードを返すことができるcloneシステムコールを使用する必要があります(マニュアルページに記載されています)。 straceを使用すると、syscallsにログを記録し、そのエラーコードを表示することができます。これにより、OOMEよりも細かい情報が得られます。

+0

ポインタありがとうございます。 JVMがクラッシュし、私の場合、プロセスが既に再起動されているので(「新しいPID」)、「strace」を使用できますか?また、私は各PIDのstraceを実行する必要がありますか?標準的なアプリケーションプロセスと複数のスケジュールされたバッチプロセスの実行があります。短期間で実行され、頻繁に実行されるバッチプロセスでエラーが発生するため、短期間で頻繁に短命のPIDが発生します。私のシナリオを考慮して、この特定の問題と将来の予防的なデバッグ(恐らく私が推測する別のアプローチ)を追跡する良いアプローチを提案してください。 – user1549605

+0

straceのマンページを読んだことがありますか?それともコンソールで試してみましたか?私の意見ではかなり使いやすいです。私は少し実験を奨励します。あなたがそれを試して問題に遭遇した場合は、問題を説明するフォローアップの質問をする必要があります。 – the8472

+0

私はマニュアルを読んだ。現在実行中のプロセスにとっては便利なようです。それは私の場合に使用することができますか、以前失敗したプロセスのトラブルシューティングですか? – user1549605

関連する問題