尝试计算对象图的大小时,已达到配置的1,000个对象引用的限制。

19

我有一个 jhipster 项目,并添加了一些实体。
我的服务非常缓慢,因为出现了以下警告信息:

在尝试计算对象图的大小时,已达到配置的1,000个对象引用限制。如果继续进行大小操作,可能会导致严重的性能下降。这可以通过将 CacheManger 或 Cache <sizeOfPolicy> 元素的 maxDepthExceededBehavior 设置为 "abort" 或使用 @IgnoreSizeOf 注释添加停止点来避免。如果在已配置的限制下,降低性能不是问题,请使用 CacheManager 或 Cache <sizeOfPolicy> 元素的 maxDepth 属性提高限制值。有关更多信息,请参见 Ehcache 配置文档。

我可以更改什么以增加此限制或取消项目中的缓存?


取消缓存通常不是加快速度的常用方法 :) - Gavriel
你需要指明在哪些对象上使用缓存,以及为什么要一次性缓存这么大的图形,这样才能理解你的缓存策略。 - Louis Jacomet
2个回答

10
这是Ehcache官方文档关于缓存条目大小的内容:

缓存条目大小

放置在内存受限缓存中的元素将被测量其内存大小。被添加到缓存中的整个元素实例都会被测量,包括键和值,以及将该实例添加到内部数据结构的内存占用。键和值被测量为对象图-跟随每个引用并且也测量对象引用。这是递归进行的。

共享引用将由引用它的每个类来测量。这将导致过度陈述。因此,应忽略共享引用。

限制遍历对象图的配置

缓存大小涉及遍历对象图的过程,可以使用注释进行限制。这个过程也可以在CacheManager和缓存级别控制。

通过在resources/ehcache.xml中的CacheManager级别添加以下元素来控制大小引擎在大小化堆上元素时可以深入多少层:

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

此元素具有以下属性:

  • maxDepth 控制在 size-of 引擎执行任何操作之前可以访问多少个链接对象。 此属性为必填项

  • maxDepthExceededBehavior 指定在调整对象图大小时超出最大深度时会发生什么。此字段的可能值为:

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

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

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


6
您可以在您的resources/ehcache.xml文件中添加以下标签。属性maxDepthExceededBehavior=abort可以避免服务变慢。您还可以更改maxDepth以增加限制。
<sizeOfPolicy maxDepth="1000" maxDepthExceededBehavior="abort" />

4
我正在使用ehcache3,并通过编程方式创建缓存管理器。如何在Spring Boot中以编程方式设置这个字段? - user2758406

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接