java 线程栈空间_java线程的内存不包含在JVM堆与栈中

本文通过代码实例展示了Java创建线程时遇到的内存限制问题,探讨了-Xms、-Xmx和-Xss参数对线程数量的影响。在某些情况下,增大JVM堆内存(Xmx)可能导致可创建线程数减少,而减小栈内存(Xss)反而可能增加线程数量。这与操作系统剩余内存有关,而非仅受JVM堆栈内存控制。
摘要由CSDN通过智能技术生成

Java代码 a4c26d1e5885305701be709a3d33442f.png a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

publicclassMaxThreadsTest {

publicstaticvoidmain(String[] args) {

while(true) {

newThread(newA()).start();

if(A.eflag.get()){

return;

}

}

}

}

classAimplementsRunnable {

staticAtomicInteger counts =newAtomicInteger(0);

staticAtomicBoolean eflag =newAtomicBoolean(false);

@Override

publicvoidrun() {

try{

intx = counts.getAndIncrement();

if(x%200==0)

System.out.println("conts: "+ A.counts);

Thread.sleep(30000);

}catch(InterruptedException e) {

eflag.set(true);

e.printStackTrace();

}

}

}

public class MaxThreadsTest {

public static void main(String[] args) {

while (true) {

new Thread(new A()).start();

if(A.eflag.get()){

return;

}

}

}

}

class A implements Runnable {

static AtomicInteger counts = new AtomicInteger(0);

static AtomicBoolean eflag = new AtomicBoolean(false);

@Override

public void run() {

try {

int x = counts.getAndIncrement();

if(x 0==0)

System.out.println("conts: " + A.counts);

Thread.sleep(30000);

} catch (InterruptedException e) {

eflag.set(true);

e.printStackTrace();

}

}

}

Java代码 a4c26d1e5885305701be709a3d33442f.png a4c26d1e5885305701be709a3d33442f.png

a4c26d1e5885305701be709a3d33442f.png

-Xms16M -Xmx32M -Xss1M -XX:+HeapDumpOnOutOfMemoryError

conts:1801

Exception in thread"main"java.lang.OutOfMemoryError: unable to createnewnativethread

-Xms32M -Xmx64M -Xss1M -XX:+HeapDumpOnOutOfMemoryError

conts:1801

Exception in thread"main"java.lang.OutOfMemoryError: unable to createnewnativethread

//把Xmx设大可以建立的线程数反而变小,这是个很奇怪的事情:

-Xms64M -Xmx128M -Xss1M -XX:+HeapDumpOnOutOfMemoryError

conts:1601

Exception in thread"main"java.lang.OutOfMemoryError: unable to createnewnativethread

//把Xmx设大可以建立的线程数反而变小,这是个很奇怪的事情:

-Xms128M -Xmx256M -Xss1M -XX:+HeapDumpOnOutOfMemoryError

conts:1601

Exception in thread"main"java.lang.OutOfMemoryError: unable to createnewnativethread

//把Xss设小有惊人效果:

-Xms16M -Xmx32M -Xss128K -XX:+HeapDumpOnOutOfMemoryError

conts:13401

Exception in thread"main"java.lang.OutOfMemoryError: unable to createnewnativethread

-Xms16M -Xmx32M -Xss1M -XX:+HeapDumpOnOutOfMemoryError

conts: 1801

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

-Xms32M -Xmx64M -Xss1M -XX:+HeapDumpOnOutOfMemoryError

conts: 1801

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

//把Xmx设大可以建立的线程数反而变小,这是个很奇怪的事情:

-Xms64M -Xmx128M -Xss1M -XX:+HeapDumpOnOutOfMemoryError

conts: 1601

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

//把Xmx设大可以建立的线程数反而变小,这是个很奇怪的事情:

-Xms128M -Xmx256M -Xss1M -XX:+HeapDumpOnOutOfMemoryError

conts: 1601

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

//把Xss设小有惊人效果:

-Xms16M -Xmx32M -Xss128K -XX:+HeapDumpOnOutOfMemoryError

conts: 13401

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread

以上是在eclipse里测试的。

在windows下直接测试有明显不同。

java MaxThreadsTest -Xms16M -Xmx32M -Xss1M

java MaxThreadsTest -Xms64M -Xmx128M -Xss1M

无论怎么设置都在5401后结束。

我对JVM的了解基本为0,所以也分析不出原因。

请大家帮我看看,这是怎么回事,不是说Xmx越大、Xss越小,则线程数越多么?

被移到问答区里了,这么低的悬赏,能有人关注吗?

没办法了,就这么点钱啦……………………………………………………………………

2010-12-17 flootball (高级程序员)

你的操作系统的内存是多少?

在java中每new一个线程,jvm都是向操作系统请求new一个本地线程,此时操作系统会使用剩余的内存空间来为线程分配内存,而不是使用jvm的内存。这样,当操作系统的可用内存越少,则jvm可用创建的新线程也就越少。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值