一份ASP内存的释放的实验报告

实验目的:验证主动释放内存变量是否有价值.

实验原始代码:





<script language=vbscript runat=server>
Dim temp1,temp2

'temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

'temp1="" '开关变量

'temp2 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>


内存变化截图1:

截图解释:CPU的波形变化是由页面自动刷新引起的,不必在意!我们要观察的只是内存线的变化。这是原始状态,内存线保持水平无变化。

好,下面实验正式开始:

第一步:

把原始代码中的
'temp1 = space(1024*1024*50) '50MB
前面的注释号 ' 去掉,改成
temp1 = space(1024*1024*50) '50MB





<script language=vbscript runat=server>
Dim temp1,temp2

temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

'temp1="" '开关变量

'temp2 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>


再观察内存变化一段时间

内存变化截图2:

结果:内存开始出现方波。

第二步:

接着也把
'temp2 = space(1024*1024*50) '50MB
前面的注释号 ' 去掉,改成
temp2 = space(1024*1024*50) '50MB





<script language=vbscript runat=server>
Dim temp1,temp2

temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

'temp1="" '开关变量

temp2 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>


内存变化截图3:

结果:方波比原来高了一层,成了阶梯形。

第三步:

接着也把
'temp1="" '开关变量
前面的注释号 ' 去掉,改成
temp1="" '开关变量





<script language=vbscript runat=server>
Dim temp1,temp2

temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

temp1="" '开关变量

temp2 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>


看看是否能释放第一个变量所占用的内存空间

内存变化截图4:

结果:很明显,第二个波锋不见了,看来释放成功了。

第四步:

我们先把代码恢复成最初的原始代码,等内存平稳下来后,再把前三步快速做一次,以便在同一个截图里比较内存的变化情况。

内存变化截图5:

结果:可以很清楚的看到三种情况的不同。无伦执行时间和内存占用,变量主动释放都比不被动释放的好。

第五步:

接着第三步的代码,把
temp1="" '开关变量
temp2 = space(1024*1024*50) '50MB
改成
'temp1="" '开关变量
temp1 = space(1024*1024*50) '50MB





<script language=vbscript runat=server>
Dim temp1,temp2

temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

'temp1="" '开关变量

temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>


内存变化截图6:

结果:再看下步才给结论吧

第六步:


'temp1="" '开关变量

改成
temp1="" '开关变量





<script language=vbscript runat=server>
Dim temp1,temp2

temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

temp1="" '开关变量

temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>


看看结果会不会有所不同

内存变化截图7:

结果:用同一个变量名,即使再重新赋值,原来的占用过的空间也得不到释放或替换(截图6说明),而且等程序被动释放时,使用的时间也比手动的慢(综合截图6、7说明)。

下面把
temp1="" '开关变量

temp1 = space(1024*1024*50) '50MB

调换一下两句的位置
temp1 = space(1024*1024*50) '50MB

temp1="" '开关变量





<script language=vbscript runat=server>
Dim temp1,temp2

temp1 = space(1024*1024*50) '50MB

for i = 0 to 5000000 ' 延迟
next

temp1 = space(1024*1024*50) '50MB

temp1="" '开关变量

for i = 0 to 5000000 ' 延迟
next

Response.write "<meta http-equiv='refresh' content='4;url=http://localhost/memory_test.ASP'>"
</script>


后的截图8:

结果:可以看出主动释放比被动的所需要的时间要少(波峰尖)

实验结论:

主动来释放内存是有作用的,不是某些人所说的要等页面结束才能释放掉,或者只是呆等程序结束再自动释放,而是在执行过程中也可以人为控制的。特别是程序中需要调用到几个大体积的变量时,尽快释放掉已无用的变量,不但可以减轻服务器的负担,也可以加快程序的运行。

如果发现此实验过程或结论有误,欢迎指正。

最后,关于用"",empty 或 null 来释放,结果基本是一样,有兴趣的可以自己亲自动手比较试试。至于说用哪个来释放变量更正规或更有效率,我无法在此实验中判断出来,希望知道的朋友来指教。

(出处:Viphot)

(0)

