方法存储在内存中的哪个位置?

Pra*_*dda 24 .net c# memory

我了解到类字段存储在堆中,但是方法存储在哪里?在堆中还是其他地方?他们是内联的吗?

Mar*_*wis 35

方法存储在内存中的其他位置.请注意,方法是每个类,而不是每个实例.通常,方法的数量在程序的运行时间内不会改变(有例外).在传统模型中,方法所在的位置称为"代码段".在.net中,它更加困难:方法最初存在于程序集中,并被映射到进程内存中.在那里,即时编译器在本机代码中创建了一些方法的第二个副本; 这个副本被执行.在运行时期间可能会多次创建和删除JIT代码,因此将其视为"在堆中"也是实用的.

  • 如果我有一个有 10,000 行代码的方法并且我创建了该方法所属类的 1000 个实例,那么该方法中的编译代码的 1000 个副本是在内存中创建的还是所有 1000 个对象共享相同的,两者都在方法的执行和对象的初始化? (3认同)
  • @Hansmukh:我没有说每次执行该方法时 JIT 都会创建一个副本。相反,我说的是“在运行时多次”,这意味着 JIT 可能会编译该方法一次,然后在一小时后将其丢弃(如果一小时内没有被调用),然后在两小时后重新编译它,等等在。至于 1000 个实例:注意我说“方法是每个类”;我真的是那个意思。这也适用于 JIT 代码;在任何时间点,任何方法最多只有一个 JIT 版本。 (3认同)
  • @Zain:为了支持方法的同时(或后续)激活,使用"调用栈",由"栈帧"组成.每次调用方法都会创建一个新的堆栈帧(在一个称为"堆栈"的内存区域中),包含该方法的所有参数以及任何局部变量.不同的对象不会导致问题:"this"只是作为参数0传递. (3认同)
  • 我没有说“课前”,而是“**每**级”。方法是每个类的:这意味着每个方法对于类只存在一次。不同的实例仍然具有相同的方法。属性/属性是每个实例的:每个实例都有一个属性,即不同的实例具有不同的属性值。 (2认同)

sha*_*oth 6

类方法与所有代码一起存储在专门用于存储代码的程序存储器的专用段中。每个方法的代码都存储一次。