Thursday, November 12, 2009

Steps to Troubleshoot Typical Java Problems

Steps To Troubleshoot Typical Java Problems


This section list some typical java problems and the actions we need to perform, the tools we need to use to collect more information and/or to analyse and debug the problem.


Hung, Deadlocked, or Looping Process

  • Print thread stack for all Java threads.
    • Control-\
  • Print thread trace for a process.
    • kill -QUIT pid
    • jstack -F pid (with -F option if pid does not respond)
  • Detect deadlocks.
    • JConsole tool, Threads tab
    • Print information on deadlocked threads: Control-\
    • Print lock information for a process: jstack -l pid
  • Get a heap histogram for a process.
    • Start Java process with -XX:+PrintClassHistogram, then Control-\
    • Start Java process with -XX:+PrintClassHistogram, then kill -QUIT pid
    • jmap -histo pid (with -F option if pid does not respond)
  • Dump Java heap for a process in binary format to file.
    • jmap -dump:format=b,file=filename pid (with -F option if pid does not respond)
  • Print shared object mappings for a process.
    • jmap pid
  • Print heap summary for a process.
    • jmap -heap pid
  • Print finalization information for a process.
    • jmap -finalizerinfo pid
  • Attach the command-line debugger to a process.
    • jdb -connect sun.jvm.hotspot.jdi.SAPIDAttachingConnector:pid=pid
  • Attach the command-line debugger to a core file on the same machine.
    • jdb -connect sun.jvm.hotspot.jdi.SACoreAttachingConnector:javaExecutable=path,core=corefile
  • Attach the command-line debugger to a core file on a different machine.
    • On the machine with the core file: jsadebugd path corefile
      and on the machine with the debugger: jdb -connect sun.jvm.hotspot.jdi.SADebugServerAttachingConnector:debugServerName=machine

Back to top

Post-mortem Diagnostics

  • Examine the fatal error log file. Default file name is hs_err_pidpid.log in the working-directory.
  • Create a heap dump.
    • HPROF: java -agentlib:hprof=file=file,format=b application; then Control-\
    • HPROF: java -agentlib:hprof=heap=dump application
    • JConsole tool, MBeans tab
    • Start VM with -XX:+HeapDumpOnOutOfMemoryError; if OutOfMemoryError is thrown, VM generates a heap dump.
  • Browse Java heap dump.
    • jhat heap-dump-file
  • Dump Java heap from core file in binary format to a file.
    • jmap -dump:format=b,file=filename corefile
  • Get a heap histogram from a core file.
    • jmap -histo corefile
  • Print shared object mappings from a core file.
    • jmap corefile
  • Print heap summary ffrom a core file.
    • jmap -heap corefile
  • Print finalization information from a core file.
    • jmap -finalizerinfo corefile
  • Print Java configuration information from a core file.
    • jinfo corefile
  • Print thread trace from a core file.
    • jstack corefile
  • Print lock information from a core file.
    • jstack -l corefile

Back to top

Monitoring

  • Print statistics on the class loader.
      jstat -classvmID
  • Print statistics on the compiler.
    • Compiler behavior: jstat -compiler vmID
    • Compilation method statistics: jstat -printcompilation vmID
  • Print statistics on garbage collection.
    • Summary of statistics: jstat -gcutil vmID
    • Summary of statistics, with causes: jstat -gccause vmID
    • Behavior of the gc heap: jstat -gc vmID
    • Capacities of all the generations: jstat -gccapacity vmID
    • Behavior of the new generation: jstat -gcnew vmID
    • Capacity of the new generation: jstat -gcnewcapacity vmID
    • Behavior of the old and permanent generations: jstat -gcold vmID
    • Capacity of the old generation: jstat -gcoldcapacity vmID
    • Capacity of the permanent generation: jstat -gcpermcapacity vmID
  • Monitor objects awaiting finalization
    • JConsole tool, Summary tab
    • jmap -finalizerinfo pid
    • getObjectPendingFinalizationCount method in java.lang.management.MemoryMXBean class
  • Monitor memory
    • Heap allocation profiles via HPROF: java -agentlib:hprof=heap=sites
    • JConsole tool, Memory tab
    • Control-\ prints generation information.
  • Monitor CPU usage.
    • By thread stack: java -agentlib:hprof=cpu=samples application
    • By method: java -agentlib:hprof=cpu=times application
    • JConsole tool, Overview and Summary tabs
  • Monitor thread activity: JConsole tool, Threads tab
  • Monitor class activity: JConsole tool, Classes tab

Back to top

Actions on a Remote Debug Server

First, attach the debug daemon jsadebugd, then execute the command.

  • Dump Java heap in binary format to a file: jmap -dump:format=b,file=filename hostID
  • Print shared object mappings: jmap hostID
  • Print heap summary : jmap -heap hostID
  • Print finalization information : jmap -finalizerinfo hostID
  • Print lock information : jstack -l hostID
  • Print thread trace : jstack hostID
  • Print Java configuration information: jinfo hostID

Back to top

Other Functions

  • Interface with the instrumented Java virtual machines.
    • Monitor for the creation and termination of instrumented VMs: jstatd daemon
    • List the instrumented VMs: jps
    • Provide interface between remote mointoring tools and local VMs: jstatd daemon
  • Print Java configuration information from a running process.
    • jinfo pid
  • Dynamically set, unset, or change the value of certain Java VM flags for a process.
    • jinfo -flag flag
  • Pass a Java VM flag to the virtual machine.
    • jhat -Jflag ...
    • jmap -Jflag ...
  • Print statistics of permanent generation of Java heap, by class loader.
    • jmap -permstat
  • Report on monitor contention.
    • java -agentlib:hprof=monitor=y application
  • Evaluate or execute a script in interactive or batch mode.
    • jrunscript
  • Interface dynamically with an MBean, via JConsole tool, MBean tab:
    • Show tree structure.
    • Set an attribute value.
    • Invoke an operation.
    • Subscribe to notification.

No comments: