17

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

  • Java 堆
  • PermGen(永久代)空间
  • 本机堆(C 堆)

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

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

4

2 回答 2

24

答案是:

  1. 它取决于实现。

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

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

更新

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

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

如您所见,它只是使用mmap系统调用向操作系统请求一个内存段。正如我在评论中所说,这不是常规的 Java 堆,不是 Permgen 堆,也不是 C 原生堆。它是操作系统专门请求的一段内存。

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


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

IMO,这是一种过度简化。(请提供您在何处找到此信息的链接……以便我们以原始形式阅读。)

于 2012-06-14T01:22:37.850 回答
1

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

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

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

也许是因为我认为事物的使用方式有点暗(为了更好地保护我的系统),很确定会有一个热修复来取消你的工作,或者你有美国世界警察队敲门怀疑你犯规行为,并在此过程中没收您的所有设备。

于 2012-06-22T18:53:03.677 回答