考试首页 | 考试用书 | 培训课程 | 模拟考场 | 考试论坛  
全国  |             |          |          |          |          |         
  当前位置:计算机等级 > 二级考试 > Java语言程序设计 > 考试辅导 > 文章内容
  

全国计算机二级考试Java语言程序设计知识点(29)

中华IT学院   【 】  [ 2016年5月6日 ]

设置线程栈大小

  线程栈是线程的一块私有空间。在 JVM 中可以使用-Xss 参数设置线程栈的大小。

  在线程中进行局部变量分配,函数调用时都需要在栈中开辟空间。如果栈的空间分配太小,那么线程在运行时可能没有足够的空间分配局部变量或者达不到足够的函数调用深度,导致程序异常退出;如果栈空间过大,那么开设线程所需的内存成本就会上升,系统所能支持的线程总数就会下降。由于 Java 堆也是向操作系统申请内存空间的,因此,如果堆空间过大,就会导致操作系统可用于线程栈的内存减少,从而间接减少程序所能支持的线程数量。

  清单 12 所示代码尝试开设尽可能多的线程,并在线程数量饱和时,打印已经开设的线程数量。

  清单 12. 尝试开启尽可能多的线程

public class TestXss {

public static class MyThread extends Thread{

@Override

public void run(){

try{

Thread.sleep(10000);

}catch(InterruptedException e){

e.printStackTrace();

}

}

}

public static void main(String[] args){

int count=0;

try{

for(int i=0;i<10000;i++){

new MyThread().start();

count++;

}

}catch(OutOfMemoryError e){

System.out.println(count);

System.out.println(e.getMessage());

}

}

}

  清单 13. 配置-Xss1M 时的运行输出

1578

unable to create new native thread

  一共允许启动 1578 个线程。

  清单 14. 配置-Xss20M 时的运行输出

69

unable to create new native thread

  实验证明如果改变系统的最大堆空间设定,可以发现系统所能支持的线程数量也会相应改变。

  Java 堆的分配以 200MB 递增,当栈大小为 1MB 时,最大线程数量以 200 递减。当系统物理内存被堆占据时,就不可以被栈使用。当系统由于内存空间不够而无法创建新的线程时会抛出 OOM 异常。这并不是由于堆内存不够而导致的 OOM,而是因为操作系统内存减去堆内存后剩余的系统内存不足而无法创建新的线程。在这种情况下可以尝试减少堆内存以换取更多的系统空间来解决这个问题。综上所述,如果系统确实需要大量线程并发执行,那么设置一个较小的堆和较小的栈有助于提高系统所能承受的最大线程数。

分享到:
本文纠错】【告诉好友】【打印此文】【返回顶部
将考试网添加到收藏夹 | 每次上网自动访问考试网 | 复制本页地址,传给QQ/MSN上的好友 | 申请链接 | 意见留言 TOP
关于本站  网站声明  广告服务  联系方式  站内导航  考试论坛
Copyright © 2007-2013 中华考试网(Examw.com) All Rights Reserved