内存大的好处到一定程度了还会有增益吗?

问题的发现
这个问题是我在写C++时考虑到的,C++需要手动管理内存,虽然现在标准库中提供了一些智能指针,可以实现基于引用计数的自动内存管理,但现实环境是很复杂的,我们仍要注意循环引用的问题。还有一个容易被忽视的问题就是对象间关系的“占有”和“非占有”,这个问题其实在具有GC的C#和Java中也一样存在。
目前.NET和Java的GC策略都属于Tracing garbage collection,基本原理是从一系列的root开始,沿着引用链进行遍历,对遍历过的对象进行标记(mark),表示其“可达(reachable)”,然后回收那些没有标记的,即“不可达”对象所占用的内存。如果你的代码中明明有的对象已经没用了,但在某些地方仍然保持有对它的引用,就会造成这个对象长期处于“可达”状态,以至其占用的内存无法被及时回收。
对象关系的问题
占有 与 非占有
好吧,这两个词是我自己发明的。这两个词是针对“拥有”而言的,占有 是表示强的拥有,宿主对象会影响被拥有对象的生命周期,宿主对象不死,被拥有的对象就不会死;非占有 表示弱的拥有,宿主对象不影响被拥有对象的生命周期。
在处理对象间关系时,如果应该是非占有关系,但却实现成了占有关系,则占有关系就会妨碍GC对被占有对象的回收,轻则造成内存回收的不及时,重则造成内存无法被回收。这里我用C#实现观察者模式作为示例:
public interface IPublisher
void Subscribe(ISubscriber sub);
void UnSubscribe(ISubscriber sub);
void Notify();
public interface ISubscriber
void OnNotify();
public class Subscriber : ISubscriber
public String Name { }
public void OnNotify()
Console.WriteLine($"{this.Name} 收到通知");
public class Publisher : IPublisher
private List&ISubscriber& _subscribers = new List&ISubscriber&();
public void Notify()
foreach (var s in this._subscribers)
s.OnNotify();
public void Subscribe(ISubscriber sub)
this._subscribers.Add(sub);
public void UnSubscribe(ISubscriber sub)
this._subscribers.Remove(sub);
class Program
static void Main(string[] args)
IPublisher pub = new Publisher();
AttachSubscribers(pub);
pub.Notify();
GC.Collect();
Console.WriteLine("垃圾回收结束");
pub.Notify();
Console.ReadKey();
static void AttachSubscribers(IPublisher pub)
var sub1 = new Subscriber { Name = "订阅者 甲" };
var sub2 = new Subscriber { Name = "订阅者 乙" };
pub.Subscribe(sub1);
pub.Subscribe(sub2);
// 这里其实赋不赋null都一样,只是为了突出效果
这段代码有什么问题吗?
在AttachSubscribers方法里,创建了两个订阅者,并进行了订阅,这里的两个订阅者都是在局部创建的,也并没有打算在外部引用它们,它们应该在不久的某个时刻被回收了,但是由于同时它们又存在于发布者的订阅者列表里,发布者“占有”了订阅者,虽然它们都没用了,但暂时不会被销毁,如果发布者一直活着,则这些没用的订阅者也一直得不到回收,那为什么不调用UnSubscribe呢?因为在实际中情况可能很复杂,有些时候UnSubscribe调用的时机会很难确定,而且发布者的任务在于登记和通知订阅者,不应该因此而“占有”它们,不应干涉它们的死活,所以对于这种情况,可以使用“弱引用”实现“非占用”。
弱引用是一种包装类型,用于间接访问被包装的对象,而又不会产生对此对象的实际引用。所以就不会妨碍被包装的对象的回收。
给上面的例子加入弱引用:
class Program
static void Main(string[] args)
IPublisher pub = new Publisher();
AttachSubscribers(pub);
pub.Notify();
GC.Collect();
Console.WriteLine("垃圾回收结束");
pub.Notify();
Console.WriteLine("=============================================");
pub = new WeakPublisher();
AttachSubscribers(pub);
pub.Notify();
GC.Collect();
Console.WriteLine("垃圾回收结束");
pub.Notify();
Console.ReadKey();
static void AttachSubscribers(IPublisher pub)
var sub1 = new Subscriber { Name = "订阅者 甲" };
var sub2 = new Subscriber { Name = "订阅者 乙" };
pub.Subscribe(sub1);
pub.Subscribe(sub2);
// 这里其实赋不赋null都一样,只是为了突出效果
public interface IPublisher
void Subscribe(ISubscriber sub);
void UnSubscribe(ISubscriber sub);
void Notify();
public interface ISubscriber
void OnNotify();
public class Subscriber : ISubscriber
public String Name { }
public void OnNotify()
Console.WriteLine($"{this.Name} 收到通知");
public class Publisher : IPublisher
private List&ISubscriber& _subscribers = new List&ISubscriber&();
public void Notify()
foreach (var s in this._subscribers)
s.OnNotify();
public void Subscribe(ISubscriber sub)
this._subscribers.Add(sub);
public void UnSubscribe(ISubscriber sub)
this._subscribers.Remove(sub);
public class WeakPublisher : IPublisher
private List&WeakReference&ISubscriber&& _subscribers = new List&WeakReference&ISubscriber&&();
public void Notify()
for (var i = 0; i & this._subscribers.Count();)
if (this._subscribers[i].TryGetTarget(out s))
s.OnNotify();
this._subscribers.RemoveAt(i);
public void Subscribe(ISubscriber sub)
this._subscribers.Add(new WeakReference&ISubscriber&(sub));
public void UnSubscribe(ISubscriber sub)
for (var i = 0; i & this._subscribers.Count(); ++i)
if (this._subscribers[i].TryGetTarget(out s) && Object.ReferenceEquals(s, sub))
this._subscribers.RemoveAt(i);
其实弱引用也不是完美的解决方案,因为限制了API使用者的自由,当然这里也没打算实现一个通用的、完美的解决办法,只是想通过个例子让你知道,即使是在有GC的情况下,不注意代码设计的话,仍有可能会发生内存泄漏的问题。
非托管资源
GC不能释放非托管资源吗?
GC的作用在于清理托管对象,托管对象是可以定义析构方法(准确点说应该叫finalizer,C#中的~类名,Java中的finalize)的,这个方法会在托管对象被GC回收前被调用,析构方法里完全可以释放非托管资源(实际上很多托管对象的实现也都这么做了),也就是说GC是可以释放非托管资源的。
但是GC的运行时间是不确定的,现在计算机的内存也都足够大,内存迟点回收不会有什么问题,但托管对象内部包装的其它资源可能属于“紧张的资源”,比如非托管内存、文件句柄、socket连接,这些资源是必须要被及时回收的,比如文件句柄不及时释放会导致该文件一直被占用,影响其它进程对该文件的读写、socket连接不及时释放会导致端口号一直被占用,那如何保证释放的及时呢?
Dispose模式
方法很简单,就是在对象中用一个方法来专门释放这些非托管资源,比如叫close, dispose, free, release之类的,然后显式调用这些方法。C#中的IDisposable接口和Java中的Closeable接口就是这个作用,因为大多数带GC的语言都使用这种设计,所以这也算是一种模式。
伪代码示例:
File f = new File("data.txt");
f.writeBytes((new String("Hello, world!")).getBytes("ascii"));
f.close();
这样就够了吗?如果close前发生异常或直接return了怎么办? – finally语句块
finally语句块保证了其中的语句一定会被执行,配合close方法,就能确保非托管资源的及时释放。(注:不调用close其实一般来讲非托管资源也是会被释放的,只是这种释放不够“及时”,因为要等到托管对象被回收)
C++中没有finally语句结构,这并不奇怪,因为C++有RAII机制,对象的销毁是确定的,而且确保析构函数的调用,所以不需要finally这种语法。
其实以上所列举的种种情况,大多数情况资源最终都会得到回收,只是回收不够及时,但这种回收不及时在资源紧张或出现极端情况时,还是有可能会发生内存泄漏的,所以说不是有了GC就可以高枕无忧了。
在文章中找不到问题答案?您还可以
热门栏目订阅【图文】高频第五章_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
高频第五章
上传于||暂无简介
大小:4.81MB
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢扩展阅读:黑洞定义& & & &黑洞是现代广义相对论中,宇宙空间内存在的一种密度极大体积极小的天体。黑洞的引力很大,使得视界内的逃逸速度大于光速。 1916年,德国天文学家卡尔o史瓦西(Karl Schwarzschild,年)通过计算得到了爱因斯坦引力场方程的一个真空解,这个解表明,如果将大量物质集中于空间一点,其周围会产生奇异的现象,即在质点周围存在一个界面——“视界”一旦进入这个界面,即使光也无法逃脱.这种“不可思议的天体”被美国物理学家约翰o阿奇巴德o惠勒(John Archibald Wheeler)命名为“黑洞”。 “黑洞是时空曲率大到光都无法从其视界逃脱脱的天体”。 &黑洞是由质量足够大的恒星在核聚变反应的燃料耗尽而死亡后,发生引力坍缩产生的。黑洞的质量极其巨大,而体积却十分微小,它产生的引力场极为强劲,以至于任何物质和辐射在进入到黑洞的一个事件视界(临界点)内,便再无法逃脱,甚至目前已知的传播速度最快的光(电磁波)也逃逸不出。 黑洞无法直接观测,但可以借由间接方式得知其存在与质量,并且观测到它对其他事物的影响。借由物体被吸入之前的因高热而放出和y射线的“边缘讯息”,可以获取黑洞存在的讯息。推测出黑洞的存在也可借由间接观测恒星或星际云气团绕行轨迹取得位置以及质量。 科学家最新研究理论显示,当黑洞死亡时可能会变成一个“白洞”,它不像黑洞吞噬邻近所有物质,而是喷射之前黑洞捕获的所有物质。 科学家猜测穿过黑洞可能会到达另一个空间,甚至是时空。黑洞-演化过程& & & &黑洞就是中心的一个密度无限大、时空曲率无限高、体积无限小的奇点和周围一部分空空如也的天区,这个天区范围之内不可见。依据阿尔伯特-爱因斯坦的相对论,当一颗垂死恒星崩溃,它将聚集成一点,这里将成为黑洞,吞噬邻近宇宙区域的所有光线和任何物质。& & & & 黑洞的产生过程类似于中子星的产生过程;某一个恒星在准备灭亡,核心在自身重力的作用下迅速地收缩,塌陷,发生强力爆炸。当核心中所有的物质都变成中子时收缩过程立即停止,被压缩成一个密实的星体,同时也压缩了内部的空间和时间。但在黑洞情况下,由于恒星核心的质量大到使收缩过程无休止地进行下去,中子本身在挤压引力自身的吸引下被碾为粉末,剩下来的是一个密度高到难以想象的物质。由于高质量而产生的力量,使得任何靠近它的物体都会被它吸进去。黑洞开始吞噬恒星的外壳,但黑洞并不能吞噬如此多的物质,黑洞会释放一部分物质,射出两道纯能量——γ射线。& & & & 也可以简单理解:通常恒星的最初只含氢元素,恒星内部的氢原子时刻相互碰撞,发生聚变。由于恒星质量很大,聚变产生的能量与恒星万有引力抗衡,以维持恒星结构的稳定。由于聚变,氢原子内部结构最终发生改变,破裂并组成新的元素——氦元素,接着,氦原子也参与聚变,改变结构,生成锂元素。如此类推,按照元素周期表的顺序,会依次有铍元素、硼元素、碳元素、氮元素等生成,直至铁元素生成,该恒星便会坍塌。这是由于铁元素相当稳定,参与聚变时不释放能量,而铁元素存在于恒星内部,导致恒星内部不具有足够的能量与质量巨大的恒星的万有引力抗衡,从而引发恒星坍塌,最终形成黑洞。说它“黑”,是因为它的密度无穷大,从而产生的引力使得它周围的光都无法逃逸。跟中子星一样,黑洞也是由质量大于太阳质量好几倍以上的恒星演化而来的。& & & & 当一颗恒星衰老时,它的热核反应已经耗尽了中心的燃料(氢),由中心产生的能量已经不多了。这样,它再也没有足够的力量来承担起外壳巨大的重量。所以在外壳的重压之下,核心开始坍缩,物质将不可阻挡地向着中心点进军,直到最后形成体积接近无限小、密度几乎无限大的星体。而当它的半径一旦收缩到一定程度(一定小于史瓦西半径),质量导致的时空扭曲就使得即使光也无法向外射出——“黑洞”就诞生了。吸积& & & &黑洞通常是因为它们聚拢周围的气体产生辐射而被发现的,这一过程被称为吸积。高温气体辐射热能的效率会严重影响吸积流的几何与动力学特性。观测到了辐射效率较高的薄盘以及辐射效率较低的厚盘。当吸积气体接近中央黑洞时,它们产生的辐射对黑洞的自转以及视界的存在极为敏感。对吸积黑洞光度和光谱的分析为旋转黑洞和视界的存在提供了强有力的证据。数值模拟也显示吸积黑洞经常出现相对论喷流也部分是由黑洞的自转所驱动的。& & & & 通常天体物理学家会用“吸积”这个词来描述物质向中央引力体或者是中央延展物质系统的流动。吸积是天体物理中最普遍的过程之一,而且也正是因为吸积才形成了我们周围许多常见的结构。在宇宙早期,当气体朝由暗物质造成的引力势阱中心流动时形成了星系。即使到了今天,恒星依然是由气体云在其自身引力作用下坍缩碎裂,进而通过吸积周围气体而形成的。行星(包括地球)也是在新形成的恒星周围通过气体和岩石的聚集而形成的。当中央天体是一个黑洞时,吸积就会展现出它最为壮观的一面。黑洞除了吸积物质之外,还通过霍金蒸发过程向外辐射粒子。蒸发& & & &由于黑洞的密度极大,根据公式我们可以知道密度=质量/体积,为了让黑洞密度无限大,那就说明黑洞的体积要无限小,然后质量要无限大,这样才能成为黑洞。黑洞是由一些恒星“灭亡”后所形成的死星,它的质量极大,体积极小。但黑洞也有灭亡的那天,按照霍金的理论,在量子物理中,有一种名为“隧道效应”的现象,即一个粒子的场强分布虽然尽可能让能量低的地方较强,但即使在能量相当高的地方,场强仍会有分布,对于黑洞的边界来说,这就是一堵能量相当高的势垒,但是粒子仍有可能出去。& & & 霍金还证明,每个黑洞都有一定的温度,而且温度的高低与黑洞的质量成反比例。也就是说,大黑洞温度低,蒸发也微弱;小黑洞的温度高蒸发也强烈,类似剧烈的爆发。相当于一个太阳质量的黑洞,大约要1后面66个0年才能蒸发殆尽;相当于一颗小行星质量的黑洞会在1小数点后面21个0加1012秒内蒸发得干干净净。毁灭& & & 黑洞会发出耀眼的光芒,体积会缩小,甚至会爆炸。当英国物理学家史蒂芬o霍金于1974年做此预言时,整个科学界为之震动。霍金的理论是受灵感支配的思维的飞跃,他结合了广义相对论和量子理论,他发现黑洞周围的引力场释放出能量,同时消耗黑洞的能量和质量。& & & &假设一对粒子会在任何时刻、任何地点被创生,被创生的粒子就是正粒子与反粒子,而如果这一创生过程发生在黑洞附近的话就会有两种情况发生:两粒子湮灭、一个粒子被吸入黑洞。“一个粒子被吸入黑洞”这一情况:在黑洞附近创生的一对粒子其中一个反粒子会被吸入黑洞,而正粒子会逃逸,由于能量不能凭空创生,我们设反粒子携带负能量,正粒子携带正能量,而反粒子的所有运动过程可以视为是一个正粒子的为之相反的运动过程,如一个反粒子被吸入黑洞可视为一个正粒子从黑洞逃逸。这一情况就是一个携带着从黑洞里来的正能量的粒子逃逸了,即黑洞的总能量少了,而爱因斯坦的公式E=mc^2表明,能量的损失会导致质量的损失。& & & 当黑洞的质量越来越小时,它的温度会越来越高。这样,当黑洞损失质量时,它的温度和发射率增加,因而它的质量损失得更快。这种“霍金辐射”对大多数黑洞来说可以忽略不计,因为大黑洞辐射的比较慢,而小黑洞则以极高的速度辐射能量,直到黑洞的爆炸。那些流传在朋友圈的高科技故事关注科技先锋,了解最新,最深的科技资讯小编不易,感谢打赏科技先锋(kejixianfeng2015) 
 文章为作者独立观点,不代表微头条立场
的最新文章
北京时间6月22日消息,据科技博客Venture Beat报道,电动汽车厂商特斯拉周二宣布,公司已向光伏技术  
今年的光亚展新闻发布会上,公布了关于2017年照明展会主题计划。健康的照明(Health 装置艺术,是指艺术家将人类日常生活中的实物、进行艺术性地改造、组合,以令其演绎出新的的艺术形态。在艺术家的由全球领先的企业及专业人士情报资讯来源汤森路透智权与科学事业群 (Intellectual6月26日下午,在经过约20个小时在轨飞行后,作为长征七号运载火箭首飞载荷组合体里的其中一位“乘客”,多用途北京时间6月22日消息,据科技博客Venture Beat报道,电动汽车厂商特斯拉周二宣布,公司已向光伏技术  
今年的光亚展新闻发布会上,公布了关于2017年照明展会主题计划。健康的照明(Health 装置艺术,是指艺术家将人类日常生活中的实物、进行艺术性地改造、组合,以令其演绎出新的的艺术形态。在艺术家的由全球领先的企业及专业人士情报资讯来源汤森路透智权与科学事业群 (Intellectual6月26日下午,在经过约20个小时在轨飞行后,作为长征七号运载火箭首飞载荷组合体里的其中一位“乘客”,多用途1956年IBM的一个工程小组向世界展示第一台磁盘存贮系统Ramac,1968年Winchester技术被提摘要:人造地球卫星的轨道虽然不外乎圆形和椭圆形两种,但方向和形态却是千差万别。卫星的轨道形状与人造地球卫星入工业和信息化部、发展改革委、财政部联合发布机器人产业发展规划(年):  机器人既是先进制造松下近日宣布,向日本西部燃气公司旗下企业SG Greenhouse交付了“人造光型植物工厂系统”。SG Gr爱思强(Aixtron)德国总部德媒称,德国半导体沉积设备供应商、国际上市公司爱思强(Aixtron)5月2
“液态金属”,指的是一种不定型金属,液态金属可看作由正离子流体和自由电子气组成的混合物。液态金属成因基础制动装置过热导致的刹车失灵现象已经不常见了,货车和巴士的驾驶员可以更好地控制车辆运行.
从产业角度来看  要论Google的DayDream,就要先从其Cardboard谈起了。 
最近无人机行业有点火,继行业巨头大疆创新估值近百亿美元后,众多巨头纷纷涌入这个市场,运动相机霸主G那些流传在朋友圈的高科技故事震撼!有了此飞机从此不再有空难!十大可能毁灭世界的科学实验让自行车瞬间变电动车的为寻求中德中型企业合作共赢的契机,就中德中型制造企业的发展现状和异同进行深入地互动交流,在4月6日上海微技术扩展阅读:黑洞定义
黑洞是现代广义相对论中,宇宙空间内存在的一种密度极大体积极小的天体。黑洞的引10.流星鱼实验  流星鱼实验是发生在外太空最大的人为核爆炸,设计它是为了测试高空核爆炸效应。实验由冷战高潮只要将一个小小的装置,安装到你心爱的自行车上,它就会瞬间变成牛气哄哄的一台电动车
这款名叫add导读:虚拟现实头戴显示器设备,即VR头显,VR眼镜,眼镜VR等称呼,VR头显是利用仿真技术与计算机图形学人机所有的玻璃都可能是手机!这是美国康宁玻璃公司(就是给苹果等所有高端手机提供康宁大猩猩屏幕玻璃那家公司)制作的关注科技先锋,了解最新,最深科技资讯感谢打赏美国专利局的公开资料显示,谷歌获得了太阳能智能隐形眼镜专利。还记得《碟中谍4》中的搞笑画面吗?汤姆·克鲁斯带高度自动化的宝马工厂幽默谷阅读原文小编不易,感谢打赏关注科技先锋,了解最新,最深科技资讯锂空气电池工作原理导读 ID:MotorsWorld剑桥大学突破锂空气电池瓶颈,一次充电可开650公里。当电导语:坐落于太平洋海底的大塔穆火山是地球最大的火山,在最近的探险中,科学家发现了一些惊喜。 从新的3D地图中导语:从达斯·维德的维生系统到塔图因星球上的双重日落,《星球大战》为现实世界带来了很多灵感。 歼星舰正在驶向据韩媒报道,中国移动董事长尚冰近日与韩国电信公司董事长Hwang Chang-gyu、日本NTT DoCoMkejixianfeng2015在这里了解科技界最新消息,学到科技知识。热门文章最新文章kejixianfeng2015在这里了解科技界最新消息,学到科技知识。我的游戏更新了数次,内存都占满了电脑好卡,如果我把游戏删了再重新下载还会有那么大内存吗?_百度知道
我的游戏更新了数次,内存都占满了电脑好卡,如果我把游戏删了再重新下载还会有那么大内存吗?
内存都占满了电脑好卡我的游戏更新了数次?我怎么发觉玩地越久就越卡,如果我把游戏删了再重新下载还会占那么大的内存吗
存是即时处理的记忆体。。游戏不用删了。系统分区要保留尽可能多的空间,虚拟内存设置高点。游戏更新和下载会是占用硬盘容量,就重装系统好了,定时整理磁盘。如果再觉得慢,能保持电脑运行速度,重新下载一样要更新的。电脑卡通常是因为垃圾文件或者流氓软件造成的。游戏运行时会占用内存。,用windows优化大师及时清理垃圾文件,游戏更新不占用内存。而且某些杀毒软件会造成卡机现象
其他类似问题
为您推荐:
其他3条回答
用U盘把游戏考到空间大的分区里就行了!既然能更新那就是网络游戏,网络游戏一般都是绿色般的!不用担心考过去不能玩
不会,你不一定要重新删除呀,你可以用Windows优化大师进行优化,这样你的机子就会好一点!
重启电脑吧
内存的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁

我要回帖

更多关于 xp最大支持多少内存 的文章

 

随机推荐