Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 垃圾收集器中的堆锁饥饿_Java_Garbage Collection_Starvation - Fatal编程技术网

Java 垃圾收集器中的堆锁饥饿

Java 垃圾收集器中的堆锁饥饿,java,garbage-collection,starvation,Java,Garbage Collection,Starvation,垃圾收集器线程似乎在等待堆锁定时耗尽。下面是GC线程的堆栈跟踪 + 5480 _pthread_start (in libsystem_pthread.dylib) + 168 [0x7fff9255191a] + 5480 _pthread_body (in libsystem_pthread.dylib) + 131 [0x7fff9255199d] + 5480 java_start(Thread*) (in libjvm.dylib) + 246 [0

垃圾收集器线程似乎在等待堆锁定时耗尽。下面是GC线程的堆栈跟踪

+   5480 _pthread_start  (in libsystem_pthread.dylib) + 168  [0x7fff9255191a]
+     5480 _pthread_body  (in libsystem_pthread.dylib) + 131  [0x7fff9255199d]
+       5480 java_start(Thread*)  (in libjvm.dylib) + 246  [0x110e82cd6]
+         5480 YieldingFlexibleGangWorker::loop()  (in libjvm.dylib) + 419  [0x110fbf8fb]
+           5480 Monitor::wait(bool, long, bool)  (in libjvm.dylib) + 375  [0x110e5c859]
+             5480 Monitor::IWait(Thread*, long)  (in libjvm.dylib) + 168  [0x110e5c5f0]
+               5480 ParkCommon(ParkEvent*, long)  (in libjvm.dylib) + 42  [0x110e5bd1a]
+                 5480 os::PlatformEvent::park()  (in libjvm.dylib) + 192  [0x110e7ea72]
+                   5480 _pthread_cond_wait  (in libsystem_pthread.dylib) + 767  [0x7fff92552728]
+                     5480 __psynch_cvwait  (in libsystem_kernel.dylib) + 10  [0x7fff98080db6]
我的Java应用程序产生了大约300个线程。他们也会挨饿。下面是一个堆栈跟踪示例:

+             5480 java_lang_String::create_from_str(char const*, Thread*)  (in libjvm.dylib) + 59  [0x110cf1ab9]
+               5480 java_lang_String::basic_create(int, Thread*)  (in libjvm.dylib) + 38  [0x110cef8a0]
+                 5480 InstanceKlass::allocate_instance(Thread*)  (in libjvm.dylib) + 31  [0x110cbd93f]
+                   5480 CollectedHeap::obj_allocate(KlassHandle, int, Thread*)  (in libjvm.dylib) + 38  [0x110cbff8a]
+                     5480 CollectedHeap::common_mem_allocate_noinit(KlassHandle, unsigned long, Thread*)  (in libjvm.dylib) + 140  [0x110ab2484]
+                       5480 GenCollectorPolicy::mem_allocate_work(unsigned long, bool, bool*)  (in libjvm.dylib) + 475  [0x110b9f313]
+                         5480 Monitor::lock(Thread*)  (in libjvm.dylib) + 132  [0x110e5c4e6]
+                           5480 Monitor::ILock(Thread*)  (in libjvm.dylib) + 310  [0x110e5c3dc]
+                             5480 ParkCommon(ParkEvent*, long)  (in libjvm.dylib) + 42  [0x110e5bd1a]
+                               5480 os::PlatformEvent::park()  (in libjvm.dylib) + 192  [0x110e7ea72]
+                                 5480 _pthread_cond_wait  (in libsystem_pthread.dylib) + 767  [0x7fff92552728]
+                                   5480 __psynch_cvwait  (in libsystem_kernel.dylib) + 10  [0x7fff98080db6]
运行我的应用程序几个小时后,饥饿开始了

我尝试了三个收集器:使用默认设置的UseG1GC、UseParallelGC和UseConMarkSweepGC,但仍然无法使用(没有尝试串行GC)

我在OSX 10.11.5上使用Java 1.8.0_92(构建1.8.0_92-b14,Java HotSpot(TM)64位服务器虚拟机,构建25.92-b14,混合模式)

有足够的堆空间Xmx6G;我看不到完整的GC。我将GC线程XX:VMThreadStackSize的堆栈增加到10MB,但得到相同的饥饿。我还使用了一个旧的Java,同样的饥饿。我没有看到任何致命错误日志()

请建议如何调试此饥饿

2016年6月19日更新:

我根据堆栈跟踪对挂起的线程进行了分组,您可以看到

挂起GangWorker::loop()

挂起ConcurrentG1RefinetThread::等待\u完成\u缓冲区()

编译器线程的挂起

5347 Thread_669680: Java: C2 CompilerThread0
+ 5347 thread_start  (in libsystem_pthread.dylib) + 13  [0x7fff930c3351]
+   5347 _pthread_start  (in libsystem_pthread.dylib) + 168  [0x7fff930c591a]
+     5347 _pthread_body  (in libsystem_pthread.dylib) + 131  [0x7fff930c599d]
+       5347 java_start(Thread*)  (in libjvm.dylib) + 246  [0x112485bbe]
+         5347 JavaThread::run()  (in libjvm.dylib) + 450  [0x112566344]
+           5347 JavaThread::thread_main_inner()  (in libjvm.dylib) + 155  [0x112564c57]
+             5347 CompileBroker::compiler_thread_loop()  (in libjvm.dylib) + 376  [0x1121b89ce]
+               5347 CompileQueue::get()  (in libjvm.dylib) + 122  [0x1121b87ac]
+                 5347 Monitor::wait(bool, long, bool)  (in libjvm.dylib) + 222  [0x11245f5a0]
+                   5347 Monitor::IWait(Thread*, long)  (in libjvm.dylib) + 168  [0x11245f3d0]
+                     5347 os::PlatformEvent::park(long)  (in libjvm.dylib) + 404  [0x112482844]
+                       5347 _pthread_cond_wait  (in libsystem_pthread.dylib) + 767  [0x7fff930c6728]
+                         5347 __psynch_cvwait  (in libsystem_kernel.dylib) + 10  [0x7fff8dbbcdb6]
此外,其余线程具有这些堆栈跟踪(每个线程一行)

我省略了我的300个线程,因为Java不在安全点(jstack不工作),所以饥饿不能是因为我的(用户)线程。饥饿必须由VM线程引起(我在上面列出了所有这些线程的堆栈跟踪)

2016年6月24日更新:

我做了jstack-F,我的线程被阻塞了,一些是内存操作,比如这个

Thread 200451: (state = BLOCKED)
 - java.util.Arrays.copyOf(char[], int) @bci=1, line=3332 (Compiled frame)
 - java.lang.AbstractStringBuilder.expandCapacity(int) @bci=43, line=137 (Compiled frame)
 - java.lang.AbstractStringBuilder.ensureCapacityInternal(int) @bci=12, line=121 (Compiled frame)
 - java.lang.AbstractStringBuilder.append(java.lang.String) @bci=21, line=421 (Compiled frame)
 - java.lang.StringBuilder.append(java.lang.String) @bci=2, line=136 (Compiled frame)
但是jstack不显示垃圾收集器线程。为了实现这一点,我在同一个进程上运行sample命令,就像您看到饥饿的GC线程之前一样:

+ 5229 ???  (in <unknown binary>)  [0x11064ae07]
+   5229 OptoRuntime::new_array_nozero_C(Klass*, int, JavaThread*)  (in libjvm.dylib) + 54  [0x10f8da854]
+     5229 TypeArrayKlass::allocate_common(int, bool, Thread*)  (in libjvm.dylib) + 138  [0x10f975406]
+       5229 CollectedHeap::common_mem_allocate_noinit(KlassHandle, unsigned long, Thread*)  (in libjvm.dylib) + 105  [0x10f4b2bbb]
+         5229 CollectedHeap::allocate_from_tlab_slow(KlassHandle, Thread*, unsigned long)  (in libjvm.dylib) + 283  [0x10f59e2af]
+           5229 G1CollectedHeap::allocate_new_tlab(unsigned long)  (in libjvm.dylib) + 28  [0x10f65590e]
+             5229 G1CollectedHeap::attempt_allocation(unsigned long, unsigned int*, unsigned int*)  (in libjvm.dylib) + 182  [0x10f65e42a]
+               5229 G1CollectedHeap::attempt_allocation_slow(unsigned long, unsigned char, unsigned int*, unsigned int*)  (in libjvm.dylib) + 339  [0x10f6576ab]
+                 5229 Monitor::lock(Thread*)  (in libjvm.dylib) + 132  [0x10f85f2c6]
+                   5229 Monitor::ILock(Thread*)  (in libjvm.dylib) + 310  [0x10f85f1bc]
+                     5229 ParkCommon(ParkEvent*, long)  (in libjvm.dylib) + 42  [0x10f85eafa]
+                       5229 os::PlatformEvent::park()  (in libjvm.dylib) + 192  [0x10f88195a]
+                         5229 _pthread_cond_wait  (in libsystem_pthread.dylib) + 767  [0x7fff930c6728]
+                           5229 __psynch_cvwait  (in libsystem_kernel.dylib) + 10  [0x7fff8dbbcdb6]
+5229???(in)[0x11064ae07]
+5229 OptoRuntime::新数组nozero_C(Klass*,int,JavaThread*)(在libjvm.dylib中)+54[0x10f8da854]
+5229 TypeArrayClass::allocate_common(int、bool、Thread*)(在libjvm.dylib中)+138[0x10f975406]
+5229 CollectedHeap::common_mem_allocate_noinit(KlassHandle,unsigned long,Thread*)(在libjvm.dylib中)+105[0x10f4b2bbb]
+5229 CollectedHeap::allocate_from_tlab_slow(KlassHandle,Thread*,unsigned long)(在libjvm.dylib中)+283[0x10f59e2af]
+5229 G1CollectedHeap::allocate_new_tlab(unsigned long)(在libjvm.dylib中)+28[0x10f65590e]
+5229 G1CollectedHeap::尝试分配(无符号长、无符号整数*、无符号整数*)(在libjvm.dylib中)+182[0x10f65e42a]
+5229 G1CollectedHeap::尝试分配速度慢(无符号长、无符号字符、无符号整数*、无符号整数*)(在libjvm.dylib中)+339[0x10f6576ab]
+5229监视器::锁(线程*)(在libjvm.dylib中)+132[0x10f85f2c6]
+5229监视器::ILock(线程*)(在libjvm.dylib中)+310[0x10f85f1bc]
+5229 ParkCommon(ParkEvent*,long)(在libjvm.dylib中)+42[0x10f85eafa]
+5229 os::PlatformEvent::park()(在libjvm.dylib中)+192[0x10f88195a]
+5229-pthread-cond-wait(在libsystem-pthread.dylib中)+767[0x7fff930c6728]
+5229 uu psynch_cvwait(在libsystem_kernel.dylib中)+10[0x7fff8dbbcdb6]
当我用30个线程(而不是300个)运行我的应用程序时,饥饿感消失了


我们需要找出垃圾收集器的u psynchu cvwait等待哪个锁,但是jstack没有这样说。可能代码检查是最好的选择。

每当有很多线程在等待锁时,您应该问的第一个问题是“什么持有锁,它在做什么?”另外,堆看起来像什么?所有的世代都是满的还是只有一代?如果您正在接近容量(这将触发一个完整的GC),那么所有的对象都是活动的(在这种情况下,您可能是GC开销过高的情况)。最后,您的整个系统的状态是什么?您是否遇到操作系统内存/提交或进程/线程限制?使用
-XX:+PrintGCDetails-XX:+PrintSafepointStatistics-XX:PrintSafepointStatisticsCount=1-XX:+PrintJNIGCtalls
启用详细日志记录,关于“谁持有锁”:我无法获取“等待…”,因为jconsole不工作。Java并不安全。我通过OSX上一个名为“sample”的低级命令获得了上面报告的堆栈跟踪。我不知道如何找出哪个锁“\uu psynch\u cvwait”被阻止。你知道吗?记忆力很好。堆是6GB,我的应用程序只使用了大约1GB。当我使用G1时,“G1伊甸园空间”和“G1老世代”都小于1GB,“G1幸存者空间”小于80MB,“元空间”小于40MB,“代码缓存”小于50MB,“压缩类空间”小于4MB。Mem和proc限制还有很多
 _OSSpinLockLockSlow ! syscall_thread_switch _OSSpinLockLockSlow _pthread_lookup_thread pthread_kill os::SuspendedThreadTask::internal_do_task() os::SuspendedThreadTask::run() ThreadSampleClosure::sample_thread(JavaThread*,     5347 Thread_669693
 __accept BsdAttachListener::dequeue() AttachListener::dequeue() attach_listener_thread_entry(JavaThread*, JavaThread::thread_main_inner() JavaThread::run() java_start(Thread*) _pthread_body     5347 Thread_669711: Java: Attach Listener
 __psynch_cvwait _pthread_cond_wait Parker::park(bool, Unsafe_Park ??? ???       5347 Thread_669715: Java: RMI Scheduler(0)
 __psynch_cvwait _pthread_cond_wait Parker::park(bool, Unsafe_Park ??? ??? ??? ???     5347 Thread_669777: Java: log4j2.jmx.notif1
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ObjectMonitor::wait(long, ObjectSynchronizer::wait(Handle, JVM_MonitorWait ??? ???     5347 Thread_669603
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ObjectMonitor::wait(long, ObjectSynchronizer::wait(Handle, JVM_MonitorWait ??? ???     5347 Thread_669657: Java: Reference Handler
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ObjectMonitor::wait(long, ObjectSynchronizer::wait(Handle, JVM_MonitorWait ??? ???     5347 Thread_669658: Java: Finalizer
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::ILock(Thread*) Monitor::lock(Thread*) G1CollectedHeap::attempt_allocation_slow(unsigned G1CollectedHeap::attempt_allocation(unsigned     5347 Thread_669669: Java: JFR request timer
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::ILock(Thread*) Monitor::lock(Thread*) G1CollectedHeap::attempt_allocation_slow(unsigned G1CollectedHeap::attempt_allocation(unsigned     5347 Thread_669712: Java: RMI TCP Accept-0
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::ILock(Thread*) Monitor::lock(Thread*) G1CollectedHeap::attempt_allocation_slow(unsigned G1CollectedHeap::attempt_allocation(unsigned     5347 Thread_669720: Java: JMX server connection timeout 29
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::ILock(Thread*) Monitor::lock(Thread*) G1CollectedHeap::attempt_allocation_slow(unsigned G1CollectedHeap::attempt_allocation(unsigned     5347 Thread_683755: Java: RMI TCP Connection(65)-192.168.1.167
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::ILock(Thread*) Monitor::lock(Thread*) G1CollectedHeap::attempt_allocation_slow(unsigned G1CollectedHeap::attempt_allocation(unsigned     5347 Thread_813902: Java: RMI TCP Connection(634)-192.168.1.167
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::ILock(Thread*) Monitor::lock(Thread*) SafepointSynchronize::begin() VMThread::loop()     5347 Thread_669656
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::ILock(Thread*) Monitor::lock_without_safepoint_check() SafepointSynchronize::block(JavaThread*) ThreadStateTransition::trans_and_fence(JavaThreadState,     5347 Thread_669676: Java: VM JFR Buffer Thread
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::IWait(Thread*, Monitor::wait(bool, ConcurrentMarkThread::sleepBeforeNextCycle() ConcurrentMarkThread::run()     5347 Thread_669645
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::IWait(Thread*, Monitor::wait(bool, ServiceThread::service_thread_entry(JavaThread*, JavaThread::thread_main_inner()     5347 Thread_669692: Java: Service Thread
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::IWait(Thread*, Monitor::wait(bool, SurrogateLockerThread::loop() JavaThread::thread_main_inner()     5347 Thread_669667: Java: Surrogate Locker Thread (Concurrent GC)
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::IWait(Thread*, Monitor::wait(bool, SuspendibleThreadSet::join() ConcurrentG1RefineThread::sample_young_list_rs_lengths()     5347 Thread_669626
 __semwait_signal pthread_join ContinueInNewThread0 ContinueInNewThread JVMInit JLI_Launch main apple_main     5347 Thread_669600
 __sigsuspend SR_handler(int, _sigtramp vframeStreamCommon::fill_from_frame() _pthread_lookup_thread pthread_kill closefd ???     5347 Thread_671069: Java: DelayClose
 kevent_qos _dispatch_mgr_invoke _dispatch_mgr_thread          5347 Thread_669601   DispatchQueue_2: com.apple.libdispatch-manager  (serial)
 mach_msg_trap mach_msg __CFRunLoopServiceMachPort __CFRunLoopRun CFRunLoopRunSpecific CreateExecutionEnvironment JLI_Launch main     5347 Thread_669599   DispatchQueue_1: com.apple.main-thread  (serial)
 semaphore_wait_trap check_pending_signals(bool) signal_thread_entry(JavaThread*, JavaThread::thread_main_inner() JavaThread::run() java_start(Thread*) _pthread_body _pthread_start     5347 Thread_669668: Java: Signal Dispatcher
 __psynch_cvwait _pthread_cond_wait os::PlatformEvent::park() ParkCommon(ParkEvent*, Monitor::ILock(Thread*) Monitor::lock(Thread*) G1CollectedHeap::attempt_allocation_slow(unsigned 5347 Thread_815183: Java: RMI TCP Connection(635)-192.168.1.167
Thread 200451: (state = BLOCKED)
 - java.util.Arrays.copyOf(char[], int) @bci=1, line=3332 (Compiled frame)
 - java.lang.AbstractStringBuilder.expandCapacity(int) @bci=43, line=137 (Compiled frame)
 - java.lang.AbstractStringBuilder.ensureCapacityInternal(int) @bci=12, line=121 (Compiled frame)
 - java.lang.AbstractStringBuilder.append(java.lang.String) @bci=21, line=421 (Compiled frame)
 - java.lang.StringBuilder.append(java.lang.String) @bci=2, line=136 (Compiled frame)
+ 5229 ???  (in <unknown binary>)  [0x11064ae07]
+   5229 OptoRuntime::new_array_nozero_C(Klass*, int, JavaThread*)  (in libjvm.dylib) + 54  [0x10f8da854]
+     5229 TypeArrayKlass::allocate_common(int, bool, Thread*)  (in libjvm.dylib) + 138  [0x10f975406]
+       5229 CollectedHeap::common_mem_allocate_noinit(KlassHandle, unsigned long, Thread*)  (in libjvm.dylib) + 105  [0x10f4b2bbb]
+         5229 CollectedHeap::allocate_from_tlab_slow(KlassHandle, Thread*, unsigned long)  (in libjvm.dylib) + 283  [0x10f59e2af]
+           5229 G1CollectedHeap::allocate_new_tlab(unsigned long)  (in libjvm.dylib) + 28  [0x10f65590e]
+             5229 G1CollectedHeap::attempt_allocation(unsigned long, unsigned int*, unsigned int*)  (in libjvm.dylib) + 182  [0x10f65e42a]
+               5229 G1CollectedHeap::attempt_allocation_slow(unsigned long, unsigned char, unsigned int*, unsigned int*)  (in libjvm.dylib) + 339  [0x10f6576ab]
+                 5229 Monitor::lock(Thread*)  (in libjvm.dylib) + 132  [0x10f85f2c6]
+                   5229 Monitor::ILock(Thread*)  (in libjvm.dylib) + 310  [0x10f85f1bc]
+                     5229 ParkCommon(ParkEvent*, long)  (in libjvm.dylib) + 42  [0x10f85eafa]
+                       5229 os::PlatformEvent::park()  (in libjvm.dylib) + 192  [0x10f88195a]
+                         5229 _pthread_cond_wait  (in libsystem_pthread.dylib) + 767  [0x7fff930c6728]
+                           5229 __psynch_cvwait  (in libsystem_kernel.dylib) + 10  [0x7fff8dbbcdb6]