相关推荐

  • 一份ASP内存的释放的实验报告

    实验目的:验证主动释放内存变量是否有价值. 实验原始代码: <script language=vbscript runat=server> Dim temp1,temp2 'temp1 = space(1024*1024*50) '50MB for i = 0 to 5000000 ' 延迟 next 'temp1="" '开关变量 'temp2 = space(1024*1024*50) '50MB for i = 0 to 5000000 ' 延迟 next Respo

  • linux 内存清理/释放命令总结

    本文介绍了linux 内存清理/释放命令,具体如下: 1.清理前内存使用情况 free -m 2.开始清理 echo 1 > /proc/sys/vm/drop_caches 3.清理后内存使用情况 free -m 4.完成! 查看内存条数命令: dmidecode | grep -A16 "Memory Device$" # sync # echo 1 > /proc/sys/vm/drop_caches echo 2 > /proc/sys/vm/drop_cac

  • 解决Keras中循环使用K.ctc_decode内存不释放的问题

    如下一段代码,在多次调用了K.ctc_decode时,会发现程序占用的内存会越来越高,执行速度越来越慢. data = generator(...) model = init_model(...) for i in range(NUM): x, y = next(data) _y = model.predict(x) shape = _y.shape input_length = np.ones(shape[0]) * shape[1] ctc_decode = K.ctc_decode(_y,

  • c# 从内存中释放Selenium chromedriver.exe

    背景 我设置了一个c#代码来运行Selenium chromedriver.exe.在运行结束时,我有browser.close()来关闭实例.(browser = webdriver.Chrome())我相信它应该从内存中释放chromedriver.exe(我在Windows 7上).但是每次运行后,内存中仍有一个chromedriver.exe实例. 问题窥探 从理论上讲,调用browser.Quit将关闭所有浏览器选项卡并终止进程. 但是,在我的情况下,我无法做到这一点 - 因为我并行运

  • c#关于非托管内存的释放问题及解读

    目录 关于非托管内存的释放问题 托管内存与非托管内存之间的转换 1.managed memory-> unmanaged memory 2.un-managed memory->managed memory 3.在c#直接申请一个un-managed mem传给c++ 总结 关于非托管内存的释放问题 硬件:大华sdk 软件平台:win10+vs2015 背景:近期在做大华工业相机SDK的采集的时候,用到Marshal.copy,将托管的代码转换成非托管的指针内存,由于没有及时释放内存指针,导致

  • IE浏览器IFrame对象内存不释放问题解决方法

    最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放.弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时IE浏览器报错,且无法关闭,只能通过杀进程的方式重启浏览器.经测试,使用open方式弹出也存在该问题. 在IE8浏览器中,open和showModalDialog弹出的内存占用有差异: open方式弹出的窗体占用的是一个独立的iexplorer.exe进程: showModalDialog方式弹出的窗

  • IE JS编程需注意的内存释放问题

    1.给DOM对象添加的属性是一个对象的引用.范例:var MyObject = {};document.getElementById('myDiv').myProp = MyObject;解决方法:在window.onunload事件中写上: document.getElementById('myDiv').myProp = null; 2.DOM对象与JS对象相互引用.范例:function Encapsulator(element) {    this.elementReference =

  • iframe如何动态创建及释放其所占内存

    最近参与一个项目的开发,由于项目是基于浏览器的胖客户端(RIA)应用程序,页面中大量调用iframe.后期测试发现浏览器内存一直居高不下,而且打开iframe页面越多内存占用越大,在IE系列浏览器中尤其明显.所有打开的iframe页面即使关闭了,内存使用也没有明显的下降,IE浏览器在内存占用达到400M左右就变得很卡.分析发现是iframe没有释放造成的,于是对所有已关闭的iframe所占用的内存进行释放,虽然不能完全释放,但是iframe内存占用量不会一直增长,整个应用内存使用量控制在150M

  • 解析PHP中的unset究竟会不会释放内存

    首先让我们看一个例子 复制代码 代码如下: var_dump(memory_get_usage());    $a = "laruence";    var_dump(memory_get_usage());    unset($a);    var_dump(memory_get_usage()); 输出(在我的个人电脑上, 可能会因为系统,PHP版本,载入的扩展不同而不同):    int(90440)    int(90640)    int(90472 注意到 90472-90

  • C/C++动态分配与释放内存的区别详细解析

    1. malloc()函数1.1 malloc的全称是memory allocation,中文叫动态内存分配.原型:extern void *malloc(unsigned int num_bytes); 说明:分配长度为num_bytes字节的内存块.如果分配成功则返回指向被分配内存的指针,分配失败返回空指针NULL.当内存不再使用时,应使用free()函数将内存块释放. 1.2 void *malloc(int size); 说明:malloc 向系统申请分配指定size个字节的内存空间,返

随机推荐