What is the difference between -Xss and -XX:ThreadStackSize?

匿名 (未验证) 提交于 2019-12-03 01:33:01

问题:

I just want to control the stack size for all of my threads in a Java (groovy) application. For the Hotspot Oracle VM, I know that there are two parameters doing that (-Xss and XX:ThreadStackSize).

Which is the preferred one? Is there any difference between them? Regarding Open JDK 7 someone asked on the mailing list, stating that -Xss is the same for the Hotpot VM as -XX:ThreadStackSize.

The point is, that I am measuring how many threads can be started on my system. My groovy script which does this looks like:

int count = 0  def printCountThreads = {      println("XXX There were started $count threads.") }  try {     while(true){             new Thread({Thread.sleep(Integer.MAX_VALUE)}).start()             count++             if(count % 1000 == 0){                     printCountThreads()             }     } } catch (Throwable e){     printCountThreads()     throw e }

Interestingly enough I just get a reduced number of of threads using -XX:ThreadStackSize. I am starting the groovy application with and with different content in the environment variable JAVA_OPTS.

groovy countmax-threads.groovy

When I set JAVA_OPTS to -XX:ThreadStackSize=2m, I get about 1000 started threads until the memory is consumed. But, when I use JAVA_OPTS='-Xss2m', I get about 32000 threads until the expected error arises. So it seems that -Xss does not work at all.

I am using

java version "1.8.0_05"
Java(TM) SE Runtime Environment (build 1.8.0_05-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.5-b02, mixed mode)

on a Ubuntu 14.04 64 bit machine with four hardware threads and about 8 GB of RAM.

UPDATE:

I reverified this on my Windows 7 64 bit machine and another JDK:

java version "1.8.0_20" Java(TM) SE Runtime Environment (build 1.8.0_20-b26) Java HotSpot(TM) 64-Bit Server VM (build 25.20-b23, mixed mode)

and there -Xss and -XX:ThreadStackSize work as expected (as some answers pointed out). So I suppose it is a Linux specific problem or even a bug in the JDK version 1.8.05.

回答1:

-Xss is standard options recognized by the Java HotSpot VM.

-XX:ThreadStackSize as other -XX options are not stable and are subject to change without notice.

See Java HotSpot VM Options



回答2:

-Xss is an alias for -XX:ThreadStackSize both for OpenJDK and Oracle JDK.

Though they parse arguments differently:
-Xss may accept a number with K, M or G suffix;
-XX:ThreadStackSize= expects an integer (without suffix) - the stack size in kilobytes.



回答3:

-Xss works only on main Java thead, but -XX:ThreadStackSize works on all Java thread.

If -Xss (or -ss) were passed on the command line, it gets picked up directly by the launcher and is used later to create the "main" Java thread, without asking the VM for the preferred thread stack size. That where inconsistency comes from: if -Xss is given after -XX:ThreadStackSize, then things are still good; otherwise, the "main" Java thread would have a stack size specified by -Xss where as other Java threads' stack size would still follow that of ThreadStackSize.

Inconsistency between -Xss and -XX:ThreadStackSize in the java launcher



回答4:

UPDATED 2019 for Java SE 8

Current Oracle Java SE 8 docs suggest that -Xss and -XX:ThreadStackSize=size are equivalent. See
https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html


For -Xss:

-Xsssize       Sets the thread stack size (in bytes). Append the     letter k or K to indicate KB, m or M to indicate MB, g or G to     indicate GB. The default value depends on the platform:  Linux/ARM (32-bit): 320 KB  Linux/i386 (32-bit): 320 KB  Linux/x64 (64-bit): 1024 KB  OS X (64-bit): 1024 KB  Oracle Solaris/i386 (32-bit): 320 KB  Oracle Solaris/x64 (64-bit): 1024 KB  The following examples set the thread stack size to 1024 KB in different units:  -Xss1m -Xss1024k -Xss1048576   This option is equivalent to -XX:ThreadStackSize.

For -XX:ThreadStackSize=size

-XX:ThreadStackSize=size     Sets the thread stack size (in bytes). Append the    letter k or K to indicate kilobytes, m or M to indicate    megabytes, g or G to indicate gigabytes. The default    value depends on the platform:  Linux/ARM (32-bit): 320 KB  Linux/i386 (32-bit): 320 KB  Linux/x64 (64-bit): 1024 KB  OS X (64-bit): 1024 KB  Oracle Solaris/i386 (32-bit): 320 KB  Oracle Solaris/x64 (64-bit): 1024 KB  The following examples show how to set the thread stack size to 1024 KB in different units:  -XX:ThreadStackSize=1m -XX:ThreadStackSize=1024k -XX:ThreadStackSize=1048576   This option is equivalent to -Xss.


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!