如何解决/调试JVM崩溃(SIGSEGV)的最佳方法

13

我很迷茫,不知道该如何面对和解决我的问题。我有一段简单的Java代码,导致了JVM崩溃:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00000001057ce9d4, pid=10727, tid=18947
#
# JRE version: Java(TM) SE Runtime Environment (8.0_73-b02) (build 1.8.0_73-b02)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.73-b02 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.dylib+0x3ce9d4]  PhaseIdealLoop::idom_no_update(Node*) const+0x12
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

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

Current thread (0x00007feeef003800):  JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=18947, stack(0x0000700000ec4000,0x0000700000fc4000)]

siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000008

我不知道如何解决这个问题。程序非常简单,通过Kafka接收消息并根据接收到的消息触发任务。如果我添加两个不同的任务,程序在接收900-1,500条消息后就会崩溃。所有的消息都是相同的,并且程序没有使用任何JNI相关的内容(根据我的了解,使用的第三方库也没有使用JNI)。
我从未遇到过这个问题,但我想找到一种方法来找出问题所在。我已经使用了其他版本的JVM(Java 8.0_66、8.0_73-b02和8.0_74-b02)。那么我该怎么办呢?非常感谢!
编辑(1):有时我还会收到以下错误/信息:
...
# JRE version: Java(TM) SE Runtime Environment (8.0_73-b02) (build 1.8.0_73-b02)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.73-b02 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.dylib+0x3ce9d4]
...

编辑(2):我将我的Java版本更新到8.0_74。错误仍然存在 :(。

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00000001073cdef8, pid=11227, tid=19715
#
# JRE version: Java(TM) SE Runtime Environment (8.0_74-b02) (build 1.8.0_74-b02)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.74-b02 mixed mode bsd-amd64 compressed oops)
# Problematic frame:
# V  [libjvm.dylib+0x3cdef8]  PhaseIdealLoop::idom_no_update(Node*) const+0x12
#
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.java.com/bugreport/crash.jsp
#

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

Current thread (0x00007f89e481c800):  JavaThread "C2 CompilerThread1" daemon [_thread_in_native, id=19715, stack(0x000070000104a000,0x000070000114a000)]

siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000008

编辑(3):核心转储

最终我创建了一个核心转储并将其加载到Java VisualVM中(我无法使用DROY提出的解决方案,因为调用jmap会导致另一个错误:“无法连接到核心文件”)。使用VisualVM创建的线程转储结果如下:

Thread 30239 "Keep-Alive-Timer": (state = BLOCKED)
    at java.lang.Thread.sleep(Native Method)
    at sun.net.www.http.KeepAliveCache.run(KeepAliveCache.java:172)
    at java.lang.Thread.run(Thread.java:745)

Thread 29699 "threadDeathWatcher-4-1": (state = BLOCKED)
    at java.lang.Thread.sleep(Native Method)
    at io.netty.util.ThreadDeathWatcher$Watcher.run(ThreadDeathWatcher.java:137)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
    at java.lang.Thread.run(Thread.java:745)

Thread 26635 "nioEventLoopGroup-3-1": (state = IN_NATIVE)
    at sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method)
    at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198)
    at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:117)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    - locked <0x00000006c049ec98> (a io.netty.channel.nio.SelectedSelectionKeySet)
    - locked <0x00000006c049ec88> (a java.util.Collections$UnmodifiableSet)
    - locked <0x00000006c049ecb8> (a sun.nio.ch.KQueueSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at io.netty.channel.nio.NioEventLoop.select(NioEventLoop.java:622)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:310)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:110)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
    at java.lang.Thread.run(Thread.java:745)

