【发布时间】:2012-12-29 09:08:53
【问题描述】:
我的程序显示出内存泄漏的趋势。当内存使用达到峰值时,GC计数更多,对象被垃圾回收。
我们发现一个类是导致内存泄漏趋势的原因。
但是我想检查一下为什么这个类实际上是垃圾回收的,当我探索这个类时,类中只有一个瞬态对象。
瞬态对象是未序列化的对象。但是瞬态性质与垃圾收集有什么关系吗?
【问题讨论】:
标签: java garbage-collection transient
我的程序显示出内存泄漏的趋势。当内存使用达到峰值时,GC计数更多,对象被垃圾回收。
我们发现一个类是导致内存泄漏趋势的原因。
但是我想检查一下为什么这个类实际上是垃圾回收的,当我探索这个类时,类中只有一个瞬态对象。
瞬态对象是未序列化的对象。但是瞬态性质与垃圾收集有什么关系吗?
【问题讨论】:
标签: java garbage-collection transient
没有瞬态对象这样的东西。有一些瞬态的字段,在序列化过程中会被忽略——但这对垃圾回收没有影响。
基本上,我认为您需要在其他地方寻找您的泄漏(如果您确实有泄漏)。
【讨论】:
“可以被垃圾收集的瞬态对象”确实存在于 Java 中,使用 WeakReference 表示应该在 gc 运行后立即收集的对象,使用 SoftReference 表示更好地保留但如果内存不足则应丢弃的对象运行低。
transient 关键字对内存管理没有影响。
【讨论】:
瞬态不会影响垃圾收集。
也许寻找在紧密循环中使用的对象,其中对象之间存在相互引用,这可能会减慢垃圾收集速度。
也许可以探索使用 Java 的弱引用。
也许看看调整垃圾收集设置。 ConcurrentSweepGC 可以提供帮助。
也许只是看看分配更多的堆栈和堆空间。
【讨论】:
不,没有关系。请记住,如果 GC 最终正确清理了所有内容,您就不会遇到内存泄漏的情况;这就是 GC 的工作方式。你不应该担心迟到的 GC,如果你担心,你只需要调整 JVM 参数。
【讨论】:
瞬态性质与垃圾收集有什么关系吗?
不,什么都没有。
transient 关键字表示它不应该被序列化,所以如果有任何东西,它意味着反序列化的对象比它们本来的要小。
我们发现一个类是导致内存泄漏趋势的原因。
您将发生内存泄漏,因为您在不需要时将此类对象保存在集合中。您必须确保以这种方式保留的对象在不需要时被移除。
仅仅因为您保留了数据,并不意味着您有泄漏。您可能需要这些数据,因此您需要比预期更多的内存。在这种情况下,您需要通过设置-Xmx 或-mx 命令行选项来增加最大内存。
【讨论】: