You should start by reading the configuration guide for a JVM or Application Server. These are items I've found very important to running a J2EE Application Server. If you configure your application server properly, it will help with analyzing a problem the first time it happens. This may keep you from having to change configuration items and wait for an event to properly analyze what went wrong.
This page provides a light introduction to the data you should gather and the places to look when you experience a problem. When your application server stops responding, don't panic and start gathering data as quickly as you can. Once you have gathered the data necessary, you may be able to obtain bypass to your current problem by restarting your application server. Even if restarting helps, consider this temporary and expect the problem to return.
This is a light introduction to analyzing a Java Thread Dump. In this section, we'll look at how a thread dump differs between application server vendors - and we'll break down an example thread dump.
We'll cover some common thread related issues I've ran into while troubleshooting production application server problems in this section.
I've ran into a good number of questions and misconceptions related to Java and how it uses memory. In here, we'll cover some basic concepts surrounding the Java heap and how it is managed by the virtual machine. We'll cover the various collectors and some specifics about how they work.
In this section, we'll break down the verbose GC output from each of the major Java vendors. Some questions answered here: Why did a GC happen?
In this section we'll cover how to identify memory and heap related problems within the Java Virtual Machine. When am I running out of memory? Why did a Full GC happen?.