When the JRockit JVM crashes, it creates snapshots of the state of the computer and the JVM process at the time of the crash. These snapshots are in the form of two crash files: a text crash file (.dump
); and a binary crash file (.mdmp
, a Windows platform minidump or .core
, a Linux and Solaris platform core file). The names of the crash files are jrockit.
pid
.dump
and jrockit.
pid
.mdmp
/core
, where pid
is the process ID (for example, jrockit.72.dump
).
You can use information in the crash files to determine the problem that caused the JVM to crash. The information in the crash files is also essential for Oracle Support personnel to help troubleshoot problems with the JVM.
This chapter provides information about the differences between the crash files and how to enable and disable them. It also provides an example of a text crash file and describes how you can use the text crash file for troubleshooting.
This chapter contains the following topics:
Section 8.1, "Differences Between Text and Binary Crash Files"
Section 8.7, "Generating Java Heap Dumps in the HPROF Binary Format"
You can open the text crash file (.dump
) in any text editor. It contains information that can provide hints about the reasons for the crash (see Section 8.6.2, "Example of a Text Dump File."
You can open the binary crash file (.core
or .mdmp
) in a debugger. The crash file contains information about the entire JRockit JVM process.
Creation of crash files is enabled by default.
On Linux and Solaris systems, you must set ulimit
-c
to a value greater than zero (recommendation: ulimit -c unlimited
). This value is measured in blocks, with each block equaling one kilobyte. You can specify the value from either the command line or a shell script.
The text and binary crash files are saved to the current working directory.
If you want the crash files to be saved in a different directory, specify the directory by using the JROCKIT_DUMP_PATH
environment variable.
On Linux and Solaris:
export JROCKIT_DUMP_PATH=path_to_directory
On Windows:
set JROCKIT_DUMP_PATH=path_to_directory
The directory that you specify must exist and must be writable.
The text crash file is a small file, usually under 100KB. The binary crash file, however, is usually very large because, by default, the JRockit JVM logs the entire JVM process in the binary crash file. So you must ensure that there is adequate disk space for the binary crash file to be written to the disk.
You can set the size of the crash file by using the -XXdumpSize
command-line option. The default setting is -XXdumpSize:large
, which results in a binary crash file that contains information about the entire JVM process, including the Java heap. While small
and normal
settings are also available, neither of these sizes are adequate for troubleshooting a JVM crash, because, with these settings, the Java heap is excluded from the crash file.
If the disk on which the crash file is written does not have enough space for the binary crash file, the file becomes as large as possible; that is, it fills up the disk.
Figure 8-2 illustrates the differences in information between small, normal, and large binary crash files.
Note:
When you contact Oracle Support, you must provide a large binary crash file.Creation of crash files is enabled by default, so that, if a crash occurs, you can be sure to get as much information as possible about the application and the JRockit JVM process. At times, however, you might want to disable the creation of crash files (for example, when you have limited disk space).
Before disabling the creation of the crash files, note that the text crash file is a small, useful source of information to get an initial understanding of what could be wrong with the JVM. The binary crash file is essential when you contact Oracle Support.
You can disable creation of the text crash file by using the -XX:-DumpOnCrash
command-line option.
You can disable creation of the binary crash file by using the -XX:-CoreOnCrash
command-line option.
A JVM crash indicates that something happened that the JVM could not handle gracefully. The crash could be caused by a programming error in the JVM, a problem in the Java code, a problem in the JVM setup, or third-party libraries loaded in the JVM process.
The text crash file .dump
is a good starting point to diagnose the problem.
A text crash file does not necessarily tell you exactly why the crash occurred, but it describes the environment in which the JRockit JVM was running and the state of the JVM when the crash occurred.
The following are a few easily identifiable symptoms that you can look for in the text crash file:
If the StackOverFlow
field indicates that stack overflow errors have occurred, the crash is likely to have been caused by a stack overflow.
Look for reports of Stack Overflow
in the Error message
field or in the stack trace near the bottom of the crash file. Such occurrences might also indicate a stack overflow.
For information about troubleshooting a crash caused by a stack overflow, see Section 6.3, "Stack Overflow Crash."
If the C Heap
field indicates that memory allocations have failed, the process might have run out of virtual memory. For information about troubleshooting crashes caused by virtual memory errors, see Section 6.2, "Out-Of-Virtual-Memory Crash."
If the text crash file shows a symptom different from the symptoms described in this section, try troubleshooting by using the information in Section 6.5, "JVM Crash."
This section provides an example of a text crash file (.dump
) and describes its parts.
Note that the text crash file does not provide a detailed description of what happened during the crash. The layout of the file that the JVM produces might differ from the layout shown in the example.
Table 8-1 Example of a Text Crash File (.dump)
Section | Contents |
---|---|
===== BEGIN DUMP ============================================================= JRockit dump produced after 0 days, 00:00:01 on Mon Dec 7 16:28:40 2009 Additional information is available in: /localhome/mycomp/gdbtest/jrockit.17470.dump /localhome/mycomp/gdbtest/core or core.17470 |
|
Error Message: Illegal memory access. [54] Signal info : si_signo=11, si_code=1 si_addr=0x7 |
|
Version : Oracle JRockit(R) R28.0.0-606-124955-1.6.0_17-20091130-2120-linux-ia32 |
|
CPU : Intel Pentium 4 (HT) SSE SSE2 NetBurst Number CPUs : 8 Tot Phys Mem : 8248045568 (7865 MB) |
|
OS version : Red Hat Enterprise Linux AS release 4 (Nahant Update 8) Linux version 2.6.9-89.0.0.0.1.ELsmp (mockbuild@ca-build10.us.oracle.com) (gcc version 3.4.6 20060404 (Red Hat 3.4.6-11.0.1)) #1 SMP Tue May 19 04:23:49 EDT 2009 (i686) |
|
Thread System: Linux NPTL LibC release : 2.3.4-stable Java locking : Lazy unlocking enabled (class banning) (transfer banning) State : JVM is running |
|
Command Line : -Djava.library.path=. -Dsun.java.launcher=SUN_STANDARD Crash -static write |
|
java.home : /localhome/jrockits/R28.0.0_R28.0.0-606_1.6.0/jre j.class.path : . j.lib.path : . JAVA_HOME : /localhome/jrockits/R27.6.3_R27.6.3-40_1.6.0 LD_LIBRARY_PATH: /localhome/jrockits/R28.0.0_R28.0.0-606 _1.6.0/jre/lib/i386/jrockit:/localhome/jrockits/R28.0.0 _R28.0.0-606_1.6.0/jre/lib/i386:/localhome/jrockits/R28.0.0 _R28.0.0-606_1.6.0/jre/../lib/i386 |
|
GC Strategy : Mode: throughput, with strategy: genparpar (basic strategy: genparpar) GC Status : OC is not running. Last finished OC was OC#0. : YC is not running. Last finished YC was YC#0. YC History : Ran 0 YCs since last OC. Heap : 0x76eb7000 - 0x7aeb7000 (Size: 64 MB) Compaction : (no compaction area) NurseryList : 0x76eb7000 - 0x78eb7000 KeepArea : 0x786b6fe8 - 0x78eb7000 KA Markers : [ 0x77eb6ff0, 0x786b6fe8 , 0x78eb7000 ] |
|
Registers (from ThreadContext: 0xb7ba4e60: eax = 00000007 ecx = b7ba519c edx = 00000000 ebx = b7ba6f70 esp = b7ba514c ebp = b7ba5150 esi = b7ba5178 edi = b7ba70f4 es = 0000007b cs = 00000073 ss = 0000007b ds = 0000007b fs = 00000000 gs = 00000033 eip = 74405765 eflags = 00000292 Stack:(* marks the word pointed to by the stack pointer) b7ba514c: 00000007* b7ba5170 7440584c 00000007 b7ba6f70 00000001 b7ba5164: 74bb4405 00000007 00000000 00000001 746a9f80 b7ba70f4 b7ba517c: b7ba519c 00000007 00000000 74bb4400 744842a0 746a9f7b b7ba5194: b7ba7228 b7ba5178 770643d0 b7ba6f70 00000001 770650d8 |
|
Thread: "Main Thread" id=1 idx=0x4 tid=17471 lastJavaFrame=0xb7ba518c Stack 0: start=0xb71a5000, end=0xb7ba6000, guards=0xb71aa000 (ok), forbidden=0xb71a8000 Thread Stack Trace: at write+15()@0x74405765 at Java_Crash_staticWrite+28()@0x7440584c -- Java stack -- at Crash.staticWrite(J)V(Native Method)[optimized] at Crash.run(Crash.java:62) at Crash.main(Crash.java:121) at jrockit/vm/RNI.c2java(IIIII)V(Native Method)[optimized] -- end of trace |
|
Memory usage report: Total mapped 1133412KB (reserved=0KB) - Java heap 1048576KB (reserved=983040KB) - GC tables 35084KB - Thread stacks 13332KB (#threads=18) - Compiled code 384KB (used=256KB) - Internal 520KB - OS 7996KB - Other 0KB - JRockit malloc 24448KB (malloced=24397KB #290077) Does not track allocation sites! - Native memory tracking 1024KB (malloced=46KB #11) Does not track allocation sites! - Java class data 2048KB (malloced=1820KB #2455) Does not track allocation sites! Set the env variable TRACE_ALLOC_SITES=1 or use the print_memusage switch trace_alloc_sites=1 to enable alloc site tracing. |
Beginning of the Text Crash File
This part of the .dump
file contains information about when the crash occurred and for how long the JVM has been running.
It also provides a link to information to help you troubleshoot the crash.
The file locations refer to the locations of the text and binary crash files.
Error Message from the Operating System
This part of the .dump
file contains the error message that the operation threw at the time of the crash. For more information about the error, see the documentation for your operating system.
This part of the .dump
file indicates the release number of the JRockit JVM.
This part of the .dump
file indicates the CPU in the system, the number of CPUs used, and the amount of memory consumed by the Java process, application, or the JRockit JVM.
Operating System Version Information
This part of the .dump
file indicates the version of the operating system on which the JRockit JVM is running. Ensure that the JRockit JVM is running on a supported operating system.
For more information, see the see Oracle JRockit JDK Supported Configurations at http://www.oracle.com/technology/software/products/ias/files/fusion_certification.html
.
This part of the .dump
file indicates the thread system that the JRockit JVM used at the time of the crash and the state of the JVM. In this example, the JVM used the Native POSIX Thread Library (NPTL).
Command-Line Option Information
This part of the .dump
file shows all the command-line options that were used at JVM startup.
This part of the .dump
file provides information about the JVM environment:
JAVA_HOME
is the path to the Java home catalog; that is, the directory in which the JRockit JVM is installed.
_JAVA_OPTIONS
shows command-line options that are automatically passed to all newly started JRockit JVMs.
LD_LIBRARY_PATH
is a Linux- and Solaris-specific environment variable that can make the JRockit JVM find libraries other than the default system libraries. Sometimes, you might have to set this variable for running JNI code.
Garbage Collection Information
This part of the .dump
file indicates the garbage collection mode.
Depending on the garbage collection mode used, this part of the .dump
file might show other information such as the location of the nursery and keep area in the memory.
Registers and Stack Information
This part of the .dump
file provides the following information:
The Registers
section is useful to Oracle Support personnel for troubleshooting. If the value of the esp
register does not match the first number of the stack, the text crash file could be incorrect.
If the Stack
section shows unreadable
, the crash is probably due to a stack overflow. The stack information is usually much longer than that shown in the example.
Thread Stack Trace Information
This part of the .dump
file shows what the crashed thread was doing when the JRockit JVM crashed.
This part of the .dump
file shows details of memory usage (including native memory).
HPROF is a heap profiling tool that produces heap dumps in a specific format that heap analysis tools can parse.
You can set up the Oracle JRockit JVM to produce a dump of the Java heap in the HPROF binary format by using the following command-line options:
-XX:+HeapDumpOnOutOfMemoryError
: Enables generation of Java heap dumps when out-of-memory errors occur.
-XX:+HeapDumpOnCtrlBreak
: Enables generation of Java heap dumps when you press Ctrl-Break
.
For more information about these and other related command-line options, see the Oracle JRockit Command-Line Reference.
You can also generate an HPROF-formatted dump of the Java heap by using the hprof
diagnostic command. For more information, see Oracle JRockit JDK Tools.
For information about the HPROF tool, see http://java.sun.com/developer/technicalArticles/Programming/HPROF.html
.