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