栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java为什么创建线程据说很昂贵?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java为什么创建线程据说很昂贵?

Java线程的创建非常昂贵,因为其中涉及大量工作:

  • 必须为线程堆栈分配并初始化一大块内存。
  • 需要进行系统调用以在主机OS中创建/注册本机线程。
  • 需要创建,初始化描述符并将其添加到JVM内部数据结构中。
    从某种意义上说,只要线程处于活动状态,它就束缚资源,这也很昂贵;例如线程堆栈,可从堆栈访问的任何对象,JVM线程描述符,OS本机线程描述符。

所有这些东西的成本是特定于平台的,但是在我遇到过的任何Java平台上,它们都不便宜。

谷歌搜索发现我有一个旧的基准,该基准报告说,在运行2002老式Linux的2002老式双处理器Xeon上,在Sun Java 1.4.1上线程创建速率约为4000每秒。一个更现代的平台将提供更多的数据……而我无法评论该方法论……但至少,它为可能创建线程的成本提供了保证。

彼得·劳瑞(Peter Lawrey)的基准测试表明,从绝对意义上讲,如今的线程创建速度显着提高,但尚不清楚其中有多少是由于Java和/或操作系统的改进或更高的处理器速度所致。但是,如果你使用线程池,而不是每次都创建/启动一个新线程,那么他的数据仍然表明改进了150倍以上。(他指出这都是相对的…)

(以上假定“本地线程”而不是“绿色线程”,但是现代JVM出于性能原因都使用本地线程。绿色线程创建起来可能更便宜,但你可以在其他方面为此付出代价。)

我做了一些挖掘工作,以了解如何真正分配Java线程的堆栈。对于Linux上的OpenJDK 6,线程堆栈是通过调用分配给

pthread_create
创建本地线程的。(JVM不会传递pthread_create预分配的堆栈。)

然后,在

pthread_create
栈内通过调用分配mmap如下:

mmap(0, attr.__stacksize,      PROT_READ|PROT_WRITE|PROT_EXEC,      MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)

|
根据

man mmap
,该
MAP_ANONYMOUS
标志使内存初始化为零。

因此,即使并非必须(根据JVM规范)将新的Java线程栈置零,但实际上(至少对于Linux上的OpenJDK 6)将它们置零。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404769.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号