Generate Thread Dump Dengan jstack

Ada masa-masa kalau terdapat isu dengan java kita perlu buat sedikit analysis dengan thread dump tersebut jadi tools yang kebiasaan aku gunakan untuk mengumpul thread dump tersebut adalah dengan menggunakan jstack.

Untuk menggunakan jstack ini perlu tahu di mana lokasi jstack tersebut sebab kebiasaan shell yang kita gunakan tidak set path ke java yang mempunyai jstack ini.

Untuk mengenalpasti lokasi jstack boleh gunakan command locate, command yang aku biasa guna untuk mencari file yang kita tidak pasti lokasi dia di mana.

$ locate jstack
/etc/alternatives/jstack
/etc/alternatives/jstack.1.gz
/usr/bin/jstack
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/bin/jstack
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64/tapset/jstack-1.8.0.242.b08-0.el7_7.x86_64.stp
/usr/share/man/man1/jstack-java-1.8.0-openjdk-1.8.0.242.b08-0.el7_7.x86_64.1.gz
/usr/share/man/man1/jstack.1.gz
/usr/share/systemtap/tapset/x86_64/jstack-1.8.0.242.b08-0.el7_7.x86_64.stp

Dari output command locate kita dapat kenalpasti lokasi jstack adalah di sini /usr/bin/jstack. Jadi selepas ini kita boleh mencari process id berkait dengan java process application java tadi.

$ ps -ef | grep java
root      3842  3609  0 02:55 ?        00:00:00 su appuser bash -c exec -a "testapp" java -Djava.util.logging.config.file=/opt/testapp/install/conf/logging.properties -Xms1024m -Xmx2048m -Xloggc:/opt/testapp/install/logs/gc-%p-%t.log -XX:HeapDumpPath=/opt/testapp/install/logs/ -XX:OnOutOfMemoryError='kill -TERM %p;sleep 120; kill -KILL %p' -XX:+UseTLAB -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+DisableExplicitGC -XX:-UseSplitVerifier -XX:SurvivorRatio=2 -XX:NewRatio=3 -XX:+UseStringCache -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:+UseCompressedOops -XX:InitialTenuringThreshold=15 -XX:MaxTenuringThreshold=15 -XX:+PrintGCApplicationStoppedTime -Datlassian.standalone=JIRA -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -Dmail.mime.decodeparameters=true -Dorg.dom4j.factory=com.atlassian.core.xml.InterningDocumentFactory -Djira.home=/opt/testapp/home -Datlassian.plugins.enable.wait=300 -Djava.awt.headless=true -Datlassian.mail.senddisabled=true -Datlassian.mail.fetchdisabled=true -Datlassian.mail.popdisabled=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager        -Djava.endorsed.dirs=/opt/testapp/install/endorsed       -classpath /opt/testapp/install/bin/bootstrap.jar:/etc/puppet/files/bins/mysql-connector-java-5.1.22-bin.jar:/opt/testapp/install/bin/tomcat-juli.jar       -Dcatalina.base=/opt/testapp/install       -Dcatalina.home=/opt/testapp/install       -Djava.io.tmpdir=/opt/testapp/install/temp       org.apache.catalina.startup.Bootstrap start
appuser   3843  3842 43 02:55 ?        00:03:13 testapp -Djava.util.logging.config.file=/opt/testapp/install/conf/logging.properties -Xms1024m -Xmx2048m -Xloggc:/opt/testapp/install/logs/gc-%p-%t.log -XX:HeapDumpPath=/opt/testapp/install/logs/ -XX:OnOutOfMemoryError=kill -TERM %p;sleep 120; kill -KILL %p -XX:+UseTLAB -XX:+UseParallelGC -XX:+UseParallelOldGC -XX:+DisableExplicitGC -XX:-UseSplitVerifier -XX:SurvivorRatio=2 -XX:NewRatio=3 -XX:+UseStringCache -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintTenuringDistribution -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:+UseCompressedOops -XX:InitialTenuringThreshold=15 -XX:MaxTenuringThreshold=15 -XX:+PrintGCApplicationStoppedTime -Datlassian.standalone=JIRA -Dorg.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER=true -Dmail.mime.decodeparameters=true -Dorg.dom4j.factory=com.atlassian.core.xml.InterningDocumentFactory -Djira.home=/opt/testapp/home -Datlassian.plugins.enable.wait=300 -Djava.awt.headless=true -Datlassian.mail.senddisabled=true -Datlassian.mail.fetchdisabled=true -Datlassian.mail.popdisabled=true -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djava.endorsed.dirs=/opt/testapp/install/endorsed -classpath /opt/testapp/install/bin/bootstrap.jar:/etc/puppet/files/bins/mysql-connector-java-5.1.22-bin.jar:/opt/testapp/install/bin/tomcat-juli.jar -Dcatalina.base=/opt/testapp/install -Dcatalina.home=/opt/testapp/install -Djava.io.tmpdir=/opt/testapp/install/temp org.apache.catalina.startup.Bootstrap start
appuser   4778  4386  0 03:02 pts/0    00:00:00 grep --color=auto java

Jadi di sini kita dapat kenal pasti process id yang dimiliki oleh user appuser adalah 3843.

Setelah itu, kita perlu masuk ke profile user tersebut dan boleh mula gunakan tools jstack. Sekiranya kita menggunakan root account boleh terus masuk ke user profile tersebut dengan menggunakan command ‘su – appuser’

# su - appuser
$ id
uid=1000(appuser) gid=1000(appuser) groups=1000(appuser),10(wheel) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
$ for i in $(seq 6); do top -b -H -p 3843 -n 1 > ~/output.`date +%s`.txt; /usr/bin/jstack <PID> > ~/output.`date +%s`.txt; sleep 10; done

Jadi proses mengumpul thread dump mengambil masa 30 saat dan lokasi output file tersebut adalah di dalam home directory user appuser.

1 thought on “Generate Thread Dump Dengan jstack”

Leave a Comment