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