尝试计算对象图的大小时,已达到 1.000 个对象引用的配置限制缓存条目的大小调整 用于限制遍历对象图的配置

2022-09-03 14:57:59

我有一个jhipster项目,我添加了一些实体。
我的服务非常慢,因为此警告消息:

在尝试计算对象图的大小时,已达到 1.000 个对象引用的配置限制。如果大小调整操作继续进行,则可能会发生严重的性能下降。通过将 CacheManger 或 Cache <sizeOfPolicy> 元素 maxDepthExceedBehavior 设置为“中止”或添加带有@IgnoreSizeOf注释的停止点,可以避免这种情况。如果在配置的限制下性能下降不是问题,请使用 CacheManager 或 Cache <sizeOfPolicy>元素 maxDepth 属性提高限制值。有关详细信息,请参阅 Ehcache 配置文档。

我可以更改哪些内容来增加此限制或取消项目中的缓存?


答案 1

以下是 Ehcache 官方文档缓存条目大小调整的描述

缓存条目的大小调整

放入内存受限缓存中的元素将测量其内存大小。将测量添加到缓存的整个 Element 实例,包括键和值,以及将该实例添加到内部数据结构的内存占用量。键和值作为对象图进行测量 - 遵循每个参考,也测量对象参考。这种情况以递归方式进行。

共享引用将由引用它的每个类来度量。这将导致夸大其词。因此,应忽略共享引用。

用于限制遍历对象图的配置

调整缓存大小涉及遍历对象图,此过程可以通过注释进行限制。此过程还可以在缓存管理器和缓存级别进行控制。

通过在 CacheManager 级别添加以下元素来控制在堆上元素大小调整时引擎大小可以达到的深度resources/ehcache.xml

<sizeOfPolicy maxDepth="100" maxDepthExceededBehavior="abort" />  

此元素具有以下属性:

  • maxDepth它控制在大小引擎执行任何操作之前可以访问多少个链接对象。此属性是必需的

  • maxDepthExceededBehavior它指定在调整对象图大小时超过最大深度时发生的情况。此字段的可能值为:

  • continue这将强制引擎的大小记录警告并继续大小调整操作。如果未指定此属性,则使用的行为continue

  • abort这将强制引擎的大小中止大小,记录警告,并将缓存标记为未正确跟踪内存使用情况。使用此设置,返回Ehcache.hasAbortedSizeOf()true

可以在缓存管理器级别(直接位于 )和缓存级别(位于 或 下方)配置 SizeOf 策略。如果同时设置了缓存管理器,则缓存策略始终会覆盖缓存管理器 1。此元素对分布式缓存没有影响。<ehcache><cache><defaultCache>


答案 2

您可以在 resources/ehcache.xml 中添加以下标签。属性 maxDepthExceedBehavior=abort 可避免降低服务速度。您也可以更改最大深度以增加限制。

<sizeOfPolicy maxDepth="1000" maxDepthExceededBehavior="abort" />