找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1427|回复: 8

[求助] vlisp程序运行结束后,占用内存的大量符号,无法释放,累计导致系统无法运行。

[复制链接]
发表于 2018-9-20 20:55:10 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
本人因工作需要,自学vlisp搞项目开发,经过2年的学习实践,目前项目功能均都已按计划实现,可现在遇到的问题非常棘手,又找不到有关资料。
系统运行之后,占用内存非常之大,直到电脑提示系统内存不足,AutoCAD也弹出“致命错误,内存不足”提示并强制关闭。
我按照前辈提出的建议,将所有函数能够使用局部变量的都使用局部变量,并在变量之前加  / 符号,对于全局变量专门用函数定义,在使用结束后,将全局变量设置为nil值。顺利实现了程序运行结束后变量的值都变为nil。
以上操作收效甚微,程序运行结束后,在AutoCAD命令栏输入(atoms-family 0)命令,输出已定义的符号有4000多项,就是这些符号占用了内存且无法释放,只有关闭AutoCAD软件才能释放内存。这些符号里面,经过认真检查,没有我定义的全局变量和局部变量。
按照网友的指点,输入一下代码进行设置:
(foreach x lst
    (if (/= (type x) 'SBUR)
      (progn
        (set x nil)
       );progn
      );if
   );foreach
调试后,在获取4000多个符号中的第一个就弹出“; 用户警告: 给保护符号赋值: acSectionStateBoundary <- nil”,之后无法继续。
关于这个vlisp程序运行内存释放,各位前辈有没有好的办法,晚辈诚恳求教。

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
 楼主| 发表于 2018-9-20 20:59:22 | 显示全部楼层
以下是在AutoCAD命令栏输入(atoms-family 0)后弹出的已定义的符号:
ADOConstant-adLockBatchOptimistic * acViewport2Vertical vla-put-LockPosition
vla-AngleFromXAxis :VLR-endInsert ADOConstant-adVarBinary FITSTR2LEN
ACADSECURITYPARAMS_SIGN_DATA vla-get-ModelType vla-get-ObjectName vla-AddLeader
ADOMethod-CommitTransComplete vla-get-Enable SLIDE_IMAGE BPOLY
vla-put-SuppressZeroInches vla-get-TextStyle vla-get-Columns
vla-put-SnapRotationAngle VLISP-FASRES-UPDATE vla-get-Comment
VLR-trace-reaction MENUGROUP HZCG_TS_DHK acHatchObject
vla-GetCellStyleOverrides acArrowOpen90 acHeaderHorzBottomVisibility
vla-get-CategoryName vla-get-Saved ADOConstant-adOpenOutput ACTION_TILE
SQL_QMJC_XBID_GET_XBNTH C:VFPT-DXSB-FDJYQ acAlignmentBottomCenter
vla-put-ZScaleFactor vla-put-JogAngle vla-get-Check ADOMethod-Clone
acTableTopToBottom vla-GetBoundingBox vla-get-TextHeight
vla-AttachToolbarToFlyout ADOProperty-get-ActiveConnection <= acTrue acLnWt200
vla-GetText :VLR-beginInsert ADOConstant-adFldLong
ADOConstant-adErrProviderFailed MAX SUBSTR acExternalReference
ADOProperty-put-CommandTimeout ADOConstant-adCopyAllowEmulation
vla-get-ForceLineInside vla-SelectSubRegion acTrace vla-get-AltTextSuffix
vla-put-YVector ADOConstant-adIUnknown TBLOBJNAME acFalse vla-get-WindowLeft
vlax-safearray-fill ADOMethod-MovePrevious ADOConstant-adFailIfNotExists
vla-ScaleEntity ADOMethod-RollbackTrans ADOConstant-adFind
ADOConstant-adSchemaProperties acUnion acOCS acDimEngineering
vla-put-RenderSmoothness ADOConstant-adSeek ADOConstant-adFieldSchemaViolation
vla-get-ViewingDirection ADOProperty-put-StayInSync CSH_DXSB_BCZZ_DHK
vla-put-IndicatorFillColor vla-put-StartDraftMagnitude
vla-put-ForegroundLinesLinetypeScale XB_JZGH ADOConstant-adModeShareDenyWrite
SSNAMEX vla-SetBlockRotation vla-get-XRefDatabase acHatchLoopTypePolyline
vla-get-IsPartial AI_PUTMENUCFG acVp9 vla-get-SingleDocumentMode
:VLR-xrefSubcommandPathItem acVp8 vla-get-ModelSpace vla-put-Plottable
ADOConstant-adSeekAfter acVp7 acOPQHighGraphics acVp6 acHorzTop
ADOConstant-adDBTime acVp5 vla-get-YVector vla-get-ObjectSortBySelection
vla-get-BackgroundLinesPlotStyleName vla-get-OleSourceApp vla-put-ExtLine1Point
ADOProperty-get-Chapter VL-STRING-ELT acSelectionSetCrossingPolygon acVp4
vla-AddMInsertBlock vla-GetCorner vla-put-ShowRotation vla-GetPoint
vlax-variant-type ADOConstant-adAsyncExecute QUIT SS_YX acViewport2Horizontal
acVp3 vla-put-SuppressLeadingZeros vla-put-LeaderLength acVp2
acShadePlotWireframe vla-get-SnapOn vla-get-LowerLeftCorner ADOLISP_CONNECTTODB
DY_DXSB_GJSFX_QJBL acVp1 vlax-curve-isPlanar ADOProperty-get-Precision
ADOConstant-adErrNotReentrant ADOConstant-adMoveUnspecified C:AI_DIM_TEXTHOME
:VLR-Object-Reactor :VLR-mainFrameMovedOrResized SQL_DXSB_INSERT_JXJL
vla-put-ViewToPlot vla-get-AltSuppressTrailingZeros :VLR-Editor-Reactor
ADOMethod-CancelUpdate C:VFPT-QMJCSCJL acByLayer acAlignmentTopRight
vla-put-FontFileMap vla-put-URLNamedLocation ADOProperty-put-Rowset
acSelectionSetFence vla-put-FullScreenTrackingVector vlax-curve-getEndParam
ADOConstant-adDate WRITE-LINE AI_DIM_CEN vla-put-EndParameter vla-MoveAbove
vla-PlotToFile vla-get-ImageFile :VLR-objectClosed ADOConstant-adFldIsChapter
ENTDEL VL-REGISTRY-DESCENDENTS acPlotOrientationPortrait vla-put-TextRotation
ADOProperty-get-Description VL-INIT VFPT-VIEW-ALL vla-get-Center
vla-put-ToleranceJustification vla-get-ShowPlotStyles)a-get-PlotWithPlotStyles
vla-get-Explodable VLR-Insert-Reactor ADOConstant-adOpenSource acSymAbove acSCM
vla-get-PatternName acToolbarFloating vla-get-LinetypeGeneration PROGN
OPEN_SPECIFIED_LAYER SCCG_TS_DHK ac2007_dxf vla-GetAllProfileNames
vla-get-ForegroundLinesLineweight vla-AddEllipse
vla-get-IntersectionFillVisible acHorizontalAlignmentMiddle acHatchStyleNormal
acPrinterNeverAlert / ENTLAST GH_JZGH acLnWt211 acEnableSCM
acKeyboardEntryExceptScripts vla-put-CurveTangencyLinesLineweight
vla-get-MaxActiveViewports - LSH vla-put-ExtLine2StartPoint vla-get-PickGroup
:VLR-dxfInComplete ADOConstant-adSchemaColumnsDomainUsage VL-INFP
VLISP-FIND-PROJECT vla-put-PlotOrigin vla-put-ToleranceSuppressLeadingZeros

