4

我的程序显示了内存泄漏的趋势。当内存使用达到峰值时,GC 计数更多,对象被垃圾回收。

我们发现一个类是导致内存泄漏趋势的原因。

但是我想检查一下为什么该类实际上是垃圾收集的,当我探索该类时,该类中只有一个瞬态对象。

瞬态对象是未序列化的对象。但是瞬态性质与垃圾收集有什么关系吗?

4

5 回答 5

8

没有瞬态对象这样的东西。有一些瞬态字段,在序列化过程中会被忽略——但这对垃圾回收没有影响。

基本上,我认为你需要在别处寻找你的泄漏(如果你确实泄漏)。

于 2013-01-15T09:44:23.910 回答
2

瞬态性质与收集的垃圾有什么关系吗?

没什么。

关键字表示它不应该被序列化,transient所以如果有任何东西,它意味着反序列化的对象比它们本来的要小。

我们发现一个类是导致内存泄漏趋势的原因。

您将发生内存泄漏,因为您在不需要时将此类对象保留在集合中。您必须确保以这种方式保留的对象在不需要时被删除。


仅仅因为您保留了数据,并不意味着您有泄漏。您可能需要这些数据,因此您需要比预期更多的内存。在这种情况下,您需要通过设置-Xmx-mx命令行选项来增加最大内存。

于 2013-01-15T09:44:43.937 回答
1

不,没有关系。请记住,如果 GC 最终正确清理了所有内容,您就不会遇到内存泄漏的情况;这就是 GC 的工作方式。你不应该担心迟到的 GC,如果你担心,你只需要调整 JVM 参数。

于 2013-01-15T09:45:12.180 回答
0

瞬态不会影响垃圾收集。

  • 也许寻找在紧密循环中使用的对象,其中对象相互引用,这可能会减慢垃圾收集速度。

  • 也许探索使用 Java 的弱引用。

  • 也许看看调整垃圾收集设置。ConcurrentSweepGC 可以提供帮助。

  • 也许只是看看分配更多的堆栈和堆空间。

于 2013-01-15T09:45:39.283 回答
0

Java中确实存在“可以被垃圾收集的瞬态对象”,WeakReference用于应该在gc运行后立即收集的对象以及SoftReference更好地保留但如果内存不足则应该丢弃的对象。

transient关键字对内存管理没有影响。

于 2013-01-15T09:52:22.400 回答