Thread 29187 "pool-3-thread-1": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at kafka.consumer.ConsumerIterator.makeNext(ConsumerIterator.scala:63)
    at kafka.consumer.ConsumerIterator.makeNext(ConsumerIterator.scala:33)
    at kafka.utils.IteratorTemplate.maybeComputeNext(IteratorTemplate.scala:66)
    at kafka.utils.IteratorTemplate.hasNext(IteratorTemplate.scala:58)
    at com.sosse.common.messaging.DefaultHandler.doRun(DefaultHandler.java:22)
    at com.sosse.common.concurrency.DefaultRunnable.run(DefaultRunnable.java:11)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Thread 28675 "pool-4-thread-1": (state = BLOCKED)
    at java.lang.Thread.sleep(Native Method)
    at io.netty.util.HashedWheelTimer$Worker.waitForNextTick(HashedWheelTimer.java:461)
    at io.netty.util.HashedWheelTimer$Worker.run(HashedWheelTimer.java:360)
    at java.lang.Thread.run(Thread.java:745)

Thread 28163 "ConsumerFetcherThread-analytics-group_Philipp.local-1458441725398-581eabc3-0-0": (state = IN_NATIVE)
    at sun.nio.ch.Net.poll(Native Method)
    at sun.nio.ch.SocketChannelImpl.poll(SocketChannelImpl.java:954)
    - locked <0x00000006c056d538> (a java.lang.Object)
    at sun.nio.ch.SocketAdaptor$SocketInputStream.read(SocketAdaptor.java:204)
    - locked <0x00000006c056d5b8> (a java.lang.Object)
    at sun.nio.ch.ChannelInputStream.read(ChannelInputStream.java:103)
    - locked <0x00000006c056d5f8> (a sun.nio.ch.SocketAdaptor$SocketInputStream)
    at java.nio.channels.Channels$ReadableByteChannelImpl.read(Channels.java:385)
    - locked <0x00000006c056d618> (a java.lang.Object)
    at kafka.utils.Utils$.read(Utils.scala:380)
    at kafka.network.BoundedByteBufferReceive.readFrom(BoundedByteBufferReceive.scala:54)
    at kafka.network.Receive$class.readCompletely(Transmission.scala:56)
    at kafka.network.BoundedByteBufferReceive.readCompletely(BoundedByteBufferReceive.scala:29)
    at kafka.network.BlockingChannel.receive(BlockingChannel.scala:111)
    at kafka.consumer.SimpleConsumer.liftedTree1$1(SimpleConsumer.scala:71)
    at kafka.consumer.SimpleConsumer.kafka$consumer$SimpleConsumer$$sendRequest(SimpleConsumer.scala:68)
    - locked <0x00000006c056d6e0> (a java.lang.Object)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SimpleConsumer.scala:112)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply(SimpleConsumer.scala:112)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1$$anonfun$apply$mcV$sp$1.apply(SimpleConsumer.scala:112)
    at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:33)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply$mcV$sp(SimpleConsumer.scala:111)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply(SimpleConsumer.scala:111)
    at kafka.consumer.SimpleConsumer$$anonfun$fetch$1.apply(SimpleConsumer.scala:111)
    at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:33)
    at kafka.consumer.SimpleConsumer.fetch(SimpleConsumer.scala:110)
    at kafka.server.AbstractFetcherThread.processFetchRequest(AbstractFetcherThread.scala:94)
    at kafka.server.AbstractFetcherThread.doWork(AbstractFetcherThread.scala:86)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)

Thread 27651 "analytics-group_Philipp.local-1458441725398-581eabc3-leader-finder-thread": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at kafka.consumer.ConsumerFetcherManager$LeaderFinderThread.doWork(ConsumerFetcherManager.scala:61)
    at kafka.utils.ShutdownableThread.run(ShutdownableThread.scala:60)

Thread 27139 "analytics-group_Philipp.local-1458441725398-581eabc3_watcher_executor": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2163)
    at kafka.consumer.ZookeeperConsumerConnector$ZKRebalancerListener$$anon$1.run(ZookeeperConsumerConnector.scala:544)

Thread 26115 "kafka-consumer-scheduler-0": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Thread 25603 "main-EventThread": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.apache.zookeeper.ClientCnxn$EventThread.run(ClientCnxn.java:494)

