首页 新闻 会员 周边 捐助

请问C#或者java里面的static方法在内存中是如何存储的?

0
悬赏园豆:5 [待解决问题]

 最近发现我对这些问题了解挺粗浅的。

 举一个例子,一个class同时具有static方法和non-static方法,那么这个static方法会存储在何处?non-static的这我了解,随着实例化对象一起存储于heap中,但static方法既然不是可实例化的,那么应该不会在每个实例化对象里面都有一份copy,否则static便失去了意义。

  这里不清楚的主要有两点:

1.static方法存储于何处。

2.static方法如何与类关联

知识碎片的主页 知识碎片 | 初学一级 | 园豆:200
提问于:2010-11-04 17:25
< >
分享
所有回答(6)
0

没研究过,关注中..

conlin | 园豆:205 (菜鸟二级) | 2010-11-04 17:39
0

static方法存储在 stack(栈) 中。

class文件被ClassLoader   load进入,该静态方法即可被调用。

/aiq浪子飞龙 | 园豆:1189 (小虾三级) | 2010-11-04 21:39
0

有个概念错了,就是instance method 也不是一个对象 一copy的。method在内存中永远都是一copy的。

沉默的糕点 | 园豆:1786 (小虾三级) | 2010-11-05 10:03
无论是static还是非static?那同一个类具有多个对象呢?那这些对象是怎么组织的?
支持(0) 反对(0) 知识碎片 | 园豆:200 (初学一级) | 2010-11-05 10:13
我也不太懂,我的了解是 一个对象创建如,var p= New Parent(), 那么P放在stack,而(new Parent())放在head中,如果p下面有一个child 的Instance,那么我认为child放在 (new Parent())的stack中, 而 (new child())是放在head中的。我可以确定的是,对象中对象,保存的只是引用。但是Child是不是在(new Parent())中,这个我就不知道了。在C++中,内存除了stack heap 还有代码区,存放method,无论是static还是非static;还有static区,存放静态变量,常量区(不记得是不是这样叫)存放字符串常量的。 如有错误请斧正。
支持(0) 反对(0) 沉默的糕点 | 园豆:1786 (小虾三级) | 2010-11-05 10:49
0

只是肤浅的了解一点

静态成员通过类直接访问,非静态成员须通过类的实例来访问

like%'远远'% | 园豆:635 (小虾三级) | 2010-11-05 11:40
0

CLR 会创建多种不同的堆:GC 堆, JIT 堆, 大对象堆(>85M),加载器堆(高频堆、低频堆、代理堆等).等。对象都是 分配在GC 堆。

类 的方法都会放在 堆里面,但不是在GC 堆里,而是在 高频堆上(因为使用频率高)。因为不在GC堆上所以不会在进行GC的时候被释放掉,而是在应用程序域卸载的时候被卸载。 每个类型都会引用着一个方法表指针

HUHU慈悲 | 园豆:9973 (大侠五级) | 2010-11-05 22:27
谢谢您
支持(0) 反对(0) 知识碎片 | 园豆:200 (初学一级) | 2010-12-21 10:08
0

Q: static方法存储于何处。

A:  静态方法也是存在堆上面的

Q: static方法如何与类关联

A:  static方法在IL转换成本地CPU指令时,利用程序集的元数据,CLR提取与这些类型相关的信息,并创建一些数据结构来表示类型本身。

   这里我理解的是在head已经创建了相应的类,只是没有谁为指向它,静态的方法,成员也是在这时候创建了,不知道理解的对不对.

可参考:

c# 托管堆,堆栈

 http://www.cppblog.com/luyulaile/archive/2011/04/08/143703.html

 CLR Via C# 第四章

http://www.docin.com/p-220589192.html

Aleax | 园豆:58 (初学一级) | 2011-10-12 15:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册