由于使用Jackson将Java对象序列化为String而导致OutOfMemoryError

时间:2018-06-28 08:28:29

标签: java jackson out-of-memory

我正在使用Jackson的ObjectMapper将Java对象转换为String,以便将其写入我的日志文件中。
转换方法如下:

private String getResponseAsString(OrderResponse response) {
        ObjectMapper mapper = new ObjectMapper();
        try {
            return mapper.writeValueAsString(response);
        } catch (JsonProcessingException e) {
            log.error("Error when converting response:" + getExceptionMessage(e));
            return "Error when converting response";
        }
}

运行程序后,我发现它在此方法上引发了OutOfMemoryError: Java Heap Space错误:

Exception thrown,所以我认为我的程序内存不足。我阅读了一些文章,可以通过增加内存来克服此问题。但是现在,当我检查设置时,计算机中的默认 Xmx 已经接近4GB,所以我不想增加它。

任何人都可以给我一个提示,该如何将Object转换为String方法,将其替换为具有相同功能的另一个方法,从而节省内存?还是有人有其他想法/方法来解决这个问题。

2 个答案:

答案 0 :(得分:0)

您有一个重的Java对象,需要将Java对象写入文件中。 并点击链接Click Here

 private File getResponseAsString(OrderResponse response) throws JsonGenerationException, JsonMappingException, IOException {
    ObjectMapper mapper = new ObjectMapper();
    File file = new File("D:/cp/dataOne.json");
    mapper.writeValue(file, response);
    return file;
}

答案 1 :(得分:0)

我遇到了完全相同的问题,您正在尝试将一个非常大的对象转换为字符串。在 Java 中,String 对象对它可以拥有的长度以及它可以存储的内存有限制。参考这个答案:[https://stackoverflow.com/questions/816142/strings-maximum-length-in-java-calling-length-method]
在我的情况下,我能够通过使用
来解决问题 new ObjectMapper().writeValueAsBytes(response)
根据我的理解,增加堆空间无济于事,它确实对我不起作用。