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内存错误:如何知道超出阈值多少?的主要内容,如果未能解决你的问题,请参考以下文章