当垃圾收集期间JVM崩溃(段错误)时,如何找出收集的内容?

时间:2011-11-11 16:18:34

标签: java garbage-collection jvm segmentation-fault java-native-interface

我在JVM中的大致在应用程序的相同阶段获得了段错误,但崩溃报告中的堆栈跟踪不同。但是,在GC期间似乎总会发生这种情况。

由于崩溃发生在我尝试过的所有三个JVM(OpenJDK 6,Oracle 1.6.0_25和1.7.0)以及每个都有两个GC(并行收集器和CMS),它发生在应用程序的同一区域,我想通过,如果我能找到GC试图收集的内容,我可能会发现我的代码中存在一些导致此崩溃的特性。

  • 是否存在众所周知的GC编码习惯?
  • 有哪些方法可用于诊断此问题?
  • 我是否可以对我的应用程序在何处触发此问题进行任何有根据的猜测?
  • 我可以使用哪些(GC调整)参数来缩小问题范围?
  • 有没有办法在堆转储中发现(可能)有问题的数据?

4 个答案:

答案 0 :(得分:8)

如果您有错误处理内存的JNI库,则会发生这种情况。问题没有立即显示。但是,执行GC时,它会扫描所有内存,跳过损坏的引用并杀死JVM。即自上次完整GC以来的任何时候都可能发生腐败。

答案 1 :(得分:1)

  • seg故障在转储开始时具有特定的错误代码 http://en.wikipedia.org/wiki/Segmentation_fault

  • 您可以使用Thread.dumpStackTrace查看该应用程序中发生的情况 如果您确切知道应用程序冻结或在某个操作或事件后要冻结的位置,您可以按CTRL +中断窗口或CTRL + \以获取线程转储并查看发生了什么。

  • 而不是模糊地猜测你可以注释掉代码的某些部分,以找出哪个循环或对象或缓冲区或字符串花费的时间太长

  • 根据您的情况,您可以考虑使用某些特定工具。

答案 2 :(得分:0)

  • 我建议你同时获得线程转储和堆转储,你可以从命令行执行此操作,使用像Visual VM这样的工具
  • 我认为Hemp dump是JVM内存的快照,它将提供有关实时对象及其分配的信息。如果使用Visual VM分析堆,它会提供有关堆上所有对象的详细报告
  • 我建议您在应用程序上使用像tagtraum
  • 这样的工具进行详细和分析。
  • 如果您可以附加可提供大量信息的JVM profiler,或者如果您对导致问题的工作流程有一般了解,那么只需将其分开进行分析

答案 3 :(得分:0)

我们也面临着类似的问题。没有我们可以看到的模式,它是随机的,但发生在GC或Full GC上。对我们来说,事实证明是RAM模块的一个问题。我们在Ubuntu服务器上使用MemTest86 +识别它。