0

我们在生产环境中遇到了一些问题,一段时间后,我们从一个已编译的 jsps(有时会有所不同)收到 InvalidPropertyException。我怀疑这是由堆中“消失”的东西引起的。此外,我怀疑这是由于堆的某一代变得满了,所以一些对象“溢出”到最终被 GC 处理的不同代。

我想知道的是:是否可以自动监控堆,并在其中一代已满并且有可能发生这种溢出时发出警报?这可以通过编程方式或通过某些配置进行。我们尝试使用 JConsole,但仅在错误开始发生之后,然后一切看起来都正常,但我真正想知道它在确切时间的样子错误发生(或实际上是几分钟前),无需手动监控。

我已经针对这个问题发布了一个更一般的问题,其中包含更多详细信息:Spring、NotReadablePropertyException 和 Glassfish 版本

4

2 回答 2

2

我不会说您的问题不可能与堆相关,但如果是这样,则表明内存子系统和 JVM 中的垃圾收集器中存在严重且非常重大的错误。虽然当然不是不可能,但它的可能性极小,因为它肯定会被其他多个人发现,而且我还没有听到其他人报告过类似的事情。

基本上,对象永远不会被 GC:ed,而仍然至少有一个对该对象的实时引用。在堆中的世代之间移动与它无关,这只是 GC 为优化内存处理所做的后台工作。事实上,并不是所有的 JVM:s 都有代。

如果您有“消失”的对象,要么是因为您正在使用,要么是WeakReference因为SoftReference您只是在代码中取消引用该对象,使其符合回收条件。

如果您发布有关实际异常(堆栈跟踪等)和相关代码的更多详细信息,也许这里有人可以帮助您找到问题。

于 2012-11-23T10:27:36.040 回答
0

撇开评论不谈,如果您真的想查看不同代的情况,请打开 Verbose GC 日志记录。只需将-verbose:gcand添加-XX:+PrintGCDetails到您的 java 命令中。这将导致 GC 日志包含以下行:

94.198: [Full GC (System) 94.198: [Tenured: 788K->759K(4096K), 0.0428238 secs] 883K->759K(5056K), [Perm : 2095K->2095K(12288K)], 0.0429641 secs]

这告诉您垃圾收集前后每一代使用了多少空间。

这篇文章也有很多关于这个主题的信息,就像我从中获取上述日志示例的博客一样。

于 2012-11-23T09:24:28.383 回答