代码改变世界

这不是基础中的基础么

2011-03-03 00:09  MichaelYin  阅读(2049)  评论(16编辑  收藏  举报

中午在园子里逛的时候看到了一个评论头条的博文,吉日嘎拉纠正了自己的错误认识。里面涉及到的东西说实话确实很基础,不过我看了下评论却没有将问题解释清楚,至于标题借用了老赵的评论。

先说说方法表,方法表位于内存中的Loader Heap,它包含着类对应的方法,在类加载的时候会在Load Heap上创建和相应的类对应的方法表。当类实例化的时候,托管堆上除了将对象实例化所需要的字段分配内存以外,还会给一个叫做TypeHandle的给实例,这样新建的实例就可以根据TypeHandle在Loader Heap中找到它所对应的类型的方法表,进而找到对应的方法。

在这里借用下Anytao的图。。可能大家看的更懂一些~

19_1

 

到这里停顿一下,说开了实例方法和静态方法其实在内存中都是存储在这个类所对应的方法表上,而且重要的是,它们在内存里面都只有一份,实例调用的方法也是通过TypeHandle找到对应的方法表而完成的方法的调用的。

在来说说方法的调用,在大学学过C的都必定折腾过实参,形参,也知道为什么有的时候为什么调用C语言函数的时候要传入指针,如果你把那个地方搞的比较清楚的话那么这里想必也难不倒你了。C语言函数调用的时候是在内存上重新开辟一块区域,然后在这个里面运行函数并进行相应的处理并返回结果,运行完成之后释放所有的局部变量。在.Net里面方法的调用也是这个过程,分配动态内存进行方法的处理。

吉日嘎拉博文中纠结的并发还是排队其实仔细想象就会有答案,这两种处理方式产生的原因是因为对资源的占用问题,就是说不同线程里面有没有可能产生资源占用的问题,上面已经说到了方法调用是分配到内存里面进行处理,不同的方法在内存中所处的位置显然是不相同的。所以一般情况下这个是能够并发的,除非是在不同的内存中又涉及到了访问公有区域的位置,比如访问静态变量。

到这里基本上就把问题解释的比较清楚了,不过从那篇博客的评论中可以看到还是有不少的人对于基础东西缺乏了解,同时也建议想提高自己水平的编程者关注业务的同时多多注重基础知识的学习,每天抽点时间看点书,积累一点,时间久了就会质变~