当我尝试在VS 2008中编译程序集时,(有时候,通常在项目工作2-3小时后)出现以下错误 Metadata file '[name].dll' could not be opened — 'Not enough storage is available to process this command. 通常要摆脱我需要重新启动Visual Studio 我需要在我的项目中使用的程序集足够大(> 70 Mb),可能这就是这个错误的原因,在我以前的项目中我从来没有见过这样的东西。 好吧,如果这是我的问题是为什么发生这种情况,我需要做什么来阻止它的原因。 我有足够的可用内存在我的驱动器和2Gb的RAM(只有约1.2 Gb的exception发生时利用) 我search了这样的问题的答案。 build议通常涉及到: 到在WinXP中有限的用户处理程序的数量… 到每个进程可用内存的物理限制 我想也不能解释我的情况 对于用户处理程序和其他GUI资源 – 我不认为这可能是一个问题。 大的70Mb程序集实际上是一个无GUI的代码,可以与套接字一起工作,并实现专有协议的parsing器。 在我目前的项目中,我只有3个GUI窗体,GUI控件总数<100。 我想我的情况更接近这样一个事实,即在Windows XP中,进程地址空间受到2 GB内存的限制(考虑到内存分段,有可能我没有足够大的空闲段来分配内存)。 然而,很难相信在Visual Studio中使用这个项目2-3个小时之后,细分可能会如此之大。 任务pipe理器显示VS消耗大约400-500 Mb(OM + VM)。 在编译期间,VS只需要加载元数据。 那么这个库中有很多类和接口,但是我仍然期望1-2 Mb的数量足以分配编译器用来查找所有公共类和接口的元数据 (尽pipe这只是我的build议,我不知道当CLR加载程序集元数据时究竟发生了什么)。 另外,我会说,整个程序集的大小是如此之大,只是因为它是C++ CLI库,有其他的Um托pipe库静态链接到一个DLL 。 我估计(使用Reflector).NET(托pipe)代码大约是此程序集的5-10%。 任何想法如何定义该错误的真正原因? […]
我有一个JavaFX应用程序,当按下Xbutton时最小化托盘。 我一直在通过VisualVM监视应用程序的内存趋势。 怪异的部分是,当应用程序打开或最小化到任务栏时,内存总是回到使用的初始内存。 但是,当它最小化到托盘( stage.hide() , stage.hide() )时,内存得到GCed,但处于上升趋势(泄漏)。 在VisualVM中,旧版空间不断增加,一旦达到最大值,应用程序将无响应,CPU高达80%。 我注意到, 如果我通过双击托盘图标等stage.show()应用程序,GC将清除一切恢复正常 。 但是,如果长时间离开,那么根本就不会GC老一辈。 堆转储显示javafx.scene.Scene#7和javafx.scene.Node[]#2具有最多的保留空间。 如果舞台没有隐藏,两者都不会出现。 在引用下,它显示了this[] -> dirtyNodes() 。 this – value: javafx.scene.Node[] #2 <- dirtyNodes – class: javafx.scene.Scene, value: javafx.scene.Node[] #2 <- value – class: javafx.scene.Node$ReadOnlyObjectWrapperManualFire, value: javafx.scene.Scene #7 是什么原因造成的,我该如何解决?
我有三个应用程序互相交谈。 Websocket服务器(1)接受来自浏览器的连接,parsingurl以查看需要什么数据,如果它有内存中的数据则将其提供给客户端,如果不从另一个名为“fetcher”的应用程序请求它(2)。 Fetcher接收到这个作业,从一个简单的API(3)请求它返回JSON数据,并将其发送回websocker服务器,并将其发布到连接的客户端。 然后“Fetcher”开始定期检查是否有更新到该URL /作业,并发送新的数据到websocket服务器。 我使用socket.io进行client-websocket服务器通信。 Websocket服务器和fetcher通过ZMQ套接字进行通信 。 我用130个连接加载testingwebsocket服务器。 Websocket服务器每秒向130个客户端发布160KB的数据。 一开始,它为130个连接使用了170MB的内存,但是很快就增加到了1GB,尽pipe没有新的连接。 然后socket.io的心跳信号开始失败,导致连接丢失。 我使用Nodetime来获取堆快照。 在第130个客户端连接之后,下面是内存的外观: 共有44MB的 缓冲区对象 。 在四分钟内,Buffer对象的数量急剧增加(再次没有新的连接):其中有3012个,总内存为486MB 。 再过10分钟后,总共有3535个内存消耗总量为573MB 。 我用Mozilla的memwatch找出哪行增加了内存,发现是这个函数: function notifyObservers(resourceId) { var data = resourceData[resourceId]; io.sockets.in(resourceId).emit('data', data); } 如果我注释这些行,内存使用保持不变,这是另一个确认。 任何想法如何发生? 我在ZMQ的订阅者套接字方法里面调用了这个函数,我怀疑它和这个有关系。如果我删除了函数并将它们合并成一个, // Receive new resource data const resourceUpdatedSubscriber = zmq.socket('sub').connect('tcp://localhost:5433'); resourceUpdatedSubscriber.subscribe(''); resourceUpdatedSubscriber.on('message', function (data) { var resource = JSON.parse(data); resourceData[resource.id] = […]
目前正在开发基于JavaScript的animation项目。 我注意到,正确使用setInterval() , setTimeout()甚至requestAnimationFrame分配内存没有我的请求,并导致频繁的垃圾收集调用。 更多的GC调用=闪烁:-( 例如; 当我通过在Google Chrome中调用init()来执行下面的简单代码时 ,内存分配+垃圾回收在第一个20-30秒内是正确的… function init() { var ref = window.setInterval(function() { draw(); }, 50); } function draw() { return true } 不知何故,在一分钟左右,分配内存开始奇怪的增加! 由于init()只被调用一次, 分配内存大小增加的原因是什么? (编辑:chrome截图上传) 注#1:是的,我已经尝试在下一个setInterval()之前调用clearInterval()。 问题依旧! 注2:为了隔离问题,我保持上面的代码简单和愚蠢。
当我碰到C#编译器(如果有问题的话)的一些非常好奇的代码的时候,我正在回答关于closures(合法地)延长对象生命期的可能性的问题。 最短的repro我可以find如下: 在调用包含types的静态方法的同时创build一个捕获本地的lambda。 将生成的委托引用分配给包含对象的实例字段。 结果:编译器创build一个闭包对象,该闭包对象引用创buildlambda的对象,当它没有理由时 – 委托的“内部”目标是一个静态方法,并且lambda创build对象的实例成员不需要当代表执行时,(而不是)被触摸。 实际上,编译器就像程序员没有理由地捕捉到了this 。 class Foo { private Action _field; public void InstanceMethod() { var capturedVariable = Math.Pow(42, 1); _field = () => StaticMethod(capturedVariable); } private static void StaticMethod(double arg) { } } 从发布版本生成的代码(反编译为“简单”C#)看起来像这样: public void InstanceMethod() { <>c__DisplayClass1 CS$<>8__locals2 = new <>c__DisplayClass1(); CS$<>8__locals2.<>4__this = this; // What's this doing […]
有人可以告诉我在声明一个可变数组的区别: NSMutableArray *array = [NSMutableArray array]; 和 NSMutableArray *array = [[NSMutableArray alloc] init]; 因为在开始的时候我用alloc来声明所有的数组,如果在某个函数结束时我返回了使用alloc创build的数组,我必须自动释放该数组,因为内存泄漏问题。 现在使用第一个声明,我不需要发布任何东西。 谢谢