引以为戒 .NET开发者常犯的错误 |
时间:2011-05-16 20:03:41 来源:站内 作者:潘春会 |
当然还有另外一个做法,就是用Using语句,提交.NET应用的垃圾收集器自动收集; 相关的文章很多;这里不再特别赘述。
2.对象只管创建应用,不管释放篇
我们继续用[Sample-01]的代码:
Dim dtResult As New DataTable
谁会发现它被释放,你不能,我也不能,从来没有被释放过。
“Dim dtResult As New DataTable”行的代码解释是,要在内存划分一个空间给这个定义的对象dtresult; 系统要划分多大的空间呢?呀,我没有研究过(留给那些有心人吧,呵呵..);但有一点,要在内存划分一个空间,就是要占用内存;那么内存有多大呢,不是无限大吧;也是有限的;所有运行上述代码的最终结果是,系统的执行效率越来越慢;有人就怀疑,我有内存1到2G的,加上虚拟内存就更大;我只能说你的怀疑没错; 可是你的应用程序就用这么一只函数吗?我想肯定不是;所以上百只函数的应用执行对内存的消耗可想而知;如果是后台自动运行的程序,及时是一个function,也会让系统崩溃;这只是一个简单的例子,有更复杂的; 象这样的对象应用还有:Dataset, Datatable,DataReader,DataAdapter,Datagrid..等;
那么怎么解决这些问题呢?
(1)在Try catch 语句前定义好所用的对象; 如:
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
Catch ex As Exception
Throw ex
Finally
End Try
(2)释放的语句如下:
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
……………..
Catch ex As Exception
--释放应用的对象
Throw ex
Finally
--使用完后,释放应用的对象
dtResult.dispose --从内存里清楚该对象
DR.dispose -从内存里清楚该对象
DS.dispose -从内存里清楚该对象
End Try
有人习惯写成下面这样:
Dim dtResult As New DataTable
Dim DR as New DataReader
Dim DS as New Dataset
Try
..
‘使用完后,释放应用的对象
dtResult.dispose ‘从内存里清楚该对象
DR.dispose ‘从内存里清楚该对象
DS.dispose ‘从内存里清楚该对象
Catch ex As Exception
‘释放应用的对象
Throw ex
Finally
End Try
这不是也释放了吗?我想问的是,如果程序出现异常,它们会释放吗?我肯定得告诉大家,它们一定不能释放。为了确保程序的稳定运行,我建议大家都来用Try Catch语句。
(3)绝不建议在循环语句写如下的语句:
Foreach (DataRow row in tabl.select(“”,”ProductID”)
……………
Dim DS new Dataset 记住此乃写代码之大忌;
Dim DT new Databable….
………….
Next
还有一种写法
Dim DS new Dataset
Dim DT new Databable…
Foreach (DataRow row in tabl.select(“”,”ProductID”)
DS=GetDatase
DT=GetDatatable……………
.
………….
Next
正确的写法是:
Dim DS new Dataset
Dim DT new Databable…
Try
Foreach (DataRow row in tabl.select(“”,”ProductID”)
DS=nothing ‘每次使用,都先把内存空间释放出来
DT=nothing ‘每次使用,都先把内存空间释放出来
DS=GetDatase
DT=GetDatatable……………
.
………….
Next
Catch ex As Exception
Throw ex
Finally
DS.dispose
DT.dispose
End Try 另外,提醒大家一点,记得用 For Each 语句替代For i=0 to Rowcount-1;这样的效率改善也是明显的;
3.调试(Debug)模式下编译就用于应用环境中篇
大家看下面的图片:
有人会留意这个界面吗?有,但一定不多。
接着,程式开发好(也包括单元测试),然后编译直接分发到应用环境。
整个过程就结束了;谁也不曾想,这里埋下了一个深深的地雷; 据微软的人讲,这样分发的程式到应用环境,你有多少内存恐怕都不够,所以微软建议我们做如下的工作:
“請將Web.config中的debug及Trace均設為False。還有您的所有程式請確保compile為Release Mode
Application set up for debugging
One reason for high memory that we see here in Support a lot is when you have debugging, tracing, or both enabled for your application.
While you are developing your application, this is a necessity.By default, when you create your application in Visual Studio .NET, you will see the following attribute set in your Web.config file:
and/or
Also, when you do a final build of your application, make sure that you do this in "Release" mode, not "Debug" mode. ”
如果不这样做会有什么事情发生? 我分享一个同事的感受给大家:“已经是很强悍的的DB和AP服务器(全部是刀片式服务器)了,可是问题一而再再而三地发生,那种感觉真的很无助很凄凉啊~”
2/3 首页 上一页 1 2 3 下一页 尾页 |
|
|
|