我的一位同事调查了这个错误,他能够在单元测试中重新创建它。这是通过调用为类构建CachedIntroSpectionResults的方法来完成的,同时通过在内存设置非常低的情况下向内存中添加字符串来对jvm施加压力。这种方法使其失败20/30000次。
至于原因,我只作了口头解释,所以我没有所有的细节,但这是这样的:Java有自己的自省结果,这些都由Spring封装。问题在于java结果使用软引用,这使它们易于出现垃圾回收。因此,当Spring恰好在垃圾收集器运行的同时,围绕这些软引用构建其包装器时,实际上清除了Spring使用的某些基础,从而导致属性“丢失”。
解决方案似乎是从Spring 3.1.0.RELEASE升级到Spring
3.1.3.RELEASE。这里有一些变化,Spring在确定类的属性时不再包装软引用(软引用在极少数特殊情况下使用,而不是一直使用)。升级Spring版本后,通过单元测试无法重现该错误,仍然可以通过实际使用来查看是否是这种情况。
更新:已经有几个星期了,没有错误的迹象。所以更新Spring版本有效:)



