【问题标题】:java.lang.OutOfMemoryError with WeakReference带有 WeakReference 的 java.lang.OutOfMemoryError
【发布时间】:2018-03-13 17:52:28
【问题描述】:

我正在使用下面的代码来验证weakReferences 是由收集器收集的垃圾。但我在一段时间后得到了 outOfMemoryError 。我添加了 (-Xmx50m) 以减少内存。

    List<WeakReference<Object>> weakList = new ArrayList<>();
    while (true) {
        weakList.add(new WeakReference<Object>(new BigDecimal(10000)));
        System.out.println(weakList.size());
    }

理想情况下,当内存紧缩发生时,GC 应该运行,并且它应该收集所有弱引用对象。为什么我得到 outOfMemoryError ?

【问题讨论】:

  • WeakReference 对象本身也占用空间。
  • ArrayList 的底层数组也会增长以接收您的 WeakReference 对象。

标签: java garbage-collection out-of-memory weak-references


【解决方案1】:

为什么会遇到问题

你正在制作大量的 WeakReferences

有什么问题

虽然弱引用不会阻止它们指向的对象被垃圾回收,但当引用仍然存在时,它们本身不能被垃圾回收。

因此,虽然 BigDecimal 正在被收集,但 WeakReferences 和 Array 都在增长,直到没有剩余内存为止。

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 2010-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2010-09-22
    • 2011-09-25
    相关资源
    最近更新 更多