我从网站上注意到以下内容:JVM HotSpot 内存分为 3 个内存空间:
- Java 堆
- PermGen(永久代)空间
- 本机堆(C 堆)
hotSpot JVM 中分配的堆栈在哪里?在本机堆中?
更新:另一个参考信息:对于 64 位 VM,C-Heap 容量 = 物理服务器总 RAM 和虚拟内存 – Java Heap – PermGen
我从网站上注意到以下内容:JVM HotSpot 内存分为 3 个内存空间:
hotSpot JVM 中分配的堆栈在哪里?在本机堆中?
更新:另一个参考信息:对于 64 位 VM,C-Heap 容量 = 物理服务器总 RAM 和虚拟内存 – Java Heap – PermGen
答案是:
它取决于实现。
在我查看的实现中,线程堆栈分配由标准 C 本机线程库处理,看起来该库正在向操作系统分配堆栈的内存段。所以“以上都不是”。
您可以通过深入研究与您的平台相关的 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,这是一种过度简化。(请提供您在何处找到此信息的链接……以便我们以原始形式阅读。)
如果您能以任何方式找到对这些东西的访问权限,那么第二代 Sun(或现在的 Oracle?)将很快发布补丁。
能够访问这些东西是一个巨大的安全风险。大公司的许多系统都使用 Java。留下一个可以追踪分配空间的漏洞是不可能的。
如上所述,MMAP 将分配空间并将其返回给所需的程序和空间需求。我几乎每天都用 MMAP 做很多事情。
也许是因为我认为事物的使用方式有点暗(为了更好地保护我的系统),很确定会有一个热修复来取消你的工作,或者你有美国世界警察队敲门怀疑你犯规行为,并在此过程中没收您的所有设备。