由于使用Jackson将Java对象序列化为字符串而导致内存不足错误

im9ewurl  于 2022-11-09  发布在  Java
关注(0)|答案(2)|浏览(308)

我使用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错误:
x1c 0d1x,所以我认为我的程序内存不足。我看过一些文章,我可以通过增加内存来解决这个问题。但现在当我检查设置时,我的计算机中的默认 Xmx 已经接近4GB,所以我不想再增加它。
有没有人能给我一个提示,告诉我如何通过用另一个具有相同功能的方法替换这个将Object转换为String的方法来节省内存?或者有没有人有其他的想法/方法来克服这个问题。

mqkwyuun

mqkwyuun1#

我也遇到了同样的问题,你试图把一个很大的对象转换成一个字符串。在Java中,String对象的长度是有限制的,因此它可以存储的内存也是有限制的。请参考answer
在我的方案中,我能够通过使用
new ObjectMapper().writeValueAsBytes(response)
根据我的理解,增加堆空间是没有帮助的,它确实对我不起作用。

s4chpxco

s4chpxco2#

你有一个很重的java对象,你需要把一个java对象写入到文件中。

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;
}

相关问题