我们在生产环境中遇到了一些问题,一段时间后,我们从一个已编译的 jsps(有时会有所不同)中收到 InvalidPropertyException。我怀疑这是由堆中“消失”的东西引起的。此外,我怀疑这是由于其中一代堆已满,因此某些对象“溢出”到不同的一代,最终被 GC 处理。
我想知道的是:是否可以自动监视堆,并在其中一代已满且有可能发生此类溢出时发出警报?这可以通过编程方式或通过某些配置进行。我们尝试过使用 JConsole,但只有在错误开始发生之后,然后一切看起来都正常,但我真正想要的是知道它在确切时间的样子错误发生(或者实际上是几分钟前),无需手动监控。
我已经针对此问题发布了一个更一般的问题,其中包含更多详细信息:Spring, NotReadablePropertyException and Glassfish version
最佳答案
我并不是说您的问题不可能与堆相关,但如果是的话,则表明 JVM 中的内存子系统和垃圾收集器存在严重且非常重大的错误。虽然当然不是不可能,但这种可能性非常非常小,因为它肯定会被其他多个人发现,而且我还没有听到其他人报告过类似的事情。
基本上,当对象仍然存在至少一个实时引用时,对象永远不会被 GC:ed。堆中各代之间的移动与之无关,这只是 GC 为优化内存处理而完成的后台工作。事实上,并非所有 JVM 都有世代。
如果您有对象“消失”,则可能是因为您使用了 WeakReference
或 SoftReference
,或者是因为您只是在代码中取消引用该对象,从而导致它有资格回收。
如果您发布有关实际异常(堆栈跟踪等)和相关代码的更多详细信息,也许这里有人可以帮助您找到问题。
关于java - 如何判断其中一代堆是否已满?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13525777/