Thread 25091 "main-SendThread(localhost:2181)": (state = IN_NATIVE)
    at sun.nio.ch.KQueueArrayWrapper.kevent0(Native Method)
    at sun.nio.ch.KQueueArrayWrapper.poll(KQueueArrayWrapper.java:198)
    at sun.nio.ch.KQueueSelectorImpl.doSelect(KQueueSelectorImpl.java:117)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    - locked <0x00000006c0022c50> (a sun.nio.ch.Util$2)
    - locked <0x00000006c0022c60> (a java.util.Collections$UnmodifiableSet)
    - locked <0x00000006c0022c00> (a sun.nio.ch.KQueueSelectorImpl)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:349)
    at org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1081)

Thread 24579 "ZkClient-EventThread-16-localhost:2181": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:442)
    at org.I0Itec.zkclient.ZkEventThread.run(ZkEventThread.java:67)

Thread 24067 "metrics-meter-tick-thread-2": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1088)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Thread 23555 "metrics-meter-tick-thread-1": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Thread 23303 "pool-1-thread-1": (state = BLOCKED)
    at sun.misc.Unsafe.park(Native Method)
    at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093)
    at java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809)
    at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1067)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1127)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

VM Thread 20995 "Service Thread": (state = BLOCKED)

VM Thread 20483 "C1 CompilerThread3": (state = BLOCKED)

VM Thread 19971 "C2 CompilerThread2": (state = IN_NATIVE)

VM Thread 19459 "C2 CompilerThread1": (state = IN_NATIVE)

VM Thread 18947 "C2 CompilerThread0": (state = IN_NATIVE)

Thread 15887 "Signal Dispatcher": (state = BLOCKED)

Thread 14339 "Finalizer": (state = BLOCKED)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000006c005fa88> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
    - locked <0x00000006c005fa88> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
    at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209)

Thread 13827 "Reference Handler": (state = BLOCKED)
    at java.lang.Object.wait(Native Method)
    - waiting on <0x00000006c0029358> (a java.lang.ref.Reference$Lock)
    at java.lang.Object.wait(Object.java:502)
    at java.lang.ref.Reference.tryHandlePending(Reference.java:191)
    - locked <0x00000006c0029358> (a java.lang.ref.Reference$Lock)
    at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:153)

Thread 2823 "main": (state = BLOCKED)
    at java.lang.Thread.sleep(Native Method)
    at com.sosse.analytics.ActivityProducer.sleep(ActivityProducer.java:110)
    at com.sosse.analytics.DemoMain$1.startApplication(DemoMain.java:37)
    at com.sosse.common.application.DefaultApplication.start(DefaultApplication.java:166)
    - locked <0x00000006c00e6080> (a java.lang.Thread)
    at com.sosse.common.application.DefaultApplication.start(DefaultApplication.java:118)
    at com.sosse.analytics.DemoMain.main(DemoMain.java:48)

编辑(4):源代码反序列化器

public static Object[] deserialize(final JsonElement jsonElement, final JsonDeserializationContext context, final BiFunction<Class<?>, JsonElement, Serializable[]> timeSeriesDeserializer) {
    final JsonObject jsonObject = jsonElement.getAsJsonObject();

    // get the important classes
    final Class<?> bucketContent = resolveClass("bucketContent", jsonObject, context);

    // configuration
    final TimeUnit timeUnit = context.deserialize(jsonObject.get("timeUnit"), TimeUnit.class);
    final int bucketSize = context.deserialize(jsonObject.get("bucketSize"), int.class);
    final boolean fillNumberWithZero = context.deserialize(jsonObject.get("fillNumberWithZero"), boolean.class);

    // the values
    final Long now = context.deserialize(jsonObject.get("now"), Long.class);
    final Serializable[] timeSeries = timeSeriesDeserializer.apply(bucketContent, jsonObject.get("timeSeries"));

    @SuppressWarnings("unchecked")
    final BucketTimeSeriesConfig config = new BucketTimeSeriesConfig(bucketContent, timeUnit, timeSeries.length, bucketSize, fillNumberWithZero);
    return new Object[]{config, timeSeries, now};
}

