- 浏览: 939178 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
hw7777777:
非常感谢作者提供这么好的工具,在使用的过程中遇到一些问题?1、 ...
基于java nio的memcached客户端——xmemcached -
SINCE1978:
多久过去了时间能抹平一切
无路用的人 -
fangruanyjq:
[img][/img]引用
用osworkflow写一个请假例子(提供代码下载) -
thinkingmysky:
楼主,你确定,java memached client能处理并 ...
memcached java client性能测试的几点疑问和说明 -
hellostory:
aaa5131421 写道07年2月hibernate已经出来 ...
dozer与BeanUtils
这个类在spring2.01前没有被改写,spring2.06似乎已经改写了,还未看源码。不过这不是我所在意的问题。我在《org.springframework.beans简单解读》中的对这个类的理解是不正确的。我们先看看Guillaume Poirier对这个类中为什么使用WeakHashMap的解释:
WeakHashMap is implemented with WeakReference for keys, and strong reference for values. That means if the value has a strong reference on the key, then the key cannot be garbage collected until the WeakHashMap is ready for collection. However, if the value has no strong reference on its key, then being in the WeakHashMap won't prevent the key and value from being garbage collected if it is otherwise ready. The WeakHashMap knows when to remove the key (and the value with it) by using the notification provided by the java.lang.ref package. For more information on this, see: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ref/package-summary.html
So the problem here with the CachedIntrospectionResults is that it uses BeanInfo and PropertyDescriptor that both have strong reference to the class (indirectly by a reference on Methods of the class). That will be solved with JDK 1.5 that uses a combinaison of Weak and Soft Reference to the Class and Method objects, but for 1.4.2, there's not really any better solution than to flush the Introspector's cache and/or use WeakReference on CachedIntrospectionResults. Using WeakReference on the CachedIntrospectionResults is safer, but decrease performance, and in such case a manual Instrospector.flushFromCaches(Class) must be used, so that the Instrospector does not keep a strong reference on the BeanInfo.
When a webapp is hot-redeployed, a new ClassLoader is created to load the webapp, and the old one is thrown away, expected to be garbage collected. For the collection to happen, the server must clear any strong reference to the ClassLoader or its classes, and also the webapp must make sure that any code in parent ClassLoaders (or siblings) clear any reference it might have to any of the webapp's class.
照他的说法和参考《深入JVM》一书,对Class有强引用的有:ClassLoader,java.beans.BeanInfo, java.beans.PropertyDescriptor,java.lang.reflect.Method。因为在这个缓存中使用Class作为 key,而Value是CachedIntrospectionResults,CachedIntrospectionResults中持有 BeanInfo和Method的引用,这两个都对Class对象有强引用(这一点据说在jdk5中已经修改,被改成软引用和弱引用的组合,而在 jdk1.4.2需要这样的处理),导致在web应用关闭或者热部署的时候,旧的ClassLoader和它引用的类不能被回收,因此使用弱引用包装 CachedIntrospectionResults对象作为Value。web应用关闭或者热部署的时候,会new新的ClassLoader用于装 载类,这就是CachedIntrospectionResults判断缓存是否safe的根据所在,判断要缓存的Class引用的 ClassLoader是否相同。
当使用JavaBean的内省时,使用Introspector,jdk会自动缓存内省的信息(BeanInfo),这一点可以理解,因为内省通过反射的 代价是高昂的。当ClassLoader关闭的时候,Introspector的缓存持有BeanInfo的信息,而BeanInfo持有Class的强 引用,这将导致ClassLoader和它引用的Class等对象不能被垃圾收集器回收,因此在关闭前,需要手工清除Introspector中的缓存, 调用Introspector.flushFromCaches,这就是CachedIntrospectionResults中当得到BeanInfo 后为什么要执行下面这段代码的原因:
说到这里,spring中有一个比较少人注意的Listener——org.springframework.web.util.IntrospectorCleanupListener,这个类的说明如下:
它是一个在web应用关闭的时候,清除JavaBeans Introspector缓存的监听器.在web.xml中注册这个listener.可以保证在web 应用关闭的时候释放与掉这个web 应用相关的class loader 和由它加载的类
如果你使用了JavaBeans Introspector来分析应用中的类,系统级Introspector 缓冲中会保留这些类的hard引用。结果在你的web应用关闭的时候,这些类以及web 应用相关的class loader没有被垃圾收集器回收.
不幸的是,清除Introspector的唯一方式是刷新整个缓存。这是因为我们没法判断哪些是属于你的应用的引用.所以删除被缓冲的introspection会导致把这台server上的所有应用的introspection(内省)结果都删掉.
需要注意的是,spring 托管的bean不需要使用这个监听器.因为spring它自己的introspection所使用的缓冲在分析完一个类之后会被马上从javaBeans Introspector缓冲中清除掉(上面提到的代码说明了这一点)。
一 般的应用基本不会直接用到JavaBean的内省方法,所以一般不用考虑遇到此类内省资源泄露,但是,很多的类库或者框架(比如struts, Quartz)没有清除Introspector。这个Listener就是为它们“擦屁股”的。请注意,这个监听器需要注册在web.xml中的所有应 用监听器之前(比如ContentLoaderListener之前)。
<listener>
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
参考资料:
《深入Java虚拟机》
《Class对象什么时候被回收?》
《Spring API Doc》
《ss目前的设计有引起内存泄露而导致down机的隐患》
以及一篇非常好的解释java引用类的文章《Java对象的强、软、弱和虚引用》
WeakHashMap is implemented with WeakReference for keys, and strong reference for values. That means if the value has a strong reference on the key, then the key cannot be garbage collected until the WeakHashMap is ready for collection. However, if the value has no strong reference on its key, then being in the WeakHashMap won't prevent the key and value from being garbage collected if it is otherwise ready. The WeakHashMap knows when to remove the key (and the value with it) by using the notification provided by the java.lang.ref package. For more information on this, see: http://java.sun.com/j2se/1.4.2/docs/api/java/lang/ref/package-summary.html
So the problem here with the CachedIntrospectionResults is that it uses BeanInfo and PropertyDescriptor that both have strong reference to the class (indirectly by a reference on Methods of the class). That will be solved with JDK 1.5 that uses a combinaison of Weak and Soft Reference to the Class and Method objects, but for 1.4.2, there's not really any better solution than to flush the Introspector's cache and/or use WeakReference on CachedIntrospectionResults. Using WeakReference on the CachedIntrospectionResults is safer, but decrease performance, and in such case a manual Instrospector.flushFromCaches(Class) must be used, so that the Instrospector does not keep a strong reference on the BeanInfo.
When a webapp is hot-redeployed, a new ClassLoader is created to load the webapp, and the old one is thrown away, expected to be garbage collected. For the collection to happen, the server must clear any strong reference to the ClassLoader or its classes, and also the webapp must make sure that any code in parent ClassLoaders (or siblings) clear any reference it might have to any of the webapp's class.
照他的说法和参考《深入JVM》一书,对Class有强引用的有:ClassLoader,java.beans.BeanInfo, java.beans.PropertyDescriptor,java.lang.reflect.Method。因为在这个缓存中使用Class作为 key,而Value是CachedIntrospectionResults,CachedIntrospectionResults中持有 BeanInfo和Method的引用,这两个都对Class对象有强引用(这一点据说在jdk5中已经修改,被改成软引用和弱引用的组合,而在 jdk1.4.2需要这样的处理),导致在web应用关闭或者热部署的时候,旧的ClassLoader和它引用的类不能被回收,因此使用弱引用包装 CachedIntrospectionResults对象作为Value。web应用关闭或者热部署的时候,会new新的ClassLoader用于装 载类,这就是CachedIntrospectionResults判断缓存是否safe的根据所在,判断要缓存的Class引用的 ClassLoader是否相同。
当使用JavaBean的内省时,使用Introspector,jdk会自动缓存内省的信息(BeanInfo),这一点可以理解,因为内省通过反射的 代价是高昂的。当ClassLoader关闭的时候,Introspector的缓存持有BeanInfo的信息,而BeanInfo持有Class的强 引用,这将导致ClassLoader和它引用的Class等对象不能被垃圾收集器回收,因此在关闭前,需要手工清除Introspector中的缓存, 调用Introspector.flushFromCaches,这就是CachedIntrospectionResults中当得到BeanInfo 后为什么要执行下面这段代码的原因:
java 代码
- this.beanInfo = Introspector.getBeanInfo(clazz);
- // Immediately remove class from Introspector cache, to allow for proper
- // garbage collection on class loader shutdown - we cache it here anyway,
- // in a GC-friendly manner. In contrast to CachedIntrospectionResults,
- // Introspector does not use WeakReferences as values of its WeakHashMap!
- Class classToFlush = clazz;
- do {
- Introspector.flushFromCaches(classToFlush);
- classToFlush = classToFlush.getSuperclass();
- }
- while (classToFlush != null);
说到这里,spring中有一个比较少人注意的Listener——org.springframework.web.util.IntrospectorCleanupListener,这个类的说明如下:
它是一个在web应用关闭的时候,清除JavaBeans Introspector缓存的监听器.在web.xml中注册这个listener.可以保证在web 应用关闭的时候释放与掉这个web 应用相关的class loader 和由它加载的类
如果你使用了JavaBeans Introspector来分析应用中的类,系统级Introspector 缓冲中会保留这些类的hard引用。结果在你的web应用关闭的时候,这些类以及web 应用相关的class loader没有被垃圾收集器回收.
不幸的是,清除Introspector的唯一方式是刷新整个缓存。这是因为我们没法判断哪些是属于你的应用的引用.所以删除被缓冲的introspection会导致把这台server上的所有应用的introspection(内省)结果都删掉.
需要注意的是,spring 托管的bean不需要使用这个监听器.因为spring它自己的introspection所使用的缓冲在分析完一个类之后会被马上从javaBeans Introspector缓冲中清除掉(上面提到的代码说明了这一点)。
一 般的应用基本不会直接用到JavaBean的内省方法,所以一般不用考虑遇到此类内省资源泄露,但是,很多的类库或者框架(比如struts, Quartz)没有清除Introspector。这个Listener就是为它们“擦屁股”的。请注意,这个监听器需要注册在web.xml中的所有应 用监听器之前(比如ContentLoaderListener之前)。
java 代码
<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
</listener>
参考资料:
《深入Java虚拟机》
《Class对象什么时候被回收?》
《Spring API Doc》
《ss目前的设计有引起内存泄露而导致down机的隐患》
以及一篇非常好的解释java引用类的文章《Java对象的强、软、弱和虚引用》
发表评论
-
memcached分布测试报告(一致性哈希情况下的散列函数选择)
2009-03-10 16:30 8543一、背景资料 memcached本身是集中式的缓存系统 ... -
xmemcached 0.60 优化过程
2009-03-06 14:37 3517充分利用jprofile等 ... -
Xmemcached vs Spymemcached 3th(linux下测试结果和多节点下表现)
2009-03-07 10:43 4878翠花,上图,首先是容器类和自定义对象的get、set在不同并发 ... -
xmemcached发布1.0-BETA版
2009-03-09 15:32 4116xmemcached 发布1.0-beta ,从0.6 ... -
山寨nio框架yanf4j发布0.50-alpha
2009-02-04 19:28 4219俺的山寨nio框架yanf4j发布0.50-alpha版本,下 ... -
yanf4j引入了客户端非阻塞API
2009-02-19 00:15 3112yanf4j 发布一个0.50-beta2 版本,这个版本最 ... -
基于java nio的memcached客户端——xmemcached
2009-03-03 16:31 74671、xmemcached是什么? xmemcached是基于 ... -
使用yanf4j写个简单聊天室
2008-11-26 11:36 5396yanf4j 简介,请看这里 ... -
Java字符串的最大长度
2009-01-15 01:37 7584在cpp中为了可移植性,s ... -
yanf4j-0.41 beta发布
2009-01-20 14:01 1865项目名称:yanf4j (yet another nio fr ... -
再谈Selector的wakeup方法
2009-02-01 11:15 3050过去推荐过两篇blog《Java NIO类库Selector机 ... -
Yet another nio framework for java
2008-10-11 14:25 2035项目名称:Yanf4j(Yet another nio fra ... -
阻塞队列的性能对比
2008-09-08 10:06 5744阻塞队列的性能对 ... -
java package的设计原则
2008-09-06 00:15 2117典型的J2EE项目,package的设计有成熟的套路可 ... -
线程池池
2008-09-01 19:39 1997这个题目比较怪,听俺道来。俺一直在负责公司游戏服 ... -
第一个MapReduce任务
2008-08-23 11:10 2781前两天在公司内网上搭了个2个节点hadoop集群, ... -
从HDFS看分布式文件系统的设计需求
2008-08-15 22:39 8115分布式文件系统的 ... -
HDFS用户指南(翻译)
2008-08-14 20:27 2140HDFS用户指南 原文地址:http:/ ... -
Ehcache配置的overflowToDisk属性
2008-08-06 23:18 10835Ehcache的overflowToDisk属性用来配 ... -
工作的几个tip
2008-07-07 20:47 28821、如果用java6的ScriptEngineManager ...
相关推荐
org.springframework.beans-3.0.4.RELEASE.jar org.springframework.context.support-3.0.4.RELEASE.jar org.springframework.context-3.0.4.RELEASE.jar org.springframework.core-3.0.4.RELEASE.jar org....
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.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.transaction.interceptor.TransactionInterceptor#0': Error setting property values; nested ...
org.springframework.beans-3.0.5.RELEASE.jar org.springframework.context-3.0.5.RELEASE.jar org.springframework.context.support-3.0.5.RELEASE.jar org.springframework.core-3.0.5.RELEASE.jar org.spring...
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等
org.springframework.beans-3.0.0.M4.jar
org.springframework.beans-3.0.5工程所需jar包,com.springsource.net.sf.cglib-2.2.0.jar、 com.springsource.org.apache.commons.logging-1.1.1.jar、 javax.inject.jar、 javax.servlet.jsp.jar、 org.spring...
org.springframework.beans-sources-3.0.5.release.jar
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userController' defined in ServletContext resource [/WEB-INF/springMVC-servlet.xml]: Error ...
9. **Integration with other Spring Modules**:`org.springframework.web.jar`与Spring框架的其他模块紧密集成,如Spring Core、Spring Beans、Spring AOP等,共同构建出一个完整的应用框架。 总的来说,`org....
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; @...
org.springframework.beans-3.1.RELEASE.jar org.springframework.context.support-3.1.RELEASE.jar org.springframework.context-3.1.RELEASE.jar org.springframework.core-3.1.RELEASE.jar org.spring...
org.springframework.beans-3.1.1.RELEASE org.springframework.context.support-3.1.1.RELEASE org.springframework.context-3.1.1.RELEASE org.springframework.core-3.1.1.RELEASE org.springframework....
org.springframework.beans-3.0.0.RELEASE.jar org.springframework.context.support-3.0.0.RELEASE.jar org.springframework.context-3.0.0.RELEASE.jar org.springframework.core-3.0.0.RELEASE.jar org.spring...
org.springframework.beans-3.1.0.M2
org.springframework.beans-3.0.0.RELEASE org.springframework.context.support-3.0.0.RELEASE org.springframework.context-3.0.0.RELEASE org.springframework.core-3.0.0.RELEASE org.springframework....
org.springframework.beans-3.1.0.RELEASE.jar
org.springframework.beans-3.0.0.M3.jar
从提供的文件列表看,有两个Spring库:`org.springframework.beans-3.0.2.RELEASE.jar`和`spring-tx-3.2.4.RELEASE.jar`。`DaoSupport`位于`spring-dao`模块中,而不是这两个jar中。你需要确保你的构建配置(如Maven...
总之,`org.springframework.beans.factory.config.PropertyPlaceholderConfigurer`是Spring框架中一个核心的配置组件,它简化了应用程序中对环境变量和系统属性的引用,提高了代码的可维护性和安全性。理解并熟练...