我定义了 5 个带有多个索引的临时表(必要)。每次我执行一个程序时;在程序完成之前和之后都会进行适当的清理。在运行程序时,我收到系统内存违规错误消息,并了解到定义的 5 个临时表结构不足以存储在 -Bt 启动参数中给出的条目中。
一旦我增加了-Bt中的条目,内存违规错误就不会出现。我花了差不多两天时间才找到这个问题。
Protrace、数据库日志文件和 4GL Trace 无法帮助找出问题到底发生在哪里。如果有人知道如何监控此类问题的内存违规,请帮助我
监控内存使用情况很复杂,很大程度上取决于您的平台和 OpenEdge 的特定版本。您还没有分享过。
这也不太可能是您真正的问题。这个错误:
SYSTEM ERROR: Memory violation. (49)
始终是 OpenEdge 错误。它与“有足够的(内存)来存储”没有任何关系。这意味着在 4GL 解释器中的某个地方进行了非法内存引用,如下所述:https://community.progress.com/s/article/3790它也经常是“Heisenbug”。 Protrace 会告诉您错误发生在完全无辜的代码行上。这可能会非常令人沮丧,但这并不意味着您没有足够的内存。
增加 -Bt 会增加可用于缓冲临时表的内存,但该内存是出于性能目的,它不是临时表大小的限制。如果您的临时表超过该大小,它们将被分页到磁盘并在会话临时目录(-T 启动参数)中显示为不断增长的 DBI* 文件。
增加 -Bt 可能会通过移动事物来间接“解决”你的问题,这样错误现在会在不同的情况下发生 - 也许如此不同,以至于你不会看到它再次发生。或者说这种情况发生的频率要低得多。或者它只发生在生产中而不是测试中......其中一个问题困扰了我几年。它不停地移动,随机地来来去去。我想我已经治愈了它,有时一次持续几个月,但它最终总会再次出现。最终,它被证明是某个很少使用的 4gl 功能的内部(Progress)实现中的一个错误。