请您提供完整的 hs_err_pid.log 日志文件,可以吗? - apangin
我在这里粘贴了hs_err_pid和replay_pid:http://pastebin.com/sCAvSMp9 和 http://pastebin.com/eUrvzt5f - Philipp
3个回答

21

崩溃报告显示错误发生在JIT编译器线程中:

Current thread (0x00007f89e481c800):  JavaThread "C2 CompilerThread1"

诊断编译器问题的步骤如下:

  1. 尝试使用JDK 9 EA中提供的最新JVM版本:https://jdk9.java.net/download/

    如果问题消失了,你可以选择继续使用这个版本或者尝试定位解决问题的确切提交,并将其移植到JDK 8中。如何移植修复程序和如何自己构建HotSpot - 这是一个单独的主题,但如果您有兴趣我可以告诉您。

  2. 如果问题仍然存在,请尝试查找问题方法并将其从编译中排除。

    Current CompileTask: C2: 114667 5303 4 com.sosse.time.timeseries.gson.TypeConverterHelper::deserialize (157 bytes)
    

    看起来在您的情况下,编译失败了TypeConverterHelper.deserialize()。 添加以下JVM选项以排除此特定方法:

    似乎在你的情况下,TypeConverterHelper.deserialize()编译失败了。请添加以下JVM选项以排除这个特定的方法:

    -XX:CompileCommand=exclude,com.sosse.time.timeseries.gson.TypeConverterHelper::deserialize
    
  3. 如果这些方法都没能解决问题,可以尝试通过提供多个 -XX:CompileCommand 来排除更多的方法。要查找要排除的方法,请使用 -XX:+PrintCompilation 并查看打印列表底部的内容。您也可以排除整个类和包名,例如:

  4. -XX:CompileCommand=exclude,com.sosse.time.timeseries.gson.*::*
    
  5. 尝试逐个禁用某些编译器优化选项,可以尝试以下几种选项:

  6. -XX:-DoEscapeAnalysis
    -XX:LoopUnrollLimit=0
    -XX:-PartialPeelLoop
    -XX:-UseLoopPredicate
    -XX:-LoopUnswitching
    -XX:-ReassociateInvariants
    -XX:MaxInlineLevel=1
    -XX:-IncrementalInline
    -XX:-RangeCheckElimination
    -XX:-EliminateAllocations
    -XX:-UseTypeProfile
    -XX:AliasLevel=0
    
  7. 无论是否发现存在问题的方法/优化,都需要再次运行JVM

    -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation
    

    此命令将在当前目录下创建名为hotspot_pid1234.log的文件,其中包含详细的编译日志。

  8. 请在bugreport.java.com提交错误报告。选择

  9. Product/Category: HotSpot Virtual Machine (errors)
    Subcategory:      J2SE Server Compiler
    

    请确保在第5步中包含完整的hs_err_pid.loghotspot_pid.log。如果您能提供一个简化且自包含的演示问题的示例,将非常有帮助。

    为了更快的响应,您也可以在hotspot-compiler-dev邮件列表中发布消息。


除了排除该方法之外,JVM不再崩溃!谢谢这个提示。我将尝试让应用程序在Java 9环境下运行,以查看是否仍会出现错误。我会及时更新。 - Philipp
根据这个bug:https://bugs.openjdk.java.net/browse/JDK-8152161,我无法在Java 9上运行该应用程序。 - Philipp
1
目前正在开发应用程序的简化版本。不过有点困难,因为如果我删除某些循环,崩溃就会消失。我会让你保持更新。 - Philipp

5

看起来像是JDK的一个bug JDK-6675699。根据bug报告,该bug的修复已经被反向移植到8u74、8u81和8u82。

请注意(截至目前),面向最终用户的Java下载站点提供8u73作为最新版本。您可以从Java开发人员下载站点获取8u74。


