java - 如何判断其中一代堆是否已满?

标签 java memory garbage-collection jvm heap-memory

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

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

我已经针对此问题发布了一个更一般的问题,其中包含更多详细信息:Spring, NotReadablePropertyException and Glassfish version

最佳答案

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

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

如果您有对象“消失”,则可能是因为您使用了 WeakReferenceSoftReference,或者是因为您只是在代码中取消引用该对象,从而导致它有资格回收。

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

关于java - 如何判断其中一代堆是否已满?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13525777/

相关文章:

java.lang.IndexOutOfBoundsException : Index: 1, 大小:1

python - bool 值的大列表和小列表以及字节数组的相对性能

memory - 当 eden 空间为 100% 时,JVM 崩溃

ios - UIImage方法 "drawInRect"的内存泄漏

Java线程垃圾回收

memory-management - 我是否需要将 map 设置为 nil 才能对其进行垃圾回收?

java - 为什么老年代的 gc 比年轻代的 gc 花费的时间更长

java - 为什么 HttpURLConnection 不发送多个 header ?

java - 从 spring mongo 查询获取 "_id"而不是整个对象/对象列表

java - 这个 JFormattedTextField 如何工作?