当前位置: 代码迷 >> Web前端 >> jprofiler查看webapp内存储器遇到的怪异现象
  详细解决方案

jprofiler查看webapp内存储器遇到的怪异现象

热度:106   发布时间:2012-10-28 09:54:44.0
jprofiler查看webapp内存遇到的怪异现象
用jprofiler查看我的web项目
看到这样一幅图,此图是在应用刚刚启动时截取的
让人不解的是:为什么刚启动完spring中居然有10多个实例
看前几行:
SiteDynamicManager$$EnhancerByCGlib  23
SiteDynamicManager$$FastClassByCGlib  19
....

http://xuliangyong.iteye.com/upload/attachment/130623/bff9e8ed-9539-30d4-aaee-593de817fdd3.png

而其他的Dao对象则正常 只存在一个实例

难道是使用@Transctional的原因?

再来一张
这张图也十分的有趣,都是MessageManager类衍生出来的
MessageManager的代码见附录1
spring中配置也只有一行
<bean id="messageManager" class="com.justel.sns.service.MessageManager" />

http://xuliangyong.iteye.com/upload/attachment/130637/a6fd217b-96a9-3f25-8c0e-df91b99129ff.png


附录
public class MessageManager {
	private MessageDao messageDao;
	private UserDao userDao;
	
	@Transactional
	public void send(Message msg) throws UserNotExistException{
		User receiver = userDao.findByNickname(msg.getReceiverName());
		if(receiver == null&&msg.getReceiver()!=null){
			receiver = userDao.get(msg.getReceiver().getId());
		}
		if(receiver == null){
			throw new UserNotExistException();
		}
		msg.setReceiver(receiver);
		messageDao.save(msg);
	}
	
	@Transactional
	public void save(Message msg){
		this.messageDao.save(msg);
	}
	
	/**
	 * 发件箱
	 */
	@Transactional(readOnly=true)
	public Iterator<Message> findSentMessage(Integer id, int maxResults){
		return messageDao.findSentMessage(id, maxResults);
	}
	
	/**
	 * 发件箱,分页显示
	 */
	@Transactional(readOnly=true)
	public Page<Message> findSentMessage(int pageNo, int pageSize){
		return messageDao.findSentMessage(pageNo, pageSize);
	}
	
	/**
	 * 收件箱
	 */
	@Transactional(readOnly=true)
	public Page<Message>  inbox(int pageNo, int pageSize){
		return messageDao.findReceivedMessage(pageNo, pageSize);
	}
	
	/**
	 * 查看邮件。收件人
	 * @param id
	 * @return
	 */
	@Transactional
	public Message view(Integer id){
		Message message = messageDao.load(id);
		boolean isViewMyself = SecurityContextHolder.getId().equals(message.getSender().getId()); //自己查看自己的邮件
		boolean isSendToMyself = message.getReceiver().getId() == message.getSender().getId(); //自己发给自己的邮件
		if(isSendToMyself || !isViewMyself ){
			if( !message.isRead() ){
				message.setRead(true);
				save(message);
			}
		}
		return message;
	}
	
	/**
	 * 删除收件箱邮件
	 * @param id
	 */
	@Transactional
	public void inboxDelete(Integer id){
		Message msg = messageDao.get(id);
		if(msg.getReceiver().getId().intValue() == SecurityContextHolder.getId().intValue()){
			msg.setReceiverDelete(true);
			messageDao.save(msg);
		}
	}
	
	/**
	 * 批量删除收件箱邮件
	 */
	@Transactional
	public void inboxBatchDel(List<Integer> listId){
		for(Integer id:listId){
			Message msg = messageDao.get(id);
			if(msg.getReceiver().getId().intValue() == SecurityContextHolder.getId().intValue()){
				msg.setReceiverDelete(true) ;
				messageDao.save(msg);
			}
		}
	}
	
	/**
	 * 删除发件箱邮件
	 * @param id  邮件id
	 */
	@Transactional
	public void outboxDelete(Integer id){
		Message msg = messageDao.get(id);
		if(msg.getSender().getId().intValue() == SecurityContextHolder.getId().intValue()){
			msg.setSenderDelete(true);
			messageDao.save(msg);
		}
	}
	
	/**
	 * 批量删除发件箱邮件
	 */
	@Transactional
	public void outboxBatchDel(List<Integer> listId){
		for(Integer id:listId){
			Message msg = messageDao.get(id);
			if(msg.getSender().getId().intValue() == SecurityContextHolder.getId().intValue()){
				msg.setSenderDelete(true);
				messageDao.save(msg);
			}
		}
	}
	
	/**
	 * 获取未读邮件数
	 */
	@Transactional(readOnly=true)
	public long countUnreadMessage(Integer userId){
		return messageDao.findUnreadMessage(userId);
	}
	
	public Message get(Integer id){
		return messageDao.get(id);
	}

	public void setMessageDao(MessageDao messageDao) {
		this.messageDao = messageDao;
	}

	public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}
	
}
1 楼 east_java 2010-11-21  
这什么原因呢
  相关解决方案