新足迹

 找回密码
 注册

精华好帖回顾

· 九寨沟 (2011-11-6) 老陶 · OC (Opportunity Class) in NSW (2008-7-2) patrickzhu
· 新足迹厨艺大展示:今天晚餐-小盘鸡,野山椒炒牛柳,韭菜炒蛋 (2008-12-1) bluesummer · ~~~腌笃鲜~~~虾子面筋~~~洋葱大排~~~糟溜鱼片~~~生菜沙拉~~~ (2011-10-24) chesecake
Advertisement
Advertisement
查看: 1508|回复: 29

[IT] 求教大神 .NET内存分配 [复制链接]

发表于 2014-8-13 22:14 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
本帖最后由 求大神解惑 于 2014-8-13 21:33 编辑

我知道 有value-type objects (ubyte, short, int, long, float, double, decimal, bool, char, struct, enum等) 和 reference-type objects (string, object, class, delegate, array等)

当生成一个 int 时, 东西是放在stack上,当把这个int 赋给 一个 type 或 local field时,是把stack上的value赋过去的,这点明白

但是当生成一个 class或array时, 东西是放在heap上,同时生成一个reference(指向这个heap-based object的reference) 放在stack上,当把这个class或array的instance的里面的东西 赋给 type 或 local field时,是把stack上的value就是reference本身给赋过去的,而不是实际heap上的instance,这点也明白

以上生成了 两个东西,一个 a value type 和 一个 a reference type object, 并且各自有了一个type或local field 指向它们
当GC过来的时候(上面两者还都在):

1. value type instance 会不会受GC影响?完全没影响?
2. reference type object 肯定受影响了,但此时
这object还有一个variable在reference它,不能被GC掉,照理它会被作为Gen n+1 (n<2) object 被移动到相应heap区域里去,我能不能不用unsafe code强制不让它被GC移动?

如果当GC过来的时候, 唯一的variable已经out of scope了,
也就是这object 已经没有任何东西reference它,也没写destructor 或finalize代码, 照理不会被GC送去finalize queue而会直接被GC清理掉。我能不能强制不让它被立刻废掉,而用个timer让他在eg. 2小时后的第一次GC才被废掉?

求教大神

Advertisement
Advertisement

发表于 2014-8-13 22:40 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
含泪求解惑

发表于 2014-8-13 23:41 |显示全部楼层
此文章由 qu_jolin 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 qu_jolin 所有!转贴必须注明作者、出处和本声明,并保持内容完整
你的问题比较confusing...
1.Value type is on stack, reference type is on heap
2.当value type需要转换成reference type的时候,.net 叫Boxing, 反之叫unbox.
3.无论是value type or reference type , 当out of scope的时候,都应该认为会被清理掉。
4。你不要主动影响GC工作,最基本一点,因为你不知道GC什么时候开始工作的,framework 会根据系统的状况来决定什么时候进行GC. 如果你的内存比较多的话,framework 可能很长时间都不进行GC,这样即使是out of scope的变量,还在内存里头。
5.如果你需要在manage环境里面分配内存,并且传递内存到unmanage环境的话,可以通过Fix 来通知GC不要动用你分配的内存。 也可以自己分配unmanage内存解决。
6.GC每次工作都有可能移动你的变量的内存地址,叫compress, 所以如果是需要和unmanage环境工作的话,要特别注意。

发表于 2014-8-14 00:27 |显示全部楼层
此文章由 很明显 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 很明显 所有!转贴必须注明作者、出处和本声明,并保持内容完整
1. GC 不管stack,只管heap
2. value type 也可能存在于heap上,比如一个class的field
3. 你在finalize里面写个while,run个两个小时就行了

发表于 2014-8-14 00:29 |显示全部楼层
此文章由 很明显 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 很明显 所有!转贴必须注明作者、出处和本声明,并保持内容完整
另外就算足迹上有大神,也是指点江山,激昂文字的大神,你问这么具体,大神好意思现身吗

评分

参与人数 1积分 +3 收起 理由
huaxianz + 3 你太有才了

查看全部评分

发表于 2014-8-14 00:35 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
qu_jolin 发表于 2014-8-13 22:41
你的问题比较confusing...
1.Value type is on stack, reference type is on heap
2.当value type需要转换 ...

感谢回复!
但是我的问题 完全不涉及 boxing & unboxing. 也不想用unmanaged code 里的 unsafe, fix 等keyword, 纯粹技术上讨论一下。还有没有大神可以指点?

Advertisement
Advertisement

