由于一个对象属性有一个大的二进制字符串,使用toJson的JavaGSON会产生OutOfMemoryError

由于一个对象属性有一个大的二进制字符串,使用toJson的JavaGSON会产生OutOfMemoryError,java,out-of-memory,gson,Java,Out Of Memory,Gson,我有一个对象MyMsg,它的一个属性是一个大的二进制字符串 class MyMsg { public String moreSmallStuff; //May contain a binary String public String bin; } 我使用RabbitMQ将消息推送到队列中,以便其他进程可以对新的MyMsg对象执行它们的操作。但是发送的消息应该是json格式的 如果这个对象包含一个大的二进制字符串(即+30MB),我就很难用JavaGSON序列化它 它

我有一个对象MyMsg,它的一个属性是一个大的二进制字符串

class MyMsg {
    public String moreSmallStuff;

    //May contain a binary String
    public String bin;
}
我使用RabbitMQ将消息推送到队列中,以便其他进程可以对新的MyMsg对象执行它们的操作。但是发送的消息应该是json格式的

如果这个对象包含一个大的二进制字符串(即+30MB),我就很难用JavaGSON序列化它

它引发OutOfMemoryError异常。因此,为了修复它,我在java虚拟机中添加了:-Xmx1024M,因此部分修复了它

然而,我真的不喜欢它,因为它仍然可以崩溃,由于可能更大的文件,它似乎对我来说非常低效。有没有更好的方法来解析包含类似这样的二进制字符串的对象,使其具有更好的性能和更安全的内存使用?二进制文件的大小差不多,我不敢相信它需要1GB的RAM来处理它


非常感谢。

我不知道RabbitMQ,但JSON/HTTP上下文可能更相似。您可以尝试的是,在“发送”整个对象之前,不要将其保存在内存中,而是将其流式传输到“输出流”,不管RabbitMQ中有什么。如果您在向RabbitMQ发送JSON字符串的地方发布代码,可能会有所帮助。亲爱的@petermm,是的,使用OutputStream确实是最理想的,但它不支持它们。它强制您使用字节[]。正因为如此,我正在尝试优化gson进程(特别是二进制字符串对象属性)。您还有其他建议吗?关于这个建议呢?
gson.toJson(object);