由protobuf反序列化时内存不足

时间:2018-07-04 02:23:52

标签: java protobuf-java

我创建了一个原型,如下所示:

syntax = "proto3";
option java_package = "cn.com.cennavi.oem.common";
option java_outer_classname = "RInfoPB";

message RInfo {
    string dataVersion = 1;
    map<string, MapValue> map = 2;
}

message MapValue {
    map<string, string> map = 1;
}

我将数据(240mb)放入pb对象中,并将该对象序列化为本地文件(590mb)。 大小增加了一倍。为什么会发生?

接下来,我将本地文件转换为pb对象,Xms和Xmx均为5g。 最后,我遇到了内存不足的异常。

用法有问题吗?

顺便说一句:protobuf.jar的版本是3.6.0

请帮助~~

堆栈跟踪

[root @ localhost测试]#java -Xms5g -Xmx5g -jar ProtobufTester.jar /APP/midmif/out_bak/Rbeijing_dir322.rinf

解压缩完成, 耗时 [488] ms, 大小 [621043338] ~
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
    at com.google.protobuf.CodedInputStream$ArrayDecoder.readStringRequireUtf8(CodedInputStream.java:845)
    at com.google.protobuf.WireFormat$Utf8Validation$2.readString(WireFormat.java:196)
    at com.google.protobuf.WireFormat.readPrimitiveField(WireFormat.java:245)
    at com.google.protobuf.FieldSet.readPrimitiveField(FieldSet.java:581)
    at com.google.protobuf.MapEntryLite.parseField(MapEntryLite.java:135)
    at com.google.protobuf.MapEntryLite.parseEntry(MapEntryLite.java:182)
    at com.google.protobuf.MapEntry.<init>(MapEntry.java:106)
    at com.google.protobuf.MapEntry.<init>(MapEntry.java:50)
    at com.google.protobuf.MapEntry$Metadata$1.parsePartialFrom(MapEntry.java:70)
    at com.google.protobuf.MapEntry$Metadata$1.parsePartialFrom(MapEntry.java:64)
    at com.google.protobuf.CodedInputStream$ArrayDecoder.readMessage(CodedInputStream.java:923)
    at cn.com.cennavi.oem.common.RInfoPB$RInfo.<init>(RInfoPB.java:142)
    at cn.com.cennavi.oem.common.RInfoPB$RInfo.<init>(RInfoPB.java:109)
    at cn.com.cennavi.oem.common.RInfoPB$RInfo$1.parsePartialFrom(RInfoPB.java:906)
    at cn.com.cennavi.oem.common.RInfoPB$RInfo$1.parsePartialFrom(RInfoPB.java:1)
    at com.google.protobuf.AbstractParser.parsePartialFrom(AbstractParser.java:163)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:197)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:209)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:214)
    at com.google.protobuf.AbstractParser.parseFrom(AbstractParser.java:49)
    at cn.com.cennavi.oem.common.RInfoPB$RInfo.parseFrom(RInfoPB.java:414)
    at cn.com.cennavi.Toolkit.protobuf.Deserialize.main(Deserialize.java:18)

0 个答案:

没有答案