{"id":467,"date":"2026-10-14T15:21:29","date_gmt":"2026-10-14T15:21:29","guid":{"rendered":"http:\/\/www.scmgalaxy.com\/tutorials\/2016\/01\/25\/the-jstack-utility\/"},"modified":"2026-10-14T15:21:29","modified_gmt":"2026-10-14T15:21:29","slug":"the-jstack-utility","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/the-jstack-utility\/","title":{"rendered":"jstack Utility Deep Dive: JVM Thread Dumps, Deadlocks, and Mixed Stacks"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\"><em>Originally published on 2016-01-25; fully revised and updated.<\/em><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <code>jstack<\/code> utility is a JVM troubleshooting tool for capturing thread dumps and detecting deadlocks. This article is for DevOps and platform engineers who need fast, reliable thread-level diagnostics in production or pre-production environments, with practical commands and a clear triage workflow.<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><img decoding=\"async\" src=\"https:\/\/www.devopsschool.com\/blog\/wp-content\/uploads\/2016\/01\/the-jstack-utility.png\" alt=\"jstack utility overview\"\/><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\">Where jstack fits in JVM diagnostics<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle JDK 8 troubleshooting documentation introduced Java Mission Control, Java Flight Recorder, and <code>jcmd<\/code>, and suggests using <code>jcmd<\/code> instead of <code>jstack<\/code> for enhanced diagnostics and lower overhead in many cases. Even so, <code>jstack<\/code> remains a direct and widely used way to obtain thread dumps, detect deadlocks, inspect core files, and print mixed Java\/native stacks.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Tool<\/th><th>Position in JDK 8 docs<\/th><th>Best use<\/th><th>Notes<\/th><\/tr><\/thead><tbody><tr><td><code>jstack<\/code><\/td><td>Legacy but fully documented troubleshooting utility<\/td><td>Thread dumps, deadlock detection, mixed stacks, core-dump analysis<\/td><td>Simple and direct for stack-centric debugging<\/td><\/tr><tr><td><code>jcmd<\/code><\/td><td>Suggested in JDK 8 docs as the newer diagnostic utility<\/td><td>Broader diagnostics with command-based interface<\/td><td>Preferred by JDK 8-era guidance for reduced overhead<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What jstack can collect<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Stack traces for all threads attached to a JVM, including Java threads and VM internal threads.<\/li><li>Deadlock detection in Java-level locking scenarios.<\/li><li>Ownable synchronizer details with <code>-l<\/code> (including <code>java.util.concurrent.locks<\/code> information).<\/li><li>Mixed Java and native C\/C++ frames with <code>-m<\/code>.<\/li><li>Stack traces from a core dump.<\/li><li>Remote querying via <code>jsadebugd<\/code> (with slower output, as noted in the source material).<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Thread-dump methods and when to use them<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Method<\/th><th>Command or action<\/th><th>Use case<\/th><th>Important notes<\/th><\/tr><\/thead><tbody><tr><td>Standard dump<\/td><td><code>jstack &lt;pid&gt;<\/code><\/td><td>General hang\/latency investigation<\/td><td>Equivalent output to Ctrl+\\ or QUIT signal per Oracle docs<\/td><\/tr><tr><td>Dump with synchronizers<\/td><td><code>jstack -l &lt;pid&gt;<\/code><\/td><td>Lock contention and concurrency debugging<\/td><td>Adds ownable synchronizer details<\/td><\/tr><tr><td>Forced dump<\/td><td><code>jstack -F &lt;pid&gt;<\/code><\/td><td>When the normal command does not respond<\/td><td>Source notes Solaris\/Linux support<\/td><\/tr><tr><td>Mixed stack<\/td><td><code>jstack -m &lt;pid&gt;<\/code><\/td><td>JNI\/native or VM-level investigation<\/td><td>Includes C\/C++ frames as well as Java frames<\/td><\/tr><tr><td>Core-file analysis<\/td><td><code>jstack $JAVA_HOME\/bin\/java core<\/code><\/td><td>Post-crash\/offline analysis<\/td><td>Requires JVM binary and core file<\/td><\/tr><tr><td>Programmatic capture<\/td><td><code>Thread.getAllStackTraces()<\/code><\/td><td>Application-level diagnostics<\/td><td>Useful when adding in-app debug capability<\/td><\/tr><tr><td>Debugger view<\/td><td><code>where<\/code> in <code>jdb<\/code><\/td><td>Interactive debugging sessions<\/td><td>Convenient in live debug workflows<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Practical jstack command examples<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Standard thread dump<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-bash\">jstack <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pid<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Include ownable synchronizers<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-bash\">jstack -l <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pid<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Force a stack dump from a hung process<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-bash\">jstack -F <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pid<\/span>&gt;<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Print mixed Java\/native frames<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml language-bash\">jstack -m <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pid<\/span>&gt;<\/span>\njstack -m <span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">pid<\/span>&gt;<\/span> | c++filt<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">In mixed-stack output, frames prefixed with an asterisk (<code>*<\/code>) are Java frames; non-prefixed frames are native C\/C++ frames.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Read stacks from a core dump<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php language-bash\">jstack $JAVA_HOME\/bin\/java core<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">As documented by Oracle, you can also get equivalent thread-dump output via Ctrl+\\ on the console or by sending QUIT to the JVM process.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Troubleshooting workflow for hangs and deadlocks<\/h2>\n\n\n\n<pre class=\"mermaid\">\nflowchart TD\n    A[Service appears hung] --> B[Find JVM pid]\n    B --> C[Run jstack pid]\n    C --> D{Command responds}\n    D -- yes --> E[Run jstack -l pid]\n    D -- no --> F[Run jstack -F pid]\n    E --> G[Check deadlock section]\n    F --> G\n    G --> H[If needed run jstack -m pid]\n    H --> I[Identify lock or native stall]\n    I --> J[Apply fix and validate]\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">How to read key output signals quickly<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>Deadlock indicator:<\/strong> look for lines like <code>Found one Java-level deadlock<\/code>.<\/li><li><strong>Lock ownership clues:<\/strong> lines stating one thread is waiting to lock an object held by another thread.<\/li><li><strong>Thread state focus:<\/strong> prioritize <code>BLOCKED<\/code>, long <code>WAITING<\/code>, and repeating patterns across multiple dumps.<\/li><li><strong>Mixed stack clues:<\/strong> use <code>-m<\/code> when the issue may involve JNI or VM-native code paths.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">References<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/guides\/troubleshoot\/tooldescr016.html#BABEHDDH\">Troubleshoot with jstack Utility (Oracle JDK 8)<\/a><\/li><li><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/guides\/troubleshoot\/tooldescr016.html#BABFDFDH\">Force a Stack Dump<\/a><\/li><li><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/guides\/troubleshoot\/tooldescr016.html#BABBAIJC\">Stack Trace from a Core Dump<\/a><\/li><li><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/guides\/troubleshoot\/tooldescr016.html#BABJBDFC\">Mixed Stack<\/a><\/li><li><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/guides\/troubleshoot\/tooldescr019.html#BABCDJFE\">Control+Break Handler<\/a><\/li><li><a href=\"https:\/\/docs.oracle.com\/javase\/8\/docs\/technotes\/tools\/unix\/jstack.html\">jstack command man page (Oracle JDK 8)<\/a><\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Best practices<\/h2>\n\n\n\n<ul class=\"wp-block-list\"><li>Start with <code>jstack -l<\/code> for lock-aware analysis when investigating hangs.<\/li><li>If the process is unresponsive, use <code>-F<\/code> only when needed and note platform constraints.<\/li><li>Use <code>-m<\/code> when Java-only stacks do not explain the issue (native\/JNI suspicion).<\/li><li>Keep a consistent incident runbook so thread dumps are captured quickly and repeatably.<\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>This guide explains how to use jstack to diagnose JVM hangs and deadlocks, including forced dumps, core-file analysis, and mixed Java\/native stack traces. It also clarifies where jcmd fits in modern JDK 8+ troubleshooting guidance.<\/p>\n","protected":false},"author":1,"featured_media":3159,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[49],"tags":[1307,173,1301,1308,1304,1309,1303,1306,1305,1302],"class_list":["post-467","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-general","tag-install-jstack","tag-java","tag-jstack","tag-jstack-options","tag-jstack-tool","tag-jstack-tutorial","tag-jstack-utility","tag-thread-dump","tag-troubleshoot-with-jstack-utility","tag-utility"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/467","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=467"}],"version-history":[{"count":4,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/467\/revisions"}],"predecessor-version":[{"id":79350,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/467\/revisions\/79350"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media\/3159"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=467"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=467"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=467"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}