浏览 655 次
|
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
|---|---|
| 作者 | 正文 |
|
时间:2008-05-14
各位兄弟帮下忙.
做了一套监控系统. 系统需要对公司的多个应用实时进行监控,但是部署以后发现内存会不停的涨(内存4G),直到爆掉. 经过性能跟踪,发现内存中会按时(配置中的启动参数)增加任务对像,比哪5分钟执行一次任务,第一次创建一个job对像,5分钟之后,又创建了一个job对像,然后积累到一定数量,系统会自动进行gc,但是内存已经开始上锯齿状上涨,这是怎么回事?为什么会每次会创建一个新的job对像? 以下是配置信息: <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation"> <value>/WEB-INF/ehcache.xml</value> </property> </bean> <bean id="mnConfigCacheBackend" class="org.springframework.cache.ehcache.EhCacheFactoryBean"> <property name="cacheManager" ref="cacheManager" /> <property name="cacheName" value="mnConfigCache" /> </bean> <bean id="mnConfigCache" class="com.easou.monitor.job.MnConfigCache"> <property name="cache" ref="mnConfigCacheBackend"></property> <property name="monitorManager" ref="MonitorManager"></property> </bean> <!-- server timer job --> <bean id="serverTimerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.easou.monitor.job.ServerTimerJob" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="1" /> <entry key="mnConfigCache"> <ref local="mnConfigCache" /> </entry> <entry key="monitorManager"> <ref local="MonitorManager" /> </entry> </map> </property> <property name="volatility"> <value>false</value> </property> <property name="durability"> <value>false</value> </property> </bean> <bean id="serverTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="serverTimerJob" /> <property name="cronExpression" value="0 0/1 * * * ?" /> </bean> <!-- 应用监控 --> <bean id="applicationTimerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.easou.monitor.job.ApplicationTimerJob" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="1" /> <entry key="mnConfigCache"> <ref local="mnConfigCache" /> </entry> <entry key="monitorManager"> <ref local="MonitorManager" /> </entry> </map> </property> <property name="volatility"> <value>false</value> </property> <property name="durability"> <value>false</value> </property> </bean> <bean id="applicationTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="applicationTimerJob" /> <property name="cronExpression" value="0 0/1 * * * ?" /> </bean> <!-- 数据库监控 --> <!-- <bean id="databaseTimerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.easou.monitor.job.DataBaseTimerJob"/> <property name="jobDataAsMap"> <map> <entry key="timeout" value="1" /> <entry key="mnConfigCache"> <ref local="mnConfigCache"/> </entry> <entry key="monitorManager"> <ref local="MonitorManager"/> </entry> </map> </property> </bean> <bean id="databaseTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="databaseTimerJob" /> <property name="cronExpression" value="0 * 0-23 * * ?" /> </bean> --> <bean id="messageTimerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.easou.monitor.job.MessageJob" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="1" /> <entry key="mnConfigCache"> <ref local="mnConfigCache" /> </entry> <entry key="monitorManager"> <ref local="MonitorManager" /> </entry> </map> </property> <property name="volatility"> <value>false</value> </property> <property name="durability"> <value>false</value> </property> </bean> <bean id="messageTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="messageTimerJob" /> <property name="cronExpression" value="0 * * * * ?" /> </bean> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no"> <property name="triggers"> <list> <ref bean="messageTrigger" /> <ref bean="applicationTrigger" /> <ref bean="serverTrigger" /> </list> </property> </bean> 附截图. 其中MnConfig,MnAlertSetting两个为实体对像,目前增长情况已解决,同时,它们在内存中数量的增长,主要是job的不断执行引起的,现在已将所有实体放入缓存. 声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
|
| 返回顶楼 | |
|
时间:2008-05-15
that's by design. job will be created every time. make sure your job doesn't have memory leak.
|
|
| 返回顶楼 | |
|
时间:2008-05-15
修改了配置,内存中的对像数量不再明显上涨,但是内存仍然在涨,以下是配置.
<!-- server timer job --> <bean id="serverJob" class="com.easou.monitor.job.ServerTimerJob"> <property name="mnConfigCache"> <ref bean="mnConfigCache" /> </property> <property name="monitorManager"> <ref bean="MonitorManager" /> </property> </bean> <bean id="serverTimerJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="serverJob" /> <property name="targetMethod" value="executeInternal" /> </bean> <!-- <bean id="serverTimerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" ref="serverJob" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="1" /> <entry key="mnConfigCache"> <ref local="mnConfigCache" /> </entry> <entry key="monitorManager"> <ref local="MonitorManager" /> </entry> </map> </property> <property name="volatility"> <value>false</value> </property> <property name="durability"> <value>false</value> </property> </bean> --> <bean id="serverTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="serverTimerJob" /> <property name="cronExpression" value="0 0/5 * * * ?" /> </bean> <bean id="applicationJob" class="com.easou.monitor.job.ApplicationTimerJob"> <property name="mnConfigCache"> <ref bean="mnConfigCache" /> </property> <property name="monitorManager"> <ref bean="MonitorManager" /> </property> </bean> <bean id="applicationTimerJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="applicationJob" /> <property name="targetMethod" value="executeInternal" /> </bean> <!-- 应用监控 <bean id="applicationTimerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" ref="applicationJob" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="1" /> <entry key="mnConfigCache"> <ref local="mnConfigCache" /> </entry> <entry key="monitorManager"> <ref local="MonitorManager" /> </entry> </map> </property> <property name="volatility"> <value>false</value> </property> <property name="durability"> <value>false</value> </property> </bean> --> <bean id="applicationTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="applicationTimerJob" /> <property name="cronExpression" value="0 0/5 * * * ?" /> </bean> <!-- 数据库监控 --> <!-- <bean id="databaseTimerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.easou.monitor.job.DataBaseTimerJob"/> <property name="jobDataAsMap"> <map> <entry key="timeout" value="1" /> <entry key="mnConfigCache"> <ref local="mnConfigCache"/> </entry> <entry key="monitorManager"> <ref local="MonitorManager"/> </entry> </map> </property> </bean> <bean id="databaseTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="databaseTimerJob" /> <property name="cronExpression" value="0 * 0-23 * * ?" /> </bean> --> <bean id="messageJob" class="com.easou.monitor.job.MessageJob"> <property name="mnConfigCache"> <ref bean="mnConfigCache" /> </property> <property name="monitorManager"> <ref bean="MonitorManager" /> </property> </bean> <bean id="messageTimerJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="targetObject" ref="messageJob" /> <property name="targetMethod" value="executeInternal" /> </bean> <!-- <bean id="messageTimerJob" class="org.springframework.scheduling.quartz.JobDetailBean"> <property name="jobClass" value="com.easou.monitor.job.MessageJob" /> <property name="jobDataAsMap"> <map> <entry key="timeout" value="1" /> <entry key="mnConfigCache"> <ref local="mnConfigCache" /> </entry> <entry key="monitorManager"> <ref local="MonitorManager" /> </entry> </map> </property> <property name="volatility"> <value>false</value> </property> <property name="durability"> <value>false</value> </property> </bean> --> <bean id="messageTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> <property name="jobDetail" ref="messageTimerJob" /> <property name="cronExpression" value="0 * * * * ?" /> </bean> <bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="no"> <property name="triggers"> <list> <ref bean="messageTrigger" /> <ref bean="applicationTrigger" /> <ref bean="serverTrigger" /> </list> </property> </bean> |
|
| 返回顶楼 | |
|
时间:2008-05-15
quartz本身并没有发现内存泄漏,我使用quartz每隔几分钟调用存储过程,程序运行了一个月都没有内存泄漏。检查一下被调用的方法中是否有内存泄漏。
|
|
| 返回顶楼 | |
|
时间:2008-05-15
因为他是多线程的
每次到时间的时候 启动那个job和其他job没有任何关联 |
|
| 返回顶楼 | |
|
时间:2008-05-21
这几天做了修改,内存中创建多个对像的问题得到了解决.但是运行后还是发现内存(虚拟内存)在不断的上涨,一晚上涨了3个多G.这样的问题,搞的很头大.
通过 ps aux -m 发现每次执行任务的时候,会有大线10个线程被创建,况且这些数量一直在不断的增加,一般启动的时候,大约有80多个,然后执行一晚上 大给会增加到10000个. 怀疑是这里占用了太多的系统资源,到底是怎么回事? |
|
| 返回顶楼 | |
|
时间:2008-05-31
每次执行任务的时候,会有大线10个线程被创建,况且这些数量一直在不断的增加。
应该是你的任务没有释放内存。没有stop threads that you created? |
|
| 返回顶楼 | |


![ecsun的博客: [宋海鹏的Blog]--{FaceYe开源} 用户头像](http://www.javaeye.com/upload/logo/user/36668/bcfaff38-8200-4288-88e6-f588c3138e36.gif?1196653519)




