solve/debug JVM 崩溃的最佳方法 (SIGSEGV)
Best way on how to solve/debug JVM crash (SIGSEGV)
我真的很迷茫,我不知道如何去面对和解决我的问题。我有一段简单的 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 东西(据我所知,使用的第 3 方库也不使用任何 JNI)。
我从未遇到过这个问题,但我会 love/need 找到一种方法来找出问题所在。我已经使用了其他版本的 JVM(Java 8.0_66、8.0_73-b02 和 8.0_74-b02)。那我该怎么办?非常感谢!
编辑 (1): 有时我也会得到以下 error/info:
...
# 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 导致另一个错误:"Error attaching to core file: Can't attach to the core file")。使用 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.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(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$$anonfun$apply$mcV$sp.apply$mcV$sp(SimpleConsumer.scala:112)
at kafka.consumer.SimpleConsumer$$anonfun$fetch$$anonfun$apply$mcV$sp.apply(SimpleConsumer.scala:112)
at kafka.consumer.SimpleConsumer$$anonfun$fetch$$anonfun$apply$mcV$sp.apply(SimpleConsumer.scala:112)
at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:33)
at kafka.consumer.SimpleConsumer$$anonfun$fetch.apply$mcV$sp(SimpleConsumer.scala:111)
at kafka.consumer.SimpleConsumer$$anonfun$fetch.apply(SimpleConsumer.scala:111)
at kafka.consumer.SimpleConsumer$$anonfun$fetch.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.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)
- 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.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};
}
看起来像 JDK 错误 JDK-6675699。根据错误报告,该错误的修复已反向移植到 8u74、8u81 和 8u82。
请注意(截至目前)最终用户关注 Java Download Site offers 8u73 as the latest version. You can get 8u74 from the Java Developer Download Site。
如果更新到 8u74 不能解决问题,那么您应该将其作为错误报告提交给 Oracle。可能的诊断是您的 运行 代码导致 JIT 代码编译器在尝试编译/优化它时崩溃。这就是 PhaseIdealLoop::idom_no_update
所指示的。
JDK-6675699 针对特定的 JIT 编译器错误。很可能还有其他尚未诊断的 JIT 编译器错误。如果您提交新的错误报告,它可以帮助维护人员追踪这些错误。但是,只有当您可以提供足够的信息让他们重现您的错误时,错误报告才会对他们有用。
(当然,根本原因也可能是完全不同的东西;例如,您的代码中的某些第三方代码破坏了导致编译器崩溃的 JVM 数据结构。但这将是一个巨大的巧合因为腐败会反复破坏编译器……而且只有编译器。)
更新 - 根据这些Release Notes,您实际需要的版本是Java SE 8u74-b32。
我觉得你应该花点时间分析内核。
段错误
这有几个可能的原因。 JVM 本身或包中可能存在错误(其中一些是用 C 或 C++ 编写的)。也可能是由于一起使用了不兼容组件的错误配置。
根据经验,JVM 错误是其中可能性最小的。尽管@Stephen 认为这里很可能是这种情况。
如果您在崩溃时捕获堆栈跟踪,这可能会为您提供一些关于崩溃发生的确切位置的线索。
首先,我看到您需要配置 ulimit -c unlimited 以便您可以将核心文件存储到磁盘。
分析核心文件
完成后,您应该使用以下方法分析核心。
要转换文件,请使用命令行工具 jmap。
jmap -dump:format=b,file=dump.hprof /usr/bin/java core_file
其中:
dump.hprof 是您要创建的 hprof 文件的名称
/usr/bin/java 是生成核心转储
的 java 二进制版本的路径
崩溃报告告诉 JIT 编译器线程中发生了错误:
Current thread (0x00007f89e481c800): JavaThread "C2 CompilerThread1"
按照以下步骤诊断编译器问题:
尝试 JDK9 EA 中可用的最新 JVM 构建:https://jdk9.java.net/download/
如果问题消失,您可以继续使用此版本或尝试找到解决问题的确切提交,然后将其反向移植到 JDK 8. 如何反向移植修复以及如何自己构建 HotSpot - 这是一个单独的话题,但我知道你是否感兴趣。
如果问题仍然存在,请尝试找到有问题的方法并将其排除在编译之外。
Current CompileTask: C2: 114667 5303 4 com.sosse.time.timeseries.gson.TypeConverterHelper::deserialize (157 bytes)
看起来你的情况编译失败 TypeConverterHelper.deserialize()
。添加以下 JVM 选项以排除此特定方法:
-XX:CompileCommand=exclude,com.sosse.time.timeseries.gson.TypeConverterHelper::deserialize
如果没有帮助,请尝试通过提供多个 -XX:CompileCommand
来排除更多方法。要查找要排除的候选人,请使用 -XX:+PrintCompilation
并查看打印列表的底部。您还可以从编译中排除整个 类 和包,例如
-XX:CompileCommand=exclude,com.sosse.time.timeseries.gson.*::*
尝试一项一项地禁用某些编译器优化。可以尝试的一些选项是:
-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
是否发现有问题的method/optimization,运行JVM再次用
-XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation
这将在当前目录中创建 hotspot_pid1234.log
文件,其中包含详细的编译日志。
在 bugreport.java.com 提交错误报告。 Select
Product/Category: HotSpot Virtual Machine (errors)
Subcategory: J2SE Server Compiler
确保包括第 5 步中的完整 hs_err_pid.log
和 hotspot_pid.log
。如果您能提供一个简化的独立示例来演示问题,那将非常有帮助。
为了获得更快的反应,您还可以 post 向 hotspot-compiler-dev 邮件列表发送消息。
我真的很迷茫,我不知道如何去面对和解决我的问题。我有一段简单的 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 东西(据我所知,使用的第 3 方库也不使用任何 JNI)。
我从未遇到过这个问题,但我会 love/need 找到一种方法来找出问题所在。我已经使用了其他版本的 JVM(Java 8.0_66、8.0_73-b02 和 8.0_74-b02)。那我该怎么办?非常感谢!
编辑 (1): 有时我也会得到以下 error/info:
...
# 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 导致另一个错误:"Error attaching to core file: Can't attach to the core file")。使用 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.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(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$$anonfun$apply$mcV$sp.apply$mcV$sp(SimpleConsumer.scala:112)
at kafka.consumer.SimpleConsumer$$anonfun$fetch$$anonfun$apply$mcV$sp.apply(SimpleConsumer.scala:112)
at kafka.consumer.SimpleConsumer$$anonfun$fetch$$anonfun$apply$mcV$sp.apply(SimpleConsumer.scala:112)
at kafka.metrics.KafkaTimer.time(KafkaTimer.scala:33)
at kafka.consumer.SimpleConsumer$$anonfun$fetch.apply$mcV$sp(SimpleConsumer.scala:111)
at kafka.consumer.SimpleConsumer$$anonfun$fetch.apply(SimpleConsumer.scala:111)
at kafka.consumer.SimpleConsumer$$anonfun$fetch.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.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)
- 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.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};
}
看起来像 JDK 错误 JDK-6675699。根据错误报告,该错误的修复已反向移植到 8u74、8u81 和 8u82。
请注意(截至目前)最终用户关注 Java Download Site offers 8u73 as the latest version. You can get 8u74 from the Java Developer Download Site。
如果更新到 8u74 不能解决问题,那么您应该将其作为错误报告提交给 Oracle。可能的诊断是您的 运行 代码导致 JIT 代码编译器在尝试编译/优化它时崩溃。这就是 PhaseIdealLoop::idom_no_update
所指示的。
JDK-6675699 针对特定的 JIT 编译器错误。很可能还有其他尚未诊断的 JIT 编译器错误。如果您提交新的错误报告,它可以帮助维护人员追踪这些错误。但是,只有当您可以提供足够的信息让他们重现您的错误时,错误报告才会对他们有用。
(当然,根本原因也可能是完全不同的东西;例如,您的代码中的某些第三方代码破坏了导致编译器崩溃的 JVM 数据结构。但这将是一个巨大的巧合因为腐败会反复破坏编译器……而且只有编译器。)
更新 - 根据这些Release Notes,您实际需要的版本是Java SE 8u74-b32。
我觉得你应该花点时间分析内核。
段错误
这有几个可能的原因。 JVM 本身或包中可能存在错误(其中一些是用 C 或 C++ 编写的)。也可能是由于一起使用了不兼容组件的错误配置。
根据经验,JVM 错误是其中可能性最小的。尽管@Stephen 认为这里很可能是这种情况。
如果您在崩溃时捕获堆栈跟踪,这可能会为您提供一些关于崩溃发生的确切位置的线索。
首先,我看到您需要配置 ulimit -c unlimited 以便您可以将核心文件存储到磁盘。
分析核心文件
完成后,您应该使用以下方法分析核心。
要转换文件,请使用命令行工具 jmap。
jmap -dump:format=b,file=dump.hprof /usr/bin/java core_file
其中:
dump.hprof 是您要创建的 hprof 文件的名称
/usr/bin/java 是生成核心转储
的 java 二进制版本的路径崩溃报告告诉 JIT 编译器线程中发生了错误:
Current thread (0x00007f89e481c800): JavaThread "C2 CompilerThread1"
按照以下步骤诊断编译器问题:
尝试 JDK9 EA 中可用的最新 JVM 构建:https://jdk9.java.net/download/
如果问题消失,您可以继续使用此版本或尝试找到解决问题的确切提交,然后将其反向移植到 JDK 8. 如何反向移植修复以及如何自己构建 HotSpot - 这是一个单独的话题,但我知道你是否感兴趣。
如果问题仍然存在,请尝试找到有问题的方法并将其排除在编译之外。
Current CompileTask: C2: 114667 5303 4 com.sosse.time.timeseries.gson.TypeConverterHelper::deserialize (157 bytes)
看起来你的情况编译失败
TypeConverterHelper.deserialize()
。添加以下 JVM 选项以排除此特定方法:-XX:CompileCommand=exclude,com.sosse.time.timeseries.gson.TypeConverterHelper::deserialize
如果没有帮助,请尝试通过提供多个
-XX:CompileCommand
来排除更多方法。要查找要排除的候选人,请使用-XX:+PrintCompilation
并查看打印列表的底部。您还可以从编译中排除整个 类 和包,例如-XX:CompileCommand=exclude,com.sosse.time.timeseries.gson.*::*
尝试一项一项地禁用某些编译器优化。可以尝试的一些选项是:
-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
是否发现有问题的method/optimization,运行JVM再次用
-XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation
这将在当前目录中创建
hotspot_pid1234.log
文件,其中包含详细的编译日志。在 bugreport.java.com 提交错误报告。 Select
Product/Category: HotSpot Virtual Machine (errors) Subcategory: J2SE Server Compiler
确保包括第 5 步中的完整
hs_err_pid.log
和hotspot_pid.log
。如果您能提供一个简化的独立示例来演示问题,那将非常有帮助。为了获得更快的反应,您还可以 post 向 hotspot-compiler-dev 邮件列表发送消息。