Struts+Hibernate+Tomcat内存无法释放
项目是用Struts+Hibernate开发的,部署在Tomcat里面,Eclipse测试的时候发现javaw进程占用了内存后就不释放了。hibernate使用的是c3p...
项目是用Struts+Hibernate开发的,部署在Tomcat里面,Eclipse测试的时候发现javaw进程占用了内存后就不释放了。hibernate使用的是c3p0缓冲池。配置文件如下:
<session-factory>
<property name="connection.driver.class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/acs</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="c3p0.min_size">8</property>
<property name="c3p0.max_size">100</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">150</property>
<property name="c3p0.idle_test_period">10</property>
<property name="c3p0.acquire_increment">1</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="cn/edu/sdibt/acs/bean/User.hbm.xml" />
<mapping resource="cn/edu/sdibt/acs/bean/Ci.hbm.xml" />
<mapping resource="cn/edu/sdibt/acs/bean/Ti.hbm.xml" />
<mapping resource="cn/edu/sdibt/acs/bean/Major.hbm.xml" />
每一次调用bean对应的DAO接口之后都调用了Hibernate的session.close();可是内存情况一直是保持不动,调用System.gc();效果一样……
高手们 帮帮忙啊 - -!
哎呀、重复一下要点! 这个最关键的问题是内存没有回收 = =! 你把系统内存分配再多,如果不能及时回收,总有内存不够用的那一刻、、 这才是关键啊、 展开
<session-factory>
<property name="connection.driver.class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql://localhost:3306/acs</property>
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="c3p0.min_size">8</property>
<property name="c3p0.max_size">100</property>
<property name="c3p0.timeout">1800</property>
<property name="c3p0.max_statements">150</property>
<property name="c3p0.idle_test_period">10</property>
<property name="c3p0.acquire_increment">1</property>
<property name="show_sql">false</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<mapping resource="cn/edu/sdibt/acs/bean/User.hbm.xml" />
<mapping resource="cn/edu/sdibt/acs/bean/Ci.hbm.xml" />
<mapping resource="cn/edu/sdibt/acs/bean/Ti.hbm.xml" />
<mapping resource="cn/edu/sdibt/acs/bean/Major.hbm.xml" />
每一次调用bean对应的DAO接口之后都调用了Hibernate的session.close();可是内存情况一直是保持不动,调用System.gc();效果一样……
高手们 帮帮忙啊 - -!
哎呀、重复一下要点! 这个最关键的问题是内存没有回收 = =! 你把系统内存分配再多,如果不能及时回收,总有内存不够用的那一刻、、 这才是关键啊、 展开
展开全部
两种情况:
1:JAVA的内存分配机制
在运行JAVA程序的时候, 会通过参数或配置指定JAVAW分配的内存大小,分配后,这部分内存在启动后就立即被占据,这个时候javaw占的内存即使是空的也不会还给OS的,这部分是属于虚拟机的内存,即使你的java程序本身在虚拟机中占有的内存非常小,OS也要给VM分配这么多,必然不会缩小。如果不指定,系统会给一个默认大小的内存。
2:内存泄漏
我还从没碰到C3P0出内存泄漏的问题。如果内存是随着运行时间变长达到极限后抛出OutOfMemoryException,那么有可能是HIBERNATE一次实例化了大批对象并且代码里保留对象的引用了, 存在引用的时候,即使gc真的执行了,这部分对象也是不会回收的,这个需要在编码的时候养成良好的习惯,加载数据时候要适量,用完后要注意别让一些长期驻内存的对象对这些临时实体对象有引用,以方便VM执行GC时候进行回收。
另外,GC不是调用的时候就会立即执行。
=========================
看了看你代码:
it_lt 对结果集有引用
ht_t对结果集有引用
it_ks对ht_t有引用
然后result 这个数组元素对it_ks有引用
result虽然是在方法内部,但是最后被放到了session里,让session范围内对其有了强引用,所以它引用的it_lt不满足GC条件,这个时候即使VM开始GC了, 这个对象也不会被清理出内存,我也是菜鸟,对session里被覆盖掉的对象是否满足GC条件不太清楚,但是如非必要,不要在SESSION里放这么大的东西。如果你每次访问都是一个新请求,你的 SESSION是扛不住的。
至于system.gc这个,按标准来说, 基本上调了它VM是不一定会立即GC的。按开发习惯来说,也不应该依赖VM的GC。
1:JAVA的内存分配机制
在运行JAVA程序的时候, 会通过参数或配置指定JAVAW分配的内存大小,分配后,这部分内存在启动后就立即被占据,这个时候javaw占的内存即使是空的也不会还给OS的,这部分是属于虚拟机的内存,即使你的java程序本身在虚拟机中占有的内存非常小,OS也要给VM分配这么多,必然不会缩小。如果不指定,系统会给一个默认大小的内存。
2:内存泄漏
我还从没碰到C3P0出内存泄漏的问题。如果内存是随着运行时间变长达到极限后抛出OutOfMemoryException,那么有可能是HIBERNATE一次实例化了大批对象并且代码里保留对象的引用了, 存在引用的时候,即使gc真的执行了,这部分对象也是不会回收的,这个需要在编码的时候养成良好的习惯,加载数据时候要适量,用完后要注意别让一些长期驻内存的对象对这些临时实体对象有引用,以方便VM执行GC时候进行回收。
另外,GC不是调用的时候就会立即执行。
=========================
看了看你代码:
it_lt 对结果集有引用
ht_t对结果集有引用
it_ks对ht_t有引用
然后result 这个数组元素对it_ks有引用
result虽然是在方法内部,但是最后被放到了session里,让session范围内对其有了强引用,所以它引用的it_lt不满足GC条件,这个时候即使VM开始GC了, 这个对象也不会被清理出内存,我也是菜鸟,对session里被覆盖掉的对象是否满足GC条件不太清楚,但是如非必要,不要在SESSION里放这么大的东西。如果你每次访问都是一个新请求,你的 SESSION是扛不住的。
至于system.gc这个,按标准来说, 基本上调了它VM是不一定会立即GC的。按开发习惯来说,也不应该依赖VM的GC。
2010-10-21
展开全部
方法1:
在windows下,如果使用控制台的方式,也就是直接执行startup.bat方式启动,可以通过修改catalina.bat
set JAVA_OPTS=-Xms256m -Xmx512m
注意,linux下有单引号,win下不用,如果加上单引号,tomcat根本起不来。
方法2:
MyEclipse --> Window --> Preference... --> MyEclipse --> Application Servers -->
Tomcat --> Tomcat 6.X --> JDK --> Optional Java VM arguments :进行设置
设置的内容:-Xms256m -Xmx512m
建议使用方法2,我用的是这个方法解决的~~记得给分
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询