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

user2078148 picture user2078148 · Feb 27, 2015 · Viewed 13.4k times · Source

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.

Answer

apangin picture apangin · Feb 27, 2015

-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.