发表于 2014-8-14 00:41 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
很明显 发表于 2014-8-13 23:27
1. GC 不管stack,只管heap
2. value type 也可能存在于heap上,比如一个class的field
3. 你在finalize里面 ...

第3条,大神很幽默啊

发表于 2014-8-14 00:54 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
很明显 发表于 2014-8-13 23:27
1. GC 不管stack,只管heap
2. value type 也可能存在于heap上,比如一个class的field
3. 你在finalize里面 ...


第2条 是默认吧。 作为 reference type object 的一部分,是这样,就如同array 里的 elements 如果是 value type objects, 也是放heap上,如果是reference type objects, 就把这些references (which point to objects on other loactions on the heap) 也放在heap上

发表于 2014-8-14 00:57 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
其实不应该叫 value type objects 而其实就是 value types

发表于 2014-8-14 10:09 |显示全部楼层
此文章由 阿乌卵 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿乌卵 所有!转贴必须注明作者、出处和本声明,并保持内容完整
基本概念有点混淆
1.值类型跟引用类型的本质区别
2.GC为何要有Generation 1,2,3 & large object heap
3.unsafe code跟unmanaged resource区别
3.finalizer的真正用途和如何正确使用,顺便了解一下Dispose Pattern
4.定义了finalizer的objct内存释放的过程跟没有finalizer的object内存释放过程的区别是什么
5.废掉的概念应该是彻底释放一个object占用的内存,正常彻底释放一个object的内存的过程是什么,有几种方式?

推荐你带着这几个问题看一本书CLR via C#,应该看完GC那节你就都找到所有答案了

发表于 2014-8-14 11:01 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
阿乌卵 发表于 2014-8-14 09:09
基本概念有点混淆
1.值类型跟引用类型的本质区别
2.GC为何要有Generation 1,2,3 & large object heap

unmanaged code完全不受 CLR 控制了,像win32 handle里的程序,unsafe code 还受到CLR作用 可以用pointer style的,一般dev写unsafe code, 但不想用unsafe code...
Advertisement
Advertisement

发表于 2014-8-14 11:13 |显示全部楼层
此文章由 阿乌卵 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿乌卵 所有!转贴必须注明作者、出处和本声明,并保持内容完整
求大神解惑 发表于 2014-8-14 10:01
unmanaged code完全不受 CLR 控制了,像win32 handle里的程序,unsafe code 还受到CLR作用 可以用pointer ...

这个不是想不想用的问题,是unsafe code能帮你做什么
你第二个问题想不让GC移动一个object,那显然根本不是unsafe code做的事情

发表于 2014-8-14 11:20 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
阿乌卵 发表于 2014-8-14 10:13
这个不是想不想用的问题,是unsafe code能帮你做什么
你第二个问题想不让GC移动一个object,那显然根本不 ...

unsafe code里的fixed keyword 就是不让GC移动一个object 吧?我不想用fixed 这些unsafe code

发表于 2014-8-14 11:22 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
用fixed可以pin住你想pin的那个object, 不让GC移动它(短暂pin住,否则影响性能)。。。

发表于 2014-8-14 11:24 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
不想用p-Invoke这些,想实现顶楼的后2个问题。。。

发表于 2014-8-14 11:34 |显示全部楼层
此文章由 阿乌卵 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿乌卵 所有!转贴必须注明作者、出处和本声明,并保持内容完整
求大神解惑 发表于 2014-8-14 10:20
unsafe code里的fixed keyword 就是不让GC移动一个object 吧?我不想用fixed 这些unsafe code ...

你的理解有问题,是需要用fixed才写unsafe code还是因为写了unsafe code定义指针才需要用到fixed。
现在更糊涂你到底需要干什么了,可能遇到一个问题然后觉得需要固定内存地址才能解决,所以你就问如何固定一个内存地址,但是你有没有想过,可能固定内存地址不一定是个正确的解决办法,所以你应该把你的整个问题说明白些
Advertisement
Advertisement

发表于 2014-8-14 11:38 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
阿乌卵 发表于 2014-8-14 10:34
你的理解有问题,是需要用fixed才写unsafe code还是因为写了unsafe code定义指针才需要用到fixed。
现在 ...

是不想用unsafe, fixed keywords, 这是我的初衷。。。

发表于 2014-8-14 11:41 |显示全部楼层
此文章由 阿乌卵 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿乌卵 所有!转贴必须注明作者、出处和本声明,并保持内容完整
求大神解惑 发表于 2014-8-14 10:38
是不想用unsafe, fixed keywords, 这是我的初衷。。。

一般情况根本不需要用unsafe code, 用了unsafe code操作指针就必须用fixed,所以不明白你苦恼什么,不用就是了啊

