小编DrP*_*tay的帖子

可变参数和 x64

va_arg\ va_start\ va_list\va_end宏在 x64 中如何工作?

i386 中的调用约定在堆栈上传递参数,因此宏只是增加一些指向堆栈基址的指针并转发它。然而,在 x64 中,所有参数都是通过寄存器传递的......那么那里会发生什么呢?被调用函数如何知道哪些寄存器用于传递参数以确保它不会破坏它们?

c x86-64 calling-convention variadic-macros

6
推荐指数
1
解决办法
3104
查看次数

JVM内存段分配

好吧我有一个关于JVM的内存段的问题,我知道每个JVM都会选择实现这个有点不同但它是一个整体概念,应该在所有JVM中保持相同

在运行时期间不使用虚拟机执行的标准C/C++程序在运行时期间有四个内存段,代码/堆栈/堆/数据所有这些内存段在运行时由操作系统自动分配.

但是,当JVM执行Java编译的程序时,在运行时它有5个内存段

方法区/堆/ Java堆栈/ PC寄存器/本机堆栈

我的问题是,谁分配和管理那些内存段?操作系统不知道正在运行的java程序,并认为它是作为计算机上的常规程序运行的JVM的一部分,JIT编译,Java堆栈使用,这些操作需要运行时内存分配,以及我是什么无法理解JVM是如何将内存划分为这些内存段的.它绝对不是由操作系统完成的,那些内存段(例如java堆栈)必须是连续的才能工作,所以如果JVM程序只是使用诸如malloc之类的命令来获得最大的大小堆内存并将内存分成几段,我们没有连续记忆的承诺,如果有人可以帮我把这个直接记在脑子里,我会很喜欢它,这一切都混淆了......

memory garbage-collection jvm

5
推荐指数
1
解决办法
666
查看次数