Hibernate内存溢出分析一例
公司业务系统在进行压力测试时,压测24小时后系统发生内存溢出。经过分析读dump文件,发现org.hibernate.stat.StatisticsImpl类的hashmap类型的变量存储了大量数据(3百多万条),此成员变量消耗了2g的内存。如下图:

org.hibernate.stat.StatisticsImpl类是性能统计的功能实现,当hibernate.generate_statistics配置为true时就会启用此功能。因此此功能在生产环境下必须关闭,否则此处消耗的系统资源会影响系统性能并且最终会发生oom。
原理分析及总结
进一步分析,org.hibernate.stat.StatisticsImpl的成员queryStatistice就是内存的溢出点:

org.hibernate.stat.StatisticsImpl的源代码:
|
public class StatisticsImpl implements Statistics, StatisticsImplementor { /** entity statistics per query string (HQL or SQL) */ private final Map queryStatistics = new HashMap(); //对此变量存储数据的方法: public synchronized QueryStatistics getQueryStatistics(String queryString) { QueryStatistics qs = (QueryStatistics) queryStatistics.get(queryString); if (qs==null) { qs = new QueryStatistics(queryString); queryStatistics.put(queryString, qs); } return qs; } } |
即以查询的sql或hql作为queryStatistics的key,此map的数量量过大说明查询的sql或hql语句的查询条件不是变量绑定或预编译的写法,在进行大量的动态sql、hql查询时就会导致此问题。
从此次问题也说明以下两点很重要:
- 在编写sql、hql是应采用变量绑定或预编译的写法(如where id=?或where id=:id),避免出现大量不同的sql语句。如未遵循这个规则,在数据库中也会发生比较高的硬简析。
- hibernate.generate_statistics的功能在生产环境应禁用。
Hibernate内存溢出分析一例的更多相关文章
- jvm内存溢出分析
概述 jvm中除了程序计数器,其他的区域都有可能会发生内存溢出 内存溢出是什么? 当程序需要申请内存的时候,由于没有足够的内存,此时就会抛出OutOfMemoryError,这就是内存溢出 内存溢出和 ...
- java内存溢出分析(二)
我们继续java内存溢出分析(一)的分析,点击Details>按钮,显示如下图,我们发现有一个对象数量达到280370216个,再点击其中的List objects 点击后,显示下图 至此,我们 ...
- java内存溢出分析工具
http://www.cnblogs.com/preftest/archive/2011/12/08/2281322.html java内存溢出分析工具:jmap使用实战 在一次解决系统tomcat老 ...
- Java 内存溢出分析
原文地址:Java 内存溢出分析 博客地址:http://www.moonxy.com 一.前言 Java 的 JVM 的内存一般可分为 3 个区:堆(heap).栈(stack)和方法区(metho ...
- jmap的使用以及内存溢出分析
一.jmap的使用以及内存溢出分析 前面通过jstat可以对jvm堆的内存进行统计分析,而jmap可以获取到更加详细的内容,如:内存使用情况的汇总.对内存溢出的定位与分析 1.查看内存使用情况 jma ...
- JVM内存溢出分析java.lang.OutOfMemoryError: Java heap space
JVM内存溢出查询java.lang.OutOfMemoryError: Java heap space查出具体原因分为几个预备步骤 1.在运行java程序是必须设置jvm -XX:+HeapDump ...
- Java内存溢出分析方法(Eclipse Memory Analyzer 使用简单入门)
转载至:http://outofmemory.cn/java/jvm/OutOfMemoryError-analysis 工具 安装Memory Analyse Tools(MAT) 工具, 可以直接 ...
- BAT面试必问题系列:深入详解JVM 内存区域及内存溢出分析
前言 在JVM的管控下,Java程序员不再需要管理内存的分配与释放,这和在C和C++的世界是完全不一样的.所以,在JVM的帮助下,Java程序员很少会关注内存泄露和内存溢出的问题.但是,一旦JVM发生 ...
- 记一次 .NET 医院CIS系统 内存溢出分析
一:背景 1. 讲故事 前几天有位朋友加wx求助说他的程序最近总是出现内存溢出,很崩溃,如下图: 和这位朋友聊下来,发现他也是搞医疗的,哈哈,.NET 在医疗方面还是很有市场的,不过对于内存方面出的问 ...
随机推荐
- ubuntu下使用nethogs监控网络流量
NetHogs是一款小巧免费的开源命令行工具,用来按进程或程序实时统计网络带宽使用率. 对于使用类似于“repo tool”.“depot_tools”等工具checkout源码时非常有用,可以查看当 ...
- JQuery 的几个有用的技巧
JQuery代码 /* 新窗口打开链接:JQuery filter attr * 禁止鼠标弹出右键菜单:DOM contextmenu * 回到页面顶端:DOM scrollTo * 动态更换Css样 ...
- C#中List〈string〉和string[]数组之间的相互转换
1,从System.String[]转到List<System.String> System.String[] str={"str","string" ...
- Visual Studio 2010 更新NuGet Package Manager出错解决办法
在Visual Studio 2010的扩展管理器中发现NuGet Package Manger有最新版本更新提示,选择更新安装提示以下错误信息: 2013/4/25 1:11:48 - Micros ...
- html判断IE版本
html判断IE版本 . <!--[if !IE]><!--> 除IE外都可识别 <!--<![endif]--> . <!--[if IE]> ...
- Sliverlight中PagedCollectionView的使用
最近项目中一直在和PagedCollectionView这个类打交道.通过它,我们可以以分页的形式自动处理并显示集合中的片段,尤其是和Pager控件配合的时候更能彰显其威力. PagedColecti ...
- js各种宽高(3)
有时候项目中会用到用js获取元素位置来定位元素,首先通过图片说明scrollWidth,clientWidth,offsetWidth的关系. JS获取各种宽度.高度的简单介绍: scrollHeig ...
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- Microsoft Power BI Designer
1/25/2015年1月25发布的预览版本,可以通过以下地址下载,注意有x64 和x32 版本区别(和上次PowerMap一样,一般也推荐的使用x64版本) http://www.microsoft. ...
- 1008. Elevator (20)
The highest building in our city has only one elevator. A request list is made up with N positive nu ...