发表于 2014-8-14 11:44 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
阿乌卵 发表于 2014-8-14 10:41
一般情况根本不需要用unsafe code, 用了unsafe code操作指针就必须用fixed,所以不明白你苦恼什么,不用 ...

谢谢大神,我也不想用啊

发表于 2014-8-14 11:47 |显示全部楼层
此文章由 阿乌卵 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿乌卵 所有!转贴必须注明作者、出处和本声明,并保持内容完整
求大神解惑 发表于 2014-8-14 10:44
谢谢大神,我也不想用啊

可听着很纠结,好像不用不行的样子呵呵
另外可不是什么大神

发表于 2014-8-14 15:13 来自手机 |显示全部楼层
此文章由 无视 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 无视 所有!转贴必须注明作者、出处和本声明,并保持内容完整
既然出了scope,你都不能用它了,干嘛不能回收?你的最终目的是什么?
Advertisement
Advertisement

发表于 2014-8-14 21:53 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
无视 发表于 2014-8-14 14:13
既然出了scope,你都不能用它了,干嘛不能回收?你的最终目的是什么?


您是说 reference-type object 没有 被任何活物 referenced 吗?我的目的是看看 这套系统 到底 可以 怎么用,所以提这些问题。。。

发表于 2014-8-14 22:10 |显示全部楼层
此文章由 flyspirit 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 flyspirit 所有!转贴必须注明作者、出处和本声明,并保持内容完整
Out of scope的东西,就别管它了,要想留住,就让它in scope

发表于 2014-8-14 22:23 |显示全部楼层
此文章由 huaxianz 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 huaxianz 所有!转贴必须注明作者、出处和本声明,并保持内容完整
还是我出来解谜吧:




















LZ的名字明显是出来捣乱的。
目的不是冲着所谓大神的答案,是要。。。。。。。。。。。。。。。











自己想。

发表于 2014-8-14 23:53 |显示全部楼层
此文章由 无视 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 无视 所有!转贴必须注明作者、出处和本声明,并保持内容完整
求大神解惑 发表于 2014-8-14 20:53
您是说 reference-type object 没有 被任何活物 referenced 吗?我的目的是看看 这套系统 到底 可以 怎么 ...

出了scope,stack上的东西就都弹栈了。即使heap上有一团东西,没有stack上的variable指它也p用没有,唯一的归宿就是被回收,挣扎着进gen-3算是最长的寿命了吧?但除了添乱又有什么用呢?

发表于 2014-8-15 01:20 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
无视 发表于 2014-8-14 22:53
出了scope,stack上的东西就都弹栈了。即使heap上有一团东西,没有stack上的variable指它也p用没有,唯一 ...

据我所知 只有 Gen0, Gen1 和 Gen2 吧?(Gen0 和 Gen1 被 Garbage Collect 的周期 比较短, Gen2 比较长,不容易被干掉),还有 Gen3 吗?我咋没听说过Gen3呢。。。
Advertisement
Advertisement

发表于 2014-8-15 09:45 |显示全部楼层
此文章由 阿乌卵 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 阿乌卵 所有!转贴必须注明作者、出处和本声明,并保持内容完整
huaxianz 发表于 2014-8-14 21:23
还是我出来解谜吧:

我也有点感觉lz不像是虚心求教的本意了

发表于 2014-8-15 12:55 来自手机 |显示全部楼层
此文章由 无视 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 无视 所有!转贴必须注明作者、出处和本声明,并保持内容完整
求大神解惑 发表于 2014-8-15 00:20
据我所知 只有 Gen0, Gen1 和 Gen2 吧?(Gen0 和 Gen1 被 Garbage Collect 的周期 比较短, Gen2 比较长 ...

哦,你是对的

发表于 2014-8-16 22:58 |显示全部楼层
此文章由 很明显 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 很明显 所有!转贴必须注明作者、出处和本声明,并保持内容完整
有这专研精神应该学java,没人用C#搞用得着了解GC的工程

.net 讲究的是框架,是magic,

不管你要做什么,微软的genius们已经知道你要做什么了,你只要drag/drop, 写一堆xml,biang的一声就搞好了

发表于 2014-8-18 20:56 |显示全部楼层
此文章由 求大神解惑 原创或转贴,不代表本站立场和观点,版权归 oursteps.com.au 和作者 求大神解惑 所有!转贴必须注明作者、出处和本声明,并保持内容完整
huaxianz 发表于 2014-8-14 21:23
还是我出来解谜吧:

我是出来问问题,请教大神。。。

发表回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Advertisement
Advertisement
返回顶部