问题描述
未使用的@Repository 类会导致内存消耗
我们的生产应用服务器经常宕机,我们尝试使用 eclipse 内存分析器工具分析堆转储。
发现某些 char []
对象占用了更多内存。
因此对于这个问题,我们分析了我们的应用程序代码,发现了一个未使用的 @Repository
类。
这个未使用的 @Repository
类会导致这个内存问题吗?
import org.springframework.stereotype.Repository;
@Repository
public class BenchCommentDAOImpl extends BaseDAOImpl<BenchComment> implements BenchCommentDAO {
}
更新 1
@Entity
@Table(name = "bnch_cmnt")
public class BenchComment extends BaseCrudEntity<Integer> implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "cmnt_id")
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "bnch_id",referencedColumnName = "bnch_id")
@JsonBackReference
private Bench bench;
@Column(name = "bnch_id",insertable=false,updatable=false)
private Integer benchId;
@Column(name = "xtrnl_cmnt")
private String comment;
}
@Repository
类是从 BenchComment
类扩展而来的,后者将 comment
作为字符串字段。
因此在堆转储分析器中我看到一些值与此 comment
字段匹配。这就是我怀疑的地方。
更新 2
@JsonManagedReference
@OnetoMany(mappedBy="bench",cascade=CascadeType.ALL,fetch=FetchType.EAGER,orphanRemoval=true)
private List<BenchComment> benchComments;
对于 OnetoMany
pojo 类,我们确实与 FetchType.EAGER
有 BenchComment
关系。此实现是否会导致此堆泄漏问题。?
解决方法
我认为您的内存泄漏与这个空存储库没有任何关系。
在其他项目中,我看到了未使用的存储库,但我从未听说过任何内存泄漏。
也许还有其他一些可能:
-
急切的关系
如果两个对象在await showGeneralDialog( barrierColor: AppStyle.primaryColor.withOpacity(0.3),transitionBuilder: (context,a1,a2,widget) { return Transform.scale( scale: a1.value,child: Opacity(opacity: a1.value,child: WidgetScreenToOpen()),); },transitionDuration: Duration(milliseconds: 500),barrierDismissible: true,barrierLabel: 'Label',context: context,pageBuilder: (context,animation1,animation2) { return Container(); }).then((result) { return result; });
模式下获取自身,则连接的两个对象(例如使用@JoinColumn
)可能会导致OutOfMemoryException
。
(它们会递归地相互获取,直到你的 RAM 为空)
空存储库并不意味着您的对象永远不会从数据库中获取。如果您的对象之间存在关系,那么它们有时可能会出现在您的 HEAP 中。
如果你能找到原因,那么当你在这里发帖时,我们会很高兴。
编辑
使用 EAGER
进行编辑:是的,这是您的问题!
在 FetchType.EAGER
中,您急切地获取 Bench
,而在 BenchComments
中,您急切地获取 BenchComments
。恶性循环。
只需删除 Bench
-fetch-types 就可以了。