如果更新到8u74不能解决问题,那么您应该将其提交给Oracle作为错误报告。可能的诊断是,您正在运行导致JIT代码编译器在尝试编译/优化时崩溃的代码。这就是“PhaseIdealLoop :: idom_no_update”所指示的内容。
JDK-6675699是针对特定JIT编译器错误的。可能还有其他未被诊断的JIT编译器错误。如果您提交新的错误报告,可以帮助维护者跟踪这些错误。但是,只有当您能够提供足够的信息以允许他们重现您的错误时,错误报告才对他们有用。
(当然,根本原因也可能是完全不同的东西;例如,您的代码或第三方代码可能会破坏JVM数据结构,从而导致编译器崩溃。但它将是一种巨大的巧合,使得这些损坏可重复地破坏编译器...而只有编译器。)

更新 - 根据这些发行说明,您实际需要的版本是Java SE 8u74-b32。


谢谢回复!我非常感激,因为我已经在这个问题上工作了一个星期。8u74没有解决问题,JVM仍然崩溃。 - Philipp
有没有办法使用不同类型的编译器?只是为了限制可能的原因。你有什么想法,我可以尝试至少找到一个解决方法吗?再次非常感谢任何帮助! - Philipp
1
你可以通过使用"-Cint"选项完全关闭JIT编译器。还有很多其他选项可能会有所帮助...如果适当地使用的话。请参考http://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html。 - Stephen C
当我使用-Xint关闭JIT编译器时,崩溃就不会再发生了!那么这是否意味着问题与Oracle Bug有关,还是我可以以某种方式确保JIT编译器仍然可以在不崩溃的情况下使用VM。我正在努力找出问题可能是什么 :(。 - Philipp
  1. 这并不一定意味着那样。但它确实暗示可能是这种情况。
  2. 尝试调整一些相关的-XX参数;例如与内联和循环展开有关的参数。或者使用-XX:CompileCommand = exclude,...来阻止编译器编译某些有问题的方法。
- Stephen C
如果您拥有Oracle Java支持合同,可以向他们寻求建议。向您的经理提出提示。 - Stephen C

1
我认为你应该花些时间分析核心。 分段错误 这可能有几个原因。JVM本身可能存在漏洞,或者包中存在漏洞(其中一些是用C或C++编写的)。也可能是由于不兼容的组件一起使用而导致配置错误。
从经验上看,JVM漏洞是最不可能的。虽然@Stephen认为这里可能是这种情况。
如果在崩溃点捕获堆栈跟踪,这可能会给您一些关于崩溃发生的确切位置的线索。
首先,我看到您需要配置ulimit -c无限制,以便将核心文件存储到磁盘中。 分析核心文件
一旦您这样做,您应该使用以下方法分析核心。
要转换文件,请使用命令行工具jmap。
jmap -dump:format=b,file=dump.hprof /usr/bin/java core_file

where:

dump.hprof 是您希望创建的 hprof 文件的名称

/usr/bin/java 是生成核心转储的 java 二进制文件的路径


谢谢!我正在努力获取核心转储并会尽快回复您!感谢您的快速回复和帮助! - Philipp
太好了。请在这里发布您的发现。我很想看看您在使用Kafka时遇到了什么问题。 - The Roy
在崩溃报告(hs_err_pidxxxx.log)中,可以找到导致崩溃的类和方法名称,就在--------------- P R O C E S S ---------------上方。hs_err_pid日志文件是当JVM发生致命错误时产生的错误日志文件,通常位于进程的工作目录或操作系统的临时目录中。该文件顶部包含崩溃原因和“有问题的帧”。例如,我的显示: - The Roy
不确定。我认为这是一个可报告的事件。我找不到com.sosse.time.timeseries.gson包的源代码。它发生在反序列化例程中。也许尝试使用Apache Kafka进行报告,以及JIT编译器错误。虽然我认为这与前者有关而不是后者。看起来像是在尝试处理gson输入时与反序列化相关的方面。 - The Roy
1
你可能想尝试的另一件事是使用标志-XX:-PartialPeelLoop,因为有类似的错误报告,并且该标志应该“跳过”有问题的编译器代码。 - The Roy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接