内存泄漏、ChangeTracking JPA、Glassfish 3.1、Eclipselink 2.5

Memory leak, ChangeTracking JPA, Glassfish 3.1, Eclipselink 2.5

只是很难在带有 Eclipselink 2 的 Glassfish 3.1.2 上的 java ee 应用程序 运行 中发现大的内存泄漏。5.x

与数据库中的用户相比,我们在内存中拥有更多的用户实体实例。 每个用户 8 MB 的持久性功能的更改跟踪变得疯狂。 最后,它花费了超过 2 GB 的空间来购买可能应该是 2 MB 的东西。

有人知道这样的事情是怎么发生的吗?

我试图在一个小应用程序中重现它,但看不到类似的行为。

如果这些是应用程序静态缓存的只读类型实例,那么对这些实例进行更改跟踪可能不是一个好主意,因为所有更改都会在其生命周期内被跟踪,直到您释放它们。

请参阅 this 了解如何对单个实体使用延迟更改跟踪

将 DAO 服务的各个部分拆分成多个部分后,我找到了一种方法来防止这种行为。

我从 JPA 组件中释放了番石榴缓存,并在缓存中使用了 Pojo 而不是分离的实体。所以我 100% 确定没有任何内容引用缓存数据。