Java堆栈在哪里分配?

jia*_*afu 19 java

我在网站上注意到以下内容:JVM HotSpot内存分为3个内存空间:

  • Java堆
  • PermGen(永久代)空间
  • 原生堆(C-Heap)

在hotSpot JVM中分配的堆栈在哪里?在本机堆中?

更新:另一个参考信息:对于64位VM,C-Heap容量=物理服务器总RAM和虚拟内存 - Java堆 - PermGen

Ste*_*n C 26

答案是:

  1. 它取决于实现.

  2. 在我看到的实现中,线程堆栈分配由标准C本机线程库处理,看起来该库是去操作系统为堆栈分配内存段.所以"以上都不是".

  3. 您可以通过深入研究与您的平台相关的OpenJDK源代码来确认这一点.

UPDATE

从一个老问题,这里是pthread_create请求分配线程堆栈的代码片段.这种方法使用由JVM线程执行创建本地线程.

 mmap(0, attr.__stacksize, 
     PROT_READ|PROT_WRITE|PROT_EXEC, 
     MAP_PRIVATE|MAP_ANONYMOUS, -1, 0)
Run Code Online (Sandbox Code Playgroud)

如您所见,它只是使用mmap系统调用从操作系统请求内存段.正如我在评论中所说,这不是常规Java堆,不是Permgen堆,也不是C本机堆.它是操作系统特别请求的一段内存.

作为参考,这里是mmap系统调用手册条目的链接.


更新:另一个参考信息:对于64位VM,C-Heap容量=物理服务器总RAM和虚拟内存 - Java堆 - PermGen

国际海事组织,这是一个过于简单化.(并且请提供指向您发现此信息的链接...以便我们可以以原始形式阅读.)

  • @jiafu - 你可以想想你喜欢什么.但是,我没有任何证据证明你在说什么.就像我在我的回答中所说的那样,在我查看线程堆栈的情况下,未在常规堆中分配,未在permgen中分配,而未在C本机堆中分配. (3认同)