代码之家  ›  专栏  ›  技术社区  ›  David

如何监控内存使用情况?-进度4GL

  •  0
  • David  · 技术社区  · 1 年前

    我定义了5个带有多个索引的临时表(必要)。每次我执行一个程序;在程序完成之前和之后都会进行适当的清理。在运行程序时,我收到了系统内存违规错误消息,并知道定义的5个临时表结构不足以存储-Bt启动参数中给出的条目。

    一旦我增加了-Bt中的条目,就不会出现内存违规错误。我花了将近两天的时间才发现这个问题。

    Protrace、db日志文件和4GL跟踪无法帮助找出问题发生的确切位置。如果有人知道如何监控此类问题的内存违规,请帮助我

    1 回复  |  直到 1 年前
        1
  •  2
  •   Tom Bascom    1 年前

    监控内存使用情况很复杂,很大程度上取决于您的平台和OpenEdge的特定版本。这是你没有分享的。

    这也不太可能是你真正的问题。此错误:

    SYSTEM ERROR: Memory violation. (49)
    

    除非你在摆弄MEMPTR,否则这是 总是 OpenEdge的一个bug。这与“有足够的(内存)来存储”无关。这意味着在4GL解释器的某个地方进行了非法内存引用,如下所述: https://community.progress.com/s/article/3790 它也经常是 "Heisenbug" .Protrace会告诉你错误发生在完全无害的代码行上。这可能会非常令人沮丧,但这并不意味着你没有足够的记忆力。

    递增-Bt增加了缓冲临时表的可用内存,但该内存是出于性能目的,它不是对临时表大小的限制。如果你的临时表超过了这个大小,它们会被分页到磁盘,并在会话临时目录中显示为不断增长的DBI*文件(-T启动参数)。

    增加-Bt可能通过移动东西间接“治愈”了你的问题,这样错误现在就会在不同的情况下发生——也许差异如此之大,以至于你看不到它再次发生。或者它发生的频率要低得多。或者它只发生在生产中,而不是测试中。。。我有一个这样的困扰着我 它不停地走来走去。我想我已经治好了,有时一次几个月,但它最终总是会再次出现。最终,它被证明是某个很少使用的4gl功能的内部(到Progress)实现中的一个错误。

    推荐文章