论坛首页 Java版 Spring

Spring quartz 任务在内存中不段创建新的job对像

浏览 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的不断执行引起的,现在已将所有实体放入缓存.
  • F4dcc05d-ee7c-3954-92ce-e7b68e8d5b10-thumb
  • 描述:
  • 大小: 506.8 KB
  • 295a68ec-17da-3e15-bdc8-4e809782bbb3-thumb
  • 描述:
  • 大小: 418.1 KB
   
时间:2008-05-15
that's by design. job will be created every time. make sure your job doesn't have memory leak.
   
0 请登录后投票
时间: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>
   
0 请登录后投票
时间:2008-05-15
quartz本身并没有发现内存泄漏,我使用quartz每隔几分钟调用存储过程,程序运行了一个月都没有内存泄漏。检查一下被调用的方法中是否有内存泄漏。
   
0 请登录后投票
时间:2008-05-15
因为他是多线程的
每次到时间的时候 启动那个job和其他job没有任何关联
   
0 请登录后投票
时间:2008-05-21
这几天做了修改,内存中创建多个对像的问题得到了解决.但是运行后还是发现内存(虚拟内存)在不断的上涨,一晚上涨了3个多G.这样的问题,搞的很头大.

通过 ps aux -m
发现每次执行任务的时候,会有大线10个线程被创建,况且这些数量一直在不断的增加,一般启动的时候,大约有80多个,然后执行一晚上
大给会增加到10000个.

怀疑是这里占用了太多的系统资源,到底是怎么回事?
   
0 请登录后投票
时间:2008-05-31
每次执行任务的时候,会有大线10个线程被创建,况且这些数量一直在不断的增加。

应该是你的任务没有释放内存。没有stop threads that you created?
   
0 请登录后投票
论坛首页 Java版 Spring

跳转论坛:
JavaEye推荐