簡體   English   中英

JVM會定期掛起

[英]JVM periodically hangs

試圖調試行為不端的Java VM。 有問題的過程是在Centos 5上運行Sun VM 1.6u24的大型VM(100GB堆),它正在執行例行的后端工作 - 即數據庫訪問,文件I / O等。

重新啟動進程以進行軟件版本升級后,我們發現其吞吐量已顯着下降。 大多數時候,頂級報告稱Java進程正在充分利用2個核心。 在此期間,VM完全不負責任:沒有寫入日志,也沒有響應外部工具,如jstack或kill -3。 VM恢復后,該過程將按正常方式繼續,直到下一次掛起。

strace顯示在這些掛起期間,只有2個線程進行系統調用。 這些是VM線程“VM線程”(21776)和“VM周期性任務線程”(21786)。 據推測,這兩個線程耗盡了CPU時間。 應用程序線程偶爾會喚醒並完成工作。 其余的時間他們似乎在等待各種futexes。 順便提一下,正常階段的第一行始終是SIGSEGV。

[pid 21776] sched_yield()               = 0
[pid 21776] sched_yield()               = 0
[pid 21776] sched_yield( <unfinished ...>
[pid 21786] <... futex resumed> )       = -1 ETIMEDOUT (Connection timed out)
[pid 21776] <... sched_yield resumed> ) = 0
[pid 21786] futex(0x2aabac71ef28, FUTEX_WAKE_PRIVATE, 1 <unfinished ...>
[pid 21776] sched_yield( <unfinished ...>
[pid 21786] <... futex resumed> )       = 0
[pid 21786] clock_gettime(CLOCK_MONOTONIC, {517080, 280918033}) = 0
[pid 21786] clock_gettime(CLOCK_REALTIME, {1369750039, 794028000}) = 0
[pid 21786] futex(0x2aabb81b94c4, FUTEX_WAIT_PRIVATE, 1, {0, 49923000} <unfinished ...>
[pid 21776] <... sched_yield resumed> ) = 0
[pid 21776] sched_yield()               = 0
[pid 21776] sched_yield()               = 0
[pid 21955] --- SIGSEGV (Segmentation fault) @ 0 (0) ---
[pid 21955] rt_sigreturn(0x2b1cde2f54ad <unfinished ...>

問題表現在2個不同的服務器上。 回滾我們的代碼版本僅適用於2台服務器中的一台。 系統日志中未報告任何錯誤消息,受影響的計算機上的另一個Java進程正常運行。

以下輸出是使用gstack獲得的,並顯示了2個典型的等待應用程序線程:

Thread 552 (Thread 0x4935f940 (LWP 21906)):
#0  0x00000030b040ae00 in pthread_cond_timedwait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x00002b1cdd8548d6 in os::PlatformEvent::park(long) () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#2  0x00002b1cdd92b230 in ObjectMonitor::wait(long, bool, Thread*) () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#3  0x00002b1cdd928853 in ObjectSynchronizer::wait(Handle, long, Thread*) () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#4  0x00002b1cdd69b716 in JVM_MonitorWait () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#5  0x00002b1cde193cc8 in ?? ()
#6  0x00002b1ce2552d90 in ?? ()
#7  0x00002b1cdd84fc23 in os::javaTimeMillis() () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#8  0x00002b1cde188a82 in ?? ()
#9  0x0000000000000000 in ?? ()
Thread 551 (Thread 0x49460940 (LWP 21907)):
#0  0x00000030b040ab99 in pthread_cond_wait@@GLIBC_2.3.2 () from /lib64/libpthread.so.0
#1  0x00002b1cdd854d6f in Parker::park(bool, long) () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#2  0x00002b1cdd98a1c8 in Unsafe_Park () from /usr/lib/jvm/java/jre/lib/amd64/server/libjvm.so
#3  0x00002b1cde193cc8 in ?? ()
#4  0x000000004945f798 in ?? ()
#5  0x00002b1cde188a82 in ?? ()
#6  0x0000000000000000 in ?? ()

我們研究了NTPD的問題,包括閏秒錯誤,但建議的解決方法沒有幫助,也沒有使用外部NTPD服務器。 重啟機器本身也無濟於事。 我們已啟用GC日志記錄,並且它不會將其視為GC問題,因為沒有消息指示它。 尋找任何可以幫助解決此問題的建議,非常感謝任何幫助。

以下是我要看的幾件事:

  • 當JVM沒有響應時,使用iostatvmstat查看系統是否在顛簸。 當你過度分配內存時會發生這種情況; 即整個系統使用的虛擬內存明顯多於物理內存。

  • 打開JVM的GC日志記錄,查看JVM無響應和GC運行之間是否存在關聯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM