AnyLogic内存错误:如何知道超出阈值多少?

Posted

技术标签:

【中文标题】AnyLogic内存错误:如何知道超出阈值多少?【英文标题】:AnyLogic memory error: how to know how much the threshold is exceeded? 【发布时间】:2021-12-21 20:20:04 【问题描述】:

我的主代理中有很多道路交通和标记元素、图表、节点和弧线。运行模拟时会抛出以下错误:

说明:_createPersistentElementsBP4_xjal() 方法的代码超出了 65535 字节的限制。

我看了这篇文章:https://noorjax.com/2018/10/17/your-agent-is-too-big-memory-problem/

但是,我想知道我超出了多少限制。有什么方法可以获取这些信息吗?因为如果距离阈值不远,我可以进行一些修改以低于该阈值。否则创建这么多新代理等很痛苦。

【问题讨论】:

【参考方案1】:

据我所知,这是对方法体的 Java 字节码 大小(即编译后的代码大小)的 Java 虚拟机 (JVM) 限制(例如,请参阅链接的 Baeldung's description到相关的 JVM 规范细节)。因此,即使您可以看到为违规方法生成的 Java source 代码,它实际上并不是 that 的长度是限制(尽管显然源代码在一定程度上与编译字节码的大小相关)。

[因此,如果 Felipe 减少变量名称长度的想法有什么不同,我感到很惊讶,因为它们没有像字节码中那样明确存储...]

所以,不,你无法判断你已经超过了多少(除非我猜你实际上询问了编译的类文件并且确切地知道你在做什么)。即使是 AnyLogic 的代码生成“导致”了问题,任何此类情况通常总是可以从面向对象(或数据结构)设计的角度更好地重新架构(如 Felipe 的示例)型号。

【讨论】:

谢谢斯图尔特,试图消化这些信息。但第一个观察:我完全同意这一点,亲自检查过:[因此,如果 Felipe 减少变量名称长度的想法有什么不同,我很惊讶,因为它们没有像字节码那样明确存储......] 这是我多年前从 Gregory Monakhov 那里得到的回复:“错误是由代码生成机制引起的,它创建了 Main 表示的大型构造函数,违反了 Java 对方法大小的限制。请解决通过重命名网络元素(例如 path1234 到 p1234)来解决问题。它应该可以解决问题。我希望在 AnyLogic 8.4 中修复该错误。“

以上是关于AnyLogic内存错误:如何知道超出阈值多少?的主要内容,如果未能解决你的问题,请参考以下文章

整合Vensim软件到AnyLogic的,但未来与opreator错误

C如何检查内存地址是不是仍在范围内[关闭]

将代码执行移至后台线程的阈值是多少? [关闭]

如何在某个阈值后拆分折线图下区域的颜色(超出 x 轴)

每次超出阈值时,如何让 CloudWatch 发送警报?

上传期间引发“超出速率限制”错误的速率限制是多少?