Java堆栈在哪里分配?

时间:2012-06-14 01:07:29

标签: java

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

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

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

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

2 个答案:

答案 0 :(得分:26)

答案是:

  1. 这是依赖于实现的。

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

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

  4. <强>更新

    从一个老问题,这里是pthread_create的代码片段,它请求分配线程堆栈。此方法由JVM线程实现使用来创建本机线程。

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

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

    作为参考,这里是mmap syscall manual entry的链接。


      

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

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

答案 1 :(得分:2)

如果你能以任何方式找到对这些东西的访问权限,那么第二个Sun(或它现在正在使用的Oracle?)会很快发布补丁。

能够访问这些类型的东西是一个巨大的安全风险。很多大公司的系统都使用Java。留下一个可以追踪分配空间的洞是不可能的。

如上所述,MMAP将分配空间并将其返回以满足所需的程序和空间要求。我几乎每天都会用MMAP做很多事情。

也许是因为我认为可以使用的东西有点暗(为了更好地保护我的系统),相当肯定会有一个热门修复它来取消你的工作,或者你有美国队的世界警察敲你的门怀疑你的犯规行为,并在此过程中抓住你所有的设备。