点评

你不贴你的代码,没法分析。 1、首先,你的程序不运行前,系统有这些符号没?如果也有,和你无关 2、如果有,那么你自己代码都调用什么了? 只是简单的LISP?  详情 回复 发表于 2018-9-20 21:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2018-9-20 21:07:47 | 显示全部楼层
本帖最后由 newer 于 2018-9-20 21:11 编辑
CAD爱好者2018 发表于 2018-9-20 20:59
以下是在AutoCAD命令栏输入(atoms-family 0)后弹出的已定义的符号:
ADOConstant-adLockBatchOptimistic * ...

你不贴你的代码,没法分析。

1、首先,你的程序不运行前,系统有这些符号没?如果也有,和你无关
2、如果有,那么你自己代码都调用什么了? 只是简单的LISP?
3、你自己写个工具,执行你的程序前,收集下符号, 运行你的程序后,你再收集下符号,然后对比,把存在的删除掉, 看看最后剩下你的程序运行后,新生成了哪些符号变量?
4、你是否新建了VLA对象,用完是否用 vlax-release-object释放他们?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-9-21 08:37:56 | 显示全部楼层
感谢前别的宝贵建议。我的代码大概有3万行左右,我粘贴的这些符号,大部分我在程序中,没有直接调用,应该是vlisp远程访问SQL Server 数据库时有些函数库调用了。我现在可以获取这些符号,在程序中也有调用VLA兑现的情况,较少。我这段时间分析了程序的代码和AutoCAD打印的这些符号,发现在这4千多个符号中,大概有12个是我自己的程序中出现的。

点评

你去查下自己的VL方面的函数,创建了对象的,用完释放他们。 既然你能在ACTOM里面看到你的符号,说明他们是全局的  详情 回复 发表于 2018-9-22 22:42
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5060个

财富等级: 富甲天下

发表于 2018-9-22 20:41:07 来自手机 | 显示全部楼层
vl-load-com这一句已加载了很多函数 枚举变量
还有lisp本身的,全部设为nil,应该所有程序都用不了了
来自: 微社区
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2018-9-22 22:42:44 | 显示全部楼层
CAD爱好者2018 发表于 2018-9-21 08:37
感谢前别的宝贵建议。我的代码大概有3万行左右,我粘贴的这些符号,大部分我在程序中,没有直接调用,应该 ...

你去查下自己的VL方面的函数,创建了对象的,用完释放他们。
既然你能在ACTOM里面看到你的符号,说明他们是全局的
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-12 22:16:19 | 显示全部楼层
感谢各位前辈的指点,经过反复分析,我已经解决了以上问题,把这次问题的分析剖析如下,希望给遇到同样问题的人提供借鉴。
问题产生的原因,不是因为全局变量没有释放,是在算法层面,我之前写的程序使用的是vlisp方位SQL Server 2012,本身SQL Server就很大,加上算法中需要反复请求数据库服务器,在请求过程中,产生的内存消耗无法释放。后来将数据库放到服务器中时候,不仅仅是内存占用居高不下(达到2G内存占用),而且程序运行几乎进入卡死状态。程序无法有效运行了。数据在高频词请求网络服务器过程中出现拥堵。
为了解决这个问题,我换了MySQL数据库,vlisp连接MySQL的问题很花了我一段时间。搞定之后,测试,将MySQL放在数据库服务器上,同样无法运行。后期只能分析算法,现在的处理方式是,将计算所需要的数据一次性由MySQL数据库服务器发送过来(通过SQL语句),在数值保存在全局变量中,后期所有的计算都从全局变量中获取数值,通过这种算法,最大程度减少对数据库服务器的访问频次,大大提高了计算效率。
以上问题的分析,有不对之处,请各位前辈指出。在这个项目开发过程中,遇到了很多问题都论坛求助,感谢各位前辈耐心指点。深表谢意。

点评

以前你连接MYSQL,包括查询创建的对象,没用 vlax-release-object 释放?  详情 回复 发表于 2018-11-12 22:21

评分

参与人数 1D豆 +5 收起 理由
marting + 5 有始有终奖!

查看全部评分

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 20个

财富等级: 恭喜发财

发表于 2018-11-12 22:21:22 | 显示全部楼层
CAD爱好者2018 发表于 2018-11-12 22:16
感谢各位前辈的指点,经过反复分析,我已经解决了以上问题,把这次问题的分析剖析如下,希望给遇到同样问题 ...

以前你连接MYSQL,包括查询创建的对象,没用 vlax-release-object 释放?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-11-12 22:37:10 | 显示全部楼层
没有。现在同样没有。现在程序计算完成后,内存占用增加20M左右,以前是2G。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-4-26 15:37 , Processed in 0.412033 second(s), 49 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表