Tomcat Thread Dump on Linux

First find out the process id of the Tomcat. This can be done by running the following command

ps -ef | grep tomcat

The created thread dump, run the following command

kill -s SIGQUIT <process id>

The thread dump can now be found in catalina.out

 

 

Advertisements

JVM threads getting locked when using IPv6 methods with IPv4 address

Do you have threads locked in a state that looks like this?

java.lang.Thread.State: WAITING
at java.lang.Object.wait(Native Method)
- waiting on <26457185> (a java.util.HashMap)
at java.lang.Object.wait(Object.java:485)
at java.net.InetAddress.checkLookupTable(InetAddress.java:1267)

This usually happens when the applications trying to use IPv6, when the environment is really only configured for IPv4.

The solution is to configure the the Java processes to prefer the IPv4 stack. The default is to prefer the IPv6 stack. This can be done by specifying a JVM argument to prefer IPv4.

-Djava.net.preferIPv4Stack=true

A detailed explanation of this problem can be found here: http://wiki.zimbra.com/wiki/Configuring_for_IPv4

How to enable JMX on Tomcat running on EC2 (behind a firewall)

Step 1: Copy catalina-jmx-remote.jar into Tomcat’s lib folder. This jar file is available in the extras folder of Tomcat’s binary distribution.

Step 2: Modify Tomcat’s server.xml by adding a new Listener entry.

<Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
rmiRegistryPortPlatform="9090" rmiServerPortPlatform="9091"/>

Step 3: Open both of these ports in your firewall. Ports 9090 and 9091 and just examples, you can choose to use any port numbers you like.

Step 4: Add the following options to Tomcat startup script.

-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-Djava.rmi.server.hostname=public-ip (or public dns)

All done! Restart Tomcat and connect to it using jconsole or visualvm from a remote system.