最近公司的应用经常报OOM,一开始我以为是公司业务数据太多,导致内存不够,所以只是简单的把容器的内存加大。撑了几天后这个错仍然被报出来。后来我仔细分析过项目代码后,没有发现有任何引起内存泄漏的地方。百思不得其解,于是我决定在OOM异常发生的那刻将JVM内存堆导出来仔细分析,我在生产环境的某一台机器上加上了JVM启动参数:“-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=/app/vas_platform/temp/” 然后等了一天,终于又报错了,拿出堆文件用“Eclipse Memory Analyzer”打开分析,发现占用内存的地方居然有75%来自org.hibernate.engine.StatefulPersistenceContext(靠,这不科学啊!)
后来查看各个StatefulPersistenceContext里面的内容发现里面保存存着多达几十万个实体对象,其中大部分都是比较大的对象(本身字段特别多而且还级联了许多其它的实体一级接着一级的级联),心想为什么会这样呢?一个请求过来->打开Session->处理完业务->关闭Session,没问题啊而且所有页面均没有卡死的现像,难道代码里面有占用Session没关的地方。于是仔细分析代码终于被我发现问题了。我们的应用会定时启动几个quartz任务来处理复杂且影响页面响应时间的业务,这部分业务的业务数据是从数据库查的,只有业务数据全都被处理完后这个quartz才会结束。
因为Hibernate的Session是带有一级缓存的,每个经由Session查出来的对象会填充至一级缓存,以避免多次的数据库仿问。当这几个quartz任务的业务数据较多的时候,就会有很多对象被填入一级缓存这样一来持久化上下文中保存的对象越来越多。最终导致OOM.
【留给自己】
相关推荐
Hibernate提供了一级缓存(Session级别的)和二级缓存(SessionFactory级别的)。一级缓存默认开启,自动管理对象状态。二级缓存可配置第三方缓存提供商,如EhCache,提高数据读取性能。 **八、注解使用** 除了XML...
8. **缓存机制**:Hibernate提供了一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),能有效提高性能。同时,还支持第三方缓存服务如Ehcache。 9. **实体生命周期**:Hibernate管理对象的生命...
9. **第二级缓存**:Hibernate支持二级缓存,它可以提高应用程序性能,减少对数据库的访问。二级缓存分为提供商特定的区域和通用的查询缓存。 10. **性能优化**:教程可能涵盖如何优化Hibernate,例如批量操作、...
同时,讲解了Hibernate的缓存机制,包括一级缓存和二级缓存,以及如何配置和使用第三方缓存系统,如EhCache和Redis,以提高应用性能。 第四部分:高级特性和最佳实践 最后,教程涵盖了Hibernate的高级特性,如懒...
缓存可以提高数据访问速度,Hibernate提供了第一级缓存和第二级缓存两种级别的缓存策略。 在对象关系映射部分,手册会阐述Hibernate的注解机制,如@Entity、@Table、@Id、@GeneratedValue等,这些注解用于将Java类...
除此之外,文档还会介绍第二级缓存(Second Level Cache)和查询缓存(Query Cache),这两种缓存机制能显著提升应用程序的性能。Hibernate还支持JPA(Java Persistence API),因此,对于熟悉JPA的开发者,文档也会...
包括第一级缓存(Session级别)和第二级缓存(SessionFactory级别),以及查询缓存的使用和配置。 7. **性能优化**:作者会分享如何优化Hibernate应用,包括延迟加载、批处理更新、预加载关联对象等策略,以提高...
Hibernate的持久化缓存机制是基于一级缓存(Session级别的缓存)实现的。当调用`save()`, `update()`, `delete()`等方法时,Hibernate不会立即执行SQL语句,而是将这些操作记录在缓存中。直到Flush操作发生时,...
Hibernate提供了第一级缓存和第二级缓存,通过合理设置可以提高应用性能。另外,懒加载和即时加载策略也会有所涉及,这些策略有助于优化数据获取的效率。 此外,书中还会讲解如何进行性能优化,包括批处理、延迟...
Hibernate 3.3 提供了多种缓存策略,包括一级缓存(Session级别的缓存)和二级缓存(SessionFactory级别的缓存),以及第三方缓存插件如Ehcache和Infinispan的集成。这些策略有助于提高性能并降低数据库负载。 ### ...
4. **缓存机制**:讨论Hibernate的级联缓存策略,包括一级缓存(Session缓存)和二级缓存(SessionFactory缓存),以及第三方缓存服务如 EhCache 和 Infinispan 的集成。 5. **性能优化**:分析可能影响Hibernate...
该书详细介绍了Hibernate的基础概念、配置、实体管理、查询语言(HQL和Criteria API)、关联映射、缓存策略、性能优化以及高级特性。通过实际案例,读者可以了解到如何在项目中有效地使用Hibernate进行数据持久化。书...
2. 缓存:提高性能,分为一级缓存(Session级别)和二级缓存(SessionFactory级别),可自定义实现第三方缓存服务。 七、事务处理 在Hibernate中,事务管理是非常关键的一部分,可以使用Transaction接口来控制事务...
8. **缓存机制**:理解Hibernate的缓存策略,包括一级缓存和二级缓存,以及如何自定义缓存配置。 9. **事务管理**:学习Hibernate的事务处理,包括自动提交、显式事务控制和事务隔离级别。 10. **性能优化**:讨论...
5. **缓存机制**:探讨Hibernate的一级缓存和二级缓存,以及第三方缓存插件如Ehcache的配置和使用。 6. **查询优化**:讲解如何提高Hibernate的查询性能,避免N+1查询问题,以及批处理和懒加载的策略。 7. ** ...
其次,"Hibernate ORM用户指南"深入讲解了Hibernate的高级特性,如缓存机制、第二级缓存配置、级联操作、关联映射策略等。这个文档还会介绍如何使用Criteria API进行动态查询,以及如何处理复杂的一对多、多对一、一...
- **缓存机制**:探讨一级缓存和二级缓存的工作原理及其配置方法。 - **事务处理**:讲解Hibernate如何管理事务边界,确保数据一致性。 - **批量处理**:提供提高数据操作效率的策略,如批量插入、更新等。 #### ...
8. **缓存机制**:Hibernate的缓存策略,包括一级缓存(Session级别的)和二级缓存(SessionFactory级别的),以及第三方缓存集成,如 EhCache。 9. **事务管理**:介绍Hibernate的事务处理,包括编程式和声明式...
教程会介绍第一级缓存和第二级缓存的概念,以及如何配置和使用缓存来提高应用程序性能。同时,事务管理也是必不可少的话题,包括本地事务和分布式事务的处理。 最后,教程可能会涵盖一些高级主题,如Hibernate的...