Hi Oscar,<div><br></div><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
who can tell me what the difference between -Xss and -XX:ThreadStackSize in java?</blockquote><div><br></div><div>There&#39;s basically no difference between -Xss and -XX:ThreadStackSize, except that the former dates before HotSpot became the default JVM in Sun&#39;s JDK, where as the latter is an internal VM flag of HotSpot. In effect, the former is support in a lot of other JVMs, but the latter is specific to HotSpot.</div>
<div><br></div><div>As an historical aside, the command line arguments for Sun JDK 1.0.x and 1.1.x had these:</div><div><div>-ss&lt;number&gt;       set the C stack size of a process</div><div>-oss&lt;number&gt;      set the JAVA stack size of a process</div>
</div><div><br></div><div>These arguments got deprecated by -Xss and -Xoss in later versions of JDK.</div><div><br></div><div>Non-internal flags either get processd by the java launcher (such as -server, -client, -verbosegc, etc.) or get converted into VM internal flags by HotSpot. See hotspot/src/share/vm/runtime/arguments.cpp for details.</div>
<div><br></div><div>For example, see this version:</div><div>the launcher part:</div><div><a href="http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/f097ca2434b1/src/share/bin/java.c">http://hg.openjdk.java.net/jdk7/jdk7/jdk/file/f097ca2434b1/src/share/bin/java.c</a></div>
<div>lines 1052 - 1058,</div><div>and the VM part:</div><div><a href="http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/81d815b05abb/src/share/vm/runtime/arguments.cpp">http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/81d815b05abb/src/share/vm/runtime/arguments.cpp</a></div>
<div>lines 2227 - 2240.</div><div><br></div><div>As you can see, -Xss gets converted into ThreadStackSize before the VM gets to use it.</div><div>If the user did specify -ss or -Xss in command line arguments, that&#39;ll get picked up directly by the launcher to run the main Java thread. Otherwise, the launcher asks the VM for a preferred stack size, and HotSpot will return ThreadStackSize, see here: <a href="http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/81d815b05abb/src/share/vm/prims/jni.cpp">http://hg.openjdk.java.net/jdk7/jdk7/hotspot/file/81d815b05abb/src/share/vm/prims/jni.cpp</a>, lines 3286 - 3295.</div>
<div><br></div><div>That should explain how they&#39;ve been implemented to be basically equivalent in HotSpot.</div><div><br></div><div>One thing, though: because the -Xss/-XX:ThreadStackSize argument is handled by the VM, *after* the primordial thread has been created, so they won&#39;t cover the stack size of the primordial thread. In order to control stack size correctly, Oracle/Sun&#39;s JDK doesn&#39;t run Java code in the primordial thread. See this bug: <a href="http://bugs.sun.com/view_bug.do?bug_id=6316197">http://bugs.sun.com/view_bug.do?bug_id=6316197</a>.</div>
<div>If you ever felt the function &quot;ContinueInNewThread&quot; in the launcher was weird, that&#39;s the fix for this issue, so that Java code doesn&#39;t get run in the primordial thread in HotSpot.</div><div><br></div>
<blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; ">
By the way,  I also want to know whether the java thread stack is equivalent to the native thread stack?</blockquote><div><br></div><div>The stock HotSpot VM (the one in Oracle&#39;s Java SE JDK and OpenJDK) uses the same stack for Java and native methods for a Java thread; Java frames and native frames can be mixed together in such a stack. -Xss/-XX:ThreadStackSize controls the whole stack&#39;s size for Java threads.</div>
<div>Because of this, -Xoss is simply ignored by HotSpot -- there&#39;s no separate stack to set the size for.</div><div><br></div><div>There are some variants of HotSpot VM that does use a separate interpreter stack, e.g. Azul&#39;s version. See this post from Cliff Click for more details of the Azul implementation: <a href="http://www.azulsystems.com/blog/cliff/2010-04-06-jitd-code-calling-conventions-or-answering-plea-geekyness">http://www.azulsystems.com/blog/cliff/2010-04-06-jitd-code-calling-conventions-or-answering-plea-geekyness</a></div>
<div><br></div><div>Regards,</div><div>Kris Mok</div><div><br><div class="gmail_quote">On Sun, Jun 26, 2011 at 8:10 PM, Huang Yifei <span dir="ltr">&lt;<a href="mailto:huangyifei123@gmail.com">huangyifei123@gmail.com</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><span style="border-collapse:collapse;font-family:arial, sans-serif;font-size:13px">Rencently, i have found another JVM option -XX:ThreadStackSize to set<br>
thread stack size in java, but who can tell me what the difference<br>
between -Xss and -XX:ThreadStackSize in java?<br><br>By the way,  I also want to know whether the java thread stack is<br>equivalent to the native thread stack?<br><br>Oscar Huang</span>
</blockquote></div><br></div>