`
dxm1986
  • 浏览: 435015 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于spring xxfactory.getBeanByType

 
阅读更多

在项目开发过程中,遇到一个jvm 不能回收内存的问题 ,导致到最后old区占100%,服务器一直超时响应很慢,最后自动重启。。。。。

 

通过jstack 查看得到 线程有6-700个线程全部处于阻塞状态:BLOCKED

 

 

"resin-tcp-connection-*:8080-2401" daemon prio=10 tid=0x00002aab3df66000 nid=0x1693 waiting for monitor entry [0x00002aac50f09000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:180)
        - waiting to lock <0x00002aaabe5fd790> (a java.util.concurrent.ConcurrentHashMap)
        at org.springframework.beans.factory.support.AbstractBeanFactory.isTypeMatch(AbstractBeanFactory.java:415)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanNamesForType(DefaultListableBeanFactory.java:223)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:303)
        at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeansOfType(DefaultListableBeanFactory.java:297)
        at org.springframework.context.support.AbstractApplicationContext.getBeansOfType(AbstractApplicationContext.java:941)
        at org.springframework.beans.factory.BeanFactoryUtils.beansOfTypeIncludingAncestors(BeanFactoryUtils.java:224)
        at org.springframework.beans.factory.BeanFactoryUtils.beanOfTypeIncludingAncestors(BeanFactoryUtils.java:309)

 

 

具体错误见上面,查看了一下spring的源代码

 

 

protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);
		if (singletonObject == null) {
			synchronized (this.singletonObjects) {
				singletonObject = this.earlySingletonObjects.get(beanName);
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory singletonFactory = (ObjectFactory) this.singletonFactories.get(beanName);
					if (singletonFactory != null) {
						singletonObject = singletonFactory.getObject();
						this.earlySingletonObjects.put(beanName, singletonObject);
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}
 

 

 

网上这是spring的一个缺陷,但直到最新版本也没有见修复。具体见如URL:

https://jira.springsource.org/browse/SPR-6870

 

 

Spring中  获取一个spring容器管理的Bean可以通过 getBeanByName or getBeanByType 

其中能过前者获取到的beanspring是有加缓存的,而getBeanByType 每次都是重新去生成(其实我也没去深究过他的源码)

 

 

不过我做了一个测试:

 

long startTime = System.currentTimeMillis();
		User user3 = null;
		for(int i=0; i<100000; i++) {
			user3 = BeanFactory.getBean("user");
			user3.print();
		}
		
		long endTime = System.currentTimeMillis();
		
		System.out.println("getBeanByName spend time :" + (endTime - startTime) + "ms");
		System.out.println("current momory:" + SprintTest.getUsedMemory());
		User user4 = null;
		for(int i=0; i<100000; i++) {
			user4 = BeanFactory.getBean(User.class);
			user4.print();
		}
		
		long end = System.currentTimeMillis();
		System.out.println("getBeanBytype spend time :" + (end - endTime) + "ms");
		System.out.println("current momory:" + SprintTest.getUsedMemory());
 

 

 

 

Factory方法:

 

	@SuppressWarnings("unchecked")
	public static <T> T getBean(final String name) {
		return (T) ctx.getBean(name);
	}
	
	
	public static <T> T getBean(final Class<T> clazz) {
		return clazz.cast(BeanFactoryUtils.beanOfTypeIncludingAncestors(ctx, clazz));
	}
 

 

 

 

 

结果如下:

 

 

getBeanByName spend time :86ms

current momory:899560

getBeanBytype spend time :773ms

current momory:1576440

 

 

 

很震撼。。。。时间直接是数量级的差别,空间也有很大的差别。

建议大家尽量少使用getBeanByType 吧,如果一定需要用的话,可以通过人为的加缓存来解决这种性能问题 ,尽量少使用避免这种BUG出现。

 

 

此外还引出另外一个问题 ,有的同学在Util里面引用一些Sprint管理的类,一般Util的方法都是静态的,他本身不在Sprint容器的管理范围之内,那怎么解决这个方法呢,可以用Sprng工厂去获得bean

 

 

public class BeanFactory implements ApplicationContextAware {
	
	private static ApplicationContext ctx;
	
	private static BeanFactory singleton; 
	
	public BeanFactory() {
	       singleton = this;
	}
	
	public static BeanFactory getInstance(){
		return singleton;
	}
	
	public void setApplicationContext(ApplicationContext ctx)
			throws BeansException {
		BeanFactory.ctx = ctx;
	}
	
	@Autowired
	private User user;
	
	public User getUser() {
		return user;
	}
	
	@SuppressWarnings("unchecked")
	public static <T> T getBean(final String name) {
		return (T) ctx.getBean(name);
	}
	
	
	public static <T> T getBean(final Class<T> clazz) {
		return clazz.cast(BeanFactoryUtils.beanOfTypeIncludingAncestors(ctx, clazz));
	}
 

 

 

 

可以通过BeanFactory.getInstance().getBean("name") 的方法去实现

 

如果是在Spring管理的bean里面调用别的bean的话就简了 或者你通过Spring 的@Autowired注入,或者set 注入 都可以。

 

 

 

 

 

 

 

分享到:
评论

相关推荐

    spring-mock.jar

    Classes contained in spring-mock.jar: org.springframework.mock.jndi.ExpectedLookupTemplate.class org.springframework.mock.jndi.SimpleNamingContext.class org.springframework.mock.jndi....

    org.springframework.flex-1.0.3.RELEASE.jar.zip

    org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包,org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包org.springframework.flex-1.0.3.RELEASE.jar.zip用于JAR包org.springframework.flex-1.0.3....

    org.springframework.core.jar

    《Spring框架核心模块——org.springframework.core.jar深度解析》 在Java世界中,Spring框架以其卓越的灵活性、可扩展性和模块化设计,成为了企业级应用开发的首选。其中,`org.springframework.core.jar`是Spring...

    spring4.x________

    Spring 4.x 是一个重要的Java框架,专注于简化企业级应用程序开发。这个版本的Spring框架引入了许多新特性,改进和优化,以适应不断变化的开发需求和技术趋势。在本文中,我们将深入探讨Spring 4.x的核心特性、优势...

    spring-web-2.5.jar

    org.springframework.remoting.caucho.BurlapClientInterceptor.class org.springframework.remoting.caucho.BurlapProxyFactoryBean.class org.springframework.remoting.caucho.BurlapServiceExporter.class org....

    2.精通Spring 4.x 企业应用开发实战

    1.精通Spring 4.x 企业应用开发实战精通Spring 4.x 企业应用开发实战精通Spring 4.x 企业应用开发实战精通Spring 4.x 企业应用开发实战精通Spring 4.x 企业应用开发实战精通Spring 4.x 企业应用开发实战精通Spring 4...

    org.springframework.core_3.1.1.RELEASE.jar

    《Spring核心模块详解:org.springframework.core_3.1.1.RELEASE.jar》 在Java开发领域,Spring框架无疑是最重要的框架之一,它以其强大的依赖注入、面向切面编程以及丰富的功能扩展,深受开发者喜爱。其中,`org....

    spring3.0.5 所有jar文件

    包含spring 3.0.5的所有jar文件: org.springframework.aop-3.0.5.RELEASE.jar org.springframework.asm-3.0.5.RELEASE.jar org.springframework.aspects-3.0.5.RELEASE.jar org.springframework.beans-3.0.5.RELEASE...

    org.springframework.web.jar

    9. **Integration with other Spring Modules**:`org.springframework.web.jar`与Spring框架的其他模块紧密集成,如Spring Core、Spring Beans、Spring AOP等,共同构建出一个完整的应用框架。 总的来说,`org....

    org.springframework.web的jar包.zip

    《Spring框架Web模块详解——聚焦于WebSocket服务器端点支持》 在Java开发领域,Spring框架以其强大的功能和灵活的设计闻名,而`org.springframework.web`包是Spring框架中的一个重要部分,它提供了处理HTTP请求和...

    org.spring-framework-3.0.4. 所有jar

    org.springframework.aop-3.0.4.RELEASE.jar org.springframework.asm-3.0.4.RELEASE.jar org.springframework.aspects-3.0.4.RELEASE.jar org.springframework.beans-3.0.4.RELEASE.jar org.springframework....

    spring4.x中的jar包下载,spring4.0.6下载,spring最新稳定版jar包下载

    spring4.x中的jar包下载,spring4.0.6下载,spring最新稳定版jar包下载 http://maven.springframework.org/release/org/springframework/spring/ 这个链接中有各种稳定版的jar包下载 目前官网上大部分都要maven下载

    org.springframework.web.servlet-3.0.1.RELEASE-A.jar

    Error creating bean with name 'org.springframework.web.servlet.handler.SimpleUrlHandlerMapping#0' defined in ServletContext resource [/WEB-INF/springMVC-servlet.xml]: Initialization of bean failed;...

    aopalliance-1.0.jar,org.springframework.aop-3.0.0.RELEASE.jar

    aopalliance-1.0.jar,org.springframework.aop-3.0.0.RELEASE.jar,org.springframework.jdbc-3.0.0.RELEASEorg.springframework.beans-3.0.0.RELEASE.jar等

    spring3.1 官方全部jar包

    spring3.1官方所有的jar包 org.springframework.aop-3.1.RELEASE.jar org.springframework.asm-3.1.RELEASE.jar org.springframework.aspects-3.1.RELEASE.jar org.springframework.beans-3.1.RELEASE.jar org....

    精通Spring 4.x 企业应用开发实战高清带目录.pdf

    精通Spring 4.x 企业应用开发实战 陈雄华 PDF,清晰而且有标签,目录,非常好,谢谢分享。精通Spring 4.x 企业应用开发实战 陈雄华 PDF,清晰而且有标签,目录,非常好,谢谢分享。

    org.springframework.orm-3.0.0.M1.jar

    org.springframework.orm-3.0.0.M1.jar

    精通Spring4.x企业应用开发实战pdf+源码

    《精通Spring4.x企业应用开发实战》是一本深入解析Spring框架在企业级应用中的实践指南。这本书涵盖了Spring框架的核心概念、重要特性和实际应用,旨在帮助开发者熟练掌握Spring4.x版本的各种开发技能,以提高软件...

    通过import org.springframework.web.multipart.MultipartFile;上传文件

    通过import org.springframework.web.multipart.MultipartFile;上传文件的一个工具性的jar.

    org.springframework.asm-3.0.5.RELEASE.jar

    《深入解析Spring ASM库:org.springframework.asm-3.0.5.RELEASE.jar》 Spring框架是Java开发领域中不可或缺的一部分,而org.springframework.asm-3.0.5.RELEASE.jar是Spring框架中的一个关键组件,主要涉及到字节...

Global site tag (gtag.js) - Google Analytics