当前位置: 首页 > 面试题库 >

序列化期间Java的堆空间不足

郜谦
2023-03-14
问题内容

以下代码导致OutOfMemmoryError:大约300万行的堆空间。使用64位安装,分配给JVM的内存为4 GB。

while (rs.next())
{

    ArrayList<String> arrayList = new ArrayList<String>();
    for (int i = 1; i <= columnCount; i++)
    {
        arrayList.add(rs.getString(i));
    }

    objOS.writeObject(arrayList);
}

ArrayList引用的内存在while循环的每次迭代中都可以进行垃圾回收,并且System.gc()由于堆空间的原因,内部JVM
在抛出OutOfMemory错误之前会调用垃圾回收()。

那么为什么会发生异常呢?


问题答案:

objOSObjectOutputStream

如果是这样,那就是您的问题:An ObjectOutputStream会对曾经写入过的 每个
对象保持强大的引用,以避免重复写入同一对象(它只会写一个引用说“我之前用id x 编写过的那个对象”) )。

这意味着您实际上在泄漏 所有 ArrayList方面。

你可以通过调用重置“缓存”
reset()在你的ObjectOutputStream。由于writeObject无论如何在两次调用之间似乎都没有利用该缓存,因此可以在调用reset()之后直接writeObject()调用。



 类似资料:
  • 我面临一些关于内存问题的问题,但我无法解决它。非常感谢您的帮助。我不熟悉Spark和pyspark功能,试图读取大约5GB大小的大型JSON文件,并使用 每次运行上述语句时,都会出现以下错误: 我需要以RDD的形式获取JSON数据,然后使用SQLSpark进行操作和分析。但是我在第一步(读取JSON)本身就出错了。我知道要读取如此大的文件,需要对Spark会话的配置进行必要的更改。我遵循了Apac

  • 问题内容: 我有一个对象,即时通讯读取和写入,并从和。我不断收到Java期望的错误,但发现了另一个。 在我的课堂上,我已经实现并拥有一个我认为足够的领域。 我是Java序列化的新手。我在这里想念什么? 编辑 如果有关系,我实际上是在尝试读写 这是完整的痕迹: 问题答案: 您正在读取文件吗?在这种情况下,是否立即添加serialVersionUID无关紧要,它不同于文件中存储的那个,并且会创建异常。

  • 我读过@JsonInclude这样的问题来忽略空值。这适用于实体中的常规字段,但不适用于集合。如果实体中的集合为空,Json序列化会给出一个空值。 如何对集合进行等效忽略?

  • 在Ubuntu中,当我运行hadoop示例时: 在日志中,我得到的错误为: 信息映射。JobClient:任务Id:尝试\u 201303251213\u 0012\u m\u000000 \u 2,状态:失败错误:Java堆空间13/03/25 15:03:43信息映射。JobClient:任务Id:trunt\u 201303251213\u 0012\u m\00000 1\u 2,状态:F

  • 突然我的应用程序无法运行并弹出此错误...这个错误有什么想法吗?努力了还是解决不了... Java堆空间绑定文件。例如,在gradle.properties文件中,以下行将最大Java堆大小设置为1,024 MB:org.gradle.jvmargs=-Xmx1024m阅读Gradle的配置指南 阅读Java的堆大小

  • 我的代码生成的名称空间有问题。我想要的是以下XML: 我得到的是以下XML: 主要区别是: 目前我正在做的是替换1中序列化字符串中的值 这是我正在使用的代码,我如何更改GetNameSpace()来做我在第1点中需要的事情