救命啊!非常崩溃的问题!WPF如何清理内存?

救命啊!非常崩溃的问题!WPF如何清理内存?,第1张

你好,

“要是这个程序一直开着并且有人一直在用,占用的内存就会越来越多直到不可挽回”

这句话我是相当的不理解……发生这样的事,与WPF没有关系吧?应该是程序本身编写的问题导致内存泄露。

GC会自动调出了作用域的类的析构,即使没有写Finalize,也会直接继承基类的析构函数的,怎么可能有内存一定释放不掉?

所以,问题只能是变量一直没出作用域,也就是设计上的问题。不知道你的系统是什么类型,如果可能,希望你能补充下问题。

==========================================

MSDN中关于NavigationService类的说明:

By default, NavigationService does not store an instance of a content object in navigation history Instead, NavigationService creates a new instance of the content object each time it is navigated to by using navigation history This behavior is designed to avoid excessive memory consumption when large numbers and large pieces of content are being navigated to Consequently, the state of the content is not remembered from one navigation to the next

默认状况下,NavigationService并不会在导航历史中保存任何导向的目标内容类的实例,作为替代,它每次都创建目标内容的新实例并保存在导航历史中。这个特性被设计用来防止当导航到大的(占内存大的)的成员或内容页时过度的内存消耗。当然,内容页的状态在导航中不会被保存。

=======分割一下,下面是我说的=====

其实NavigationService就是一个经过改进的特殊的Command模式实现,所做的改进正是为了防止内存消耗。而正因为它是Command模式的实现,它在导航过程中一定会保存与导航次数相等的类,只不过它并没有保存这些类的状态而已。

举个例子,按这个方式导航:Page1->Page2->Page3->Page2->Page4

此时,WPF内部将保存有5个类的实例

所以……导航次数与WPF中保存的Page类(或你的其他页面类)的关系是线性增长的:

Count(PageClass In Memory) = Navigation Times

而且,最过分的是,我没有看到关于BackStack和FowardStack大小的说明。

============再分割一下==============

我以前还真没认真看过方面,写了个代码测试了下,导航过程中增加的内存很小很小。

所以,我觉得你应该可以试着优化一下页面结构,尽量少放静态的内容在里面。

BTW,大概在MS眼中,每个服务器都应该有1TB内存……

MSDN中关于导航的说明:

http://msdnmicrosoftcom/zh-cn/library/ms750478(VS85)aspx#NavigationHistory

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

囧rz

强制回收……我一般Shutdown Server的说……你试试告诉客户每10小时运行一下Shutdown -s -f -t 1 好了~~

:) 玩笑。

按我的理解(MS没说……),导航这玩意应该是跟用户绑定的,用户离开网站的话他的历史堆栈就应该释放了。

我比较在意的是你说的那个Singleton,你用Singleton干嘛啦:)不会是因为Singleton一直拿着历史堆栈的引用导致GC没法回收吧……

刚才突然想到机器里有个传说中的内存泄露检测软件,运行了一下,一股灰尘……

我这个太旧啦,我在网上看了看,貌似大家都用DotTrace和ANTS Profiler的说~我下了个DotTrace,没玩明白……

这两天被个Delphi的破项目弄郁闷了,你先琢磨下吧,学会了教我哈~

生产环境中,MySQL 不经意间吃掉全部的内容,然后开始吃掉 SWAP,性能一降再降,怎么办?

可以从下面三点查看原因:

MySQL 使用内存,有两个途径。

永久占用的内容

比如全局缓冲区(Global Buffer)类别,是在服务器启动期间从操作系统获得的,不会释放到任何一个别的进程。

动态请求的内存

线程缓冲区由MySQL使用,它是在处理新查询时从操作系统请求的内存。在执行查询之后,该内存被释放回操作系统。

这意味着 MySQL 的内存使用,是 全局缓冲区 加上 线程缓冲区 以及 允许的最大连接数

对于专用数据库服务器,该值需要保持在服务器内存的90%以下。在共享服务器的情况下,它应该保持在服务器内存的50%以下。

检查一下 MySQL 设置,有助于确定内存使用情况,从而为 MySQL 分配合适的值。

一个近似的公式:

当网站受到攻击时,有可能在短时间内建立异常高的连接数量。MySQL 中的 PROCESSLIST 可用于检测顶级用户并阻止对滥用连接的访问。

找出查询需要很长时间才能执行的语句,因为这些查询需要进一步优化服务器才能更好地执行,可以通过服务器查询日志进行识别。由于查询速度慢,导致磁盘读取较多,导致内存和CPU使用率较高,影响服务器性能。

最后,到了加内存条的时候了。虽然在优化数据库设置之后,服务器会不断地路由到使用交换内存,但也必须增加内存。俗话说:“巧妇难为无米之炊”,就是这个意思。

上面说的这些方向,大家可以在实际操作中验证体会,希望大家在数据库优化的路上,麻溜顺畅,砥砺前行。

电脑卡,慢等原因,主要是因为以下原因造成,可以为大家提供参考。

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 救命啊!非常崩溃的问题!WPF如何清理内存?

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情