asp-classic – VBScript Out of Memory Error

前端之家收集整理的这篇文章主要介绍了asp-classic – VBScript Out of Memory Error前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个由第三方公司建立的经典ASP CRM.目前,我可以访问源代码,并且可以进行任何更改.

随机地全天,通常在用户长时间使用之后,我的大多数页面都开始出现Out of Memory错误.

构建应用程序的方式是,所有页面和脚本都从Global.asp文件提取核心功能.在该文件中也嵌入了其他全局文件,但显示错误显示

Out Of Memory

WhateverScriptYouTriedToRun.asp Line 0

第0行是global.asp文件的include.一旦发生错误,在一段未指定的时间之后,错误发生在一段时间内消退,但随后又开始再次发生.关于应用程序的编写方式,它使用的功能,以及我已经完成的“诊断” – 它似乎是一个常见的使用函数,它隐藏了记录集之类的数据或者那种性质的东西,然后没有正确地释放它.然后其他用户尝试使用相同的功能,最终它只是填满导致错误.我有效清除错误的唯一方法是实际重启IIS,回收应用程序池,然后重新启动sql Server服务.

不用说,我和我的用户都很生气….

我无法确定由于实际错误消息呈现为行0而导致的错误 – 但是从那里我不知道在20K行代码中它可能挂起.关于如何隔离或至少指出我正确的方向以开始清理它的任何想法或想法?有没有办法让我增加VBScript的“内存”大小?我知道有一个限制但它设置为… 512K你可以增加到1GB?

以下是我尝试过的事情:

>将sql内联语句删除到视图中
>通过几百个脚本并确保每个OpenConnection& OpenRecordSet后跟一个适当的Close.
>浏览全局文件并注释掉任何大型sql语句,例如ApplicationLog(将执行的查询写入表中的函数).
>一些较小的脚本编辑.

解决方法

常见的内存泄漏

你说你正在关闭所有好的记录集和连接.

但是你要删除对象吗?

例如:

Set adoCon = new
Set rsCommon = new

'Do query stuff

'You do this:
rsCommon.close
adocon.close

'But do you do this?
Set adoCon = nothing
Set rsCommon = nothing

经典ASP中没有垃圾收集,因此任何未销毁的对象都将保留在内存中.

此外,确保在每个分支中运行关闭/未关闭.例如:

adocon.open
rscommon.open etc

'sql query
myData = rscommon("condition")

if(myData) then
  response.write("ok")
else
  response.redirect("error.asp")
end if

'close
rsCommon.close
adocon.close
Set adoCon = nothing
Set rsCommon = nothing

重定向之前没有任何东西被关闭/销毁,所以它只会在某些时候清空内存,因为并非所有逻辑分支都会导致正确的内存清除.

更好的设计

还不幸的是,这听起来像网站设计不好.我总是将我的经典ASP结构为:

<%
    Option Explicit

    'Declare all vars
    Dim this
    Dim that

    'Open connections
    Set adoCon...
    adocon.open()

    'Fetch required data
    rscommon.open strsql,adoCon
        this = rsCommon.getRows()
    rsCommon.close

    'Fetch something else
    rscommon.open strsql,adoCon
        that = rsCommon.getRows()
    rsCommon.close

    'Close connections and drop objects
    adoCon.close
    set adoCon = nothing
    set rscommon = nothing

    'Process redirects
    if(condition) then
        response.redirect(url)
    end if
%>
<html>
<body>

<%
    'Use data
    for(i = 0 to ubound(this,2)
        response.write(this(0,i) & " " & this(1,i) & "<br />")
    next
%>

</body>

</html>

希望其中一些有所帮助.

原文链接:https://www.f2er.com/aspnet/251756.html

猜你在找的asp.Net相关文章