2016-07-13 3 views
1

У меня возникла странная проблема с JVM, я развернул приложение Rest Service на tomcat, но теперь иногда JVM аварийно падает, иногда он вылетает через 3 часа, иногда через 20 часов, иногда занимает несколько дней , Я думал, что что-то не так с приложением о куче памяти, возможно, приложение несколько раз вызывает «стоп-мир», пока GC не сработает или что-то еще. (Не специалист по этой теме).JVM Crashes on GCTaskThread

Считаете ли вы, что проблема связана с кодом (возможно, проблема с производительностью) или может быть потенциальной ошибкой JVM, я прочитал несколько блогов и форумов оракула, некоторые люди просто сказали обновить JVM.

Благодарим за помощь.

JVM Args:

  • -Xms1024M
  • -Xmx4098M
  • -XX: MaxPermSize = 512M
  • -XX: + UseConcMarkSweepGC
  • -XX: + CMSIncrementalMode
  • -XX : MaxGCPauseMillis = 1200
  • -XX: ParallelGCThreads = 8

Машина: Intel Intel (R) Xeon (R) CPU E5-2680 v3 @ 2.50GHz с 8 ядрами - 32-гигабайтная оперативная память.

Здесь сообщения журнала hs_err:

=================================================================== 

A fatal error has been detected by the Java Runtime Environment: 

SIGSEGV (0xb) at pc=0x00007f8182e7c841, pid=24461, tid=140194202347264 
JRE version: Java(TM) SE Runtime Environment (7.0_55-b13) (build 1.7.0_55-b13) 
Java VM: Java HotSpot(TM) 64-Bit Server VM (24.55-b03 mixed mode linux-amd64 compressed oops) 
Problematic frame: 
V [libjvm.so+0x46c841] CMSParRemarkTask::do_work_steal(int,Par_MarkRefsIntoAndScanClosure*, int*)+0x101<br/> 

Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again<br/> 

If you would like to submit a bug report, please visit:<br/> 
    http://bugreport.sun.com/bugreport/crash.jsp<br/> 


--------------- T H R E A D --------------- 

Current thread (0x00007f817c021000): GCTaskThread [stack: 0x00007f8181916000,0x00007f8181a17000] [id=24464] 

siginfo:si_signo=SIGSEGV: si_errno=0, si_code=1 (SEGV_MAPERR), si_addr=0x00000000af4ea190 

Memory: 4k page, physical 49426864k(32696640k free), swap 2093052k(2089664k free) 

vm_info: Java HotSpot(TM) 64-Bit Server VM (24.55-b03) for linux-amd64 JRE (1.7.0_55-b13), built on Mar 17 2014 19:43:58 by "java_re" with gcc 4.3.0 20080428 (Red Hat 4.3.0-8) 
+0

A SIGSEGV - это ошибка сегментации. То есть Приложение пытается получить доступ к адресу памяти за пределами заданного диапазона. Это может быть вызвано ошибкой, поэтому обновление JVM похоже на правильный вызов. (Тем более, что ошибка возникает в том, что называется '' 'libjvm.so''') –

+0

Я попрошу обновить JVM и посмотреть, как это происходит :) спасибо Jorn Varnee. –

ответ

1

Пара советов:

  1. Обновите Java до последней версии. Они исправляют множество ошибок. Если возможно, перейдите на новейший jdk8, который в настоящее время составляет 8u92. Если нет, возьмите последнюю версию jdk7, 7u80
  2. CMSIncrementalMode устарел в последней версии java. Таким образом, вы можете попробовать также удалить эту опцию.
  3. На CPU с 8 ядрами и только с 4G кучи вы можете попробовать использовать ParallelGC, удалив -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:MaxGCPauseMillis=1200 -XX:ParallelGCThreads=8. Параллельный GC является более простым и надежным.
+0

Спасибо Nikem, я попрошу обновить JVM и посмотреть поведение, и у нас есть 8 ядер и 32 гигабайта бара, как вы думаете, используя UseConcMarkSweepGC жизнеспособный вариант? –

+0

Ou, извините, 8 ядер и 4 ГБ кучи. И текущая цель паузы составляет 1200 мс. Я бы использовал Parallel GC до тех пор, пока тесты не покажут, что паузы GC слишком велики. – Nikem

+0

@ victor.herrera вы также хотите поддержать и принять мой ответ? Если это было полезно, конечно. – Nikem