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

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

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

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

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

【问题讨论】:

    标签: java anylogic


    【解决方案1】:

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

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

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

    【讨论】:

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