{"id":92,"date":"2024-10-30T16:59:58","date_gmt":"2024-10-30T08:59:58","guid":{"rendered":"https:\/\/zhoujibin.com\/?p=92"},"modified":"2024-11-01T11:29:52","modified_gmt":"2024-11-01T03:29:52","slug":"java%e8%a7%a3%e6%9e%90%e5%a4%a7json%e6%96%87%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/zhoujibin.com\/?p=92","title":{"rendered":"\u8bb0\u4e00\u6b21\u7ebf\u4e0aOOM\u7684\u5206\u6790\u53ca\u5904\u7406"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">\u80cc\u666f<\/h1>\n\n\n\n<p>\u7cfb\u7edf\u8c03\u7528\u5916\u90e8\u63a5\u53e3\u83b7\u53d6\u6570\u636e\u540c\u6b65\u81f3\u672c\u5730\u5e93\uff0c\u65e0\u6cd5100%\u540c\u6b65\u6210\u529f\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u95ee\u9898\u5b9a\u4f4d<\/h1>\n\n\n\n<p>\u67e5\u770b\u65e5\u5fd7\u540e\u6700\u7ec8\u5b9a\u4f4d\u5230\u662f\u7531\u4e8e fastjson \u5de5\u5177\u7c7b\u89e3\u6790 json \u6587\u4ef6\u65f6\u7531\u4e8e\u6587\u4ef6\u8fc7\u5927\u5230\u5bfc\u81f4OOM\u3002\u5355\u72ec\u8c03\u7528\u63a5\u53e3\u540e\u53d1\u73b0\u8fd4\u56de\u7684\u6570\u636e\u91cf\u8fbe\u5230\u4e86300M\u3002<\/p>\n\n\n\n<p>\u9519\u8bef\u4fe1\u606f\uff1a<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>java.lang.OutOfMemoryError: Java heap space\n    at com.alibaba.fastjson.serializer.SerializeWriter.expandCapacity(SerializeWriter.java:290)\n    at com.alibaba.fastjson.serializer.SerializeWriter.writeFieldValueStringWithDoubleQuoteCheck(SerializeWriter.java:1487)\n    at com.alibaba.fastjson.serializer.ASMSerializer_1_BigJsonPO.write(Unknown Source)\n    at com.alibaba.fastjson.serializer.ListSerializer.write(ListSerializer.java:130)\n    at com.alibaba.fastjson.serializer.JSONSerializer.write(JSONSerializer.java:278)\n    at com.alibaba.fastjson.JSON.toJSONString(JSON.java:665)\n    at com.alibaba.fastjson.JSON.toJSONString(JSON.java:607)\n    at com.alibaba.fastjson.JSON.toJSONString(JSON.java:572)<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u5c1d\u8bd5\u89e3\u51b3<\/h1>\n\n\n\n<h2 class=\"wp-block-heading\">\u6362\u89e3\u6790\u5de5\u5177<\/h2>\n\n\n\n<p>\u5c06\u89e3\u6790\u5de5\u5177\u7531 fastjson \u6362\u4e3a hutool \u4e2d\u7684 json \u5de5\u5177\u7c7b\u540e\u91cd\u8bd5\uff1a\u5931\u8d25\uff01\uff01\uff01<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">\u52a0\u5927\u5185\u5b58<\/h2>\n\n\n\n<p>\u9879\u76ee\u91c7\u7528\u7684\u65f6\u5fae\u670d\u52a1\u67b6\u6784\uff0c\u542f\u52a8\u65f6\u6307\u5b9a\u4e86JVM\u5806\u5185\u5b58\u521d\u59cb\u5927\u5c0f\u53ca\u6700\u5927\u503c\uff1aXms300m -Xmx2048m\uff0c\u4fee\u6539\u6700\u5927\u503c\u53c2\u6570\uff08\u4fee\u6539\u81f34096m\uff09\u540e\u91cd\u542f\u670d\u52a1\uff0c\u518d\u6b21\u5c1d\u8bd5\uff1a\u5931\u8d25\uff01\uff01\uff01<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u6700\u7ec8\u65b9\u6848<\/h1>\n\n\n\n<p>\u67e5\u9605\u8d44\u6599\u540e\u53d1\u73b0\u662fFastjson\u4f7f\u7528\u65b9\u5f0f\u4e0d\u5bf9\uff0c\u4e0d\u80fd\u76f4\u63a5\u4f7f\u7528JSONArray.parseArray()\uff0c\u5f53\u9700\u8981\u5904\u7406\u8d85\u5927JSON\u6587\u672c\u65f6\uff0c\u9700\u8981\u4f7f\u7528Stream API\uff08\u7248\u672c&gt;=1.1.32\uff09<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5f15\u5165\u4f9d\u8d56<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code> &lt;dependency&gt;\n      &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n      &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n      &lt;version&gt;5.7.4&lt;\/version&gt;\n    &lt;\/dependency&gt;   \n&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.alibaba\/fastjson --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;com.alibaba&lt;\/groupId&gt;\n      &lt;artifactId&gt;fastjson&lt;\/artifactId&gt;\n      &lt;version&gt;1.2.36&lt;\/version&gt;\n    &lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u65b0\u5efa\u4e00\u4e2apo\u7c7b<\/h3>\n\n\n\n<p>\u7528\u4e8e\u6d4b\u8bd5json\u5b57\u7b26\u4e32\u4e0e\u5b9e\u4f53\u7c7b\u4e4b\u95f4\u7684\u7c7b\u578b\u8f6c\u6362\u3002<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>@Data\npublic class BigJsonPO implements Serializable {\n\n    private static final long serialVersionUID = -63528737089874523564L;\n\n    private String key1;\n    private String key2;\n    private String key3;\n    ...\n    private String key100;\n}<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6a21\u62df\u6570\u636e<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>\/\/ \u6a21\u62df\u6587\u4ef6\u7684\u8def\u5f84   \nprivate final String filePath = \"F:\\\\test-json\\\\createByFastJson.json\";\n@Test\n    public void testWrite() {\n        TimeInterval timeInterval = new TimeInterval();\n        int dataCount = 200000;\n        File file = new File(filePath);\n        \/\/ \u9700\u8981\u8d4b\u503c\u7684\u5b9e\u4f53\u7c7b\u5b57\u6bb5\n        List&lt;Field&gt; fieldList = Arrays.stream(ReflectUtil.getFields(BigJsonPO.class)).filter(f -&gt; !StrUtil.equalsIgnoreCase(\"serialVersionUID\", f.getName())).collect(Collectors.toList());\n        try {\n            JSONWriter jsonWriter = new JSONWriter(new FileWriter(file));\n            \/\/ \u5199\u5165 {\n            jsonWriter.startObject();\n            jsonWriter.writeKey(\"data\");\n            \/\/ \u5199\u5165 &#91;\n            jsonWriter.startArray();\n            for (int i = 1; i &lt;= dataCount; i++) {\n                \/\/ \u5199\u5165 {\n                jsonWriter.startObject();\n                for (int i1 = 0; i1 &lt; fieldList.size(); i1++) {\n                    String name = fieldList.get(i1).getName();\n                    jsonWriter.writeKey(name);\n                    jsonWriter.writeValue((i1 + 1) + \"-\" + IdUtil.fastSimpleUUID());\n                }\n                \/\/ \u5199\u5165 }\n                jsonWriter.endObject();\n            }\n            \/\/ \u5199\u5165 ]\n            jsonWriter.endArray();\n            \/\/ \u5199\u5165 }\n            jsonWriter.endObject();\n            jsonWriter.close();\n            System.out.println(\"\u6587\u4ef6\u5927\u5c0f\uff1a\u3010\" + FileUtil.size(file) \/ (1024 * 1024) + \"M\u3011\uff0c\u5199\u5165\u6570\u636e\uff1a\u3010\" + dataCount + \"\u3011\u6761\uff0c\u8017\u65f6\uff1a\u3010\" + timeInterval.intervalMs() + \"\u3011ms\");\n        } catch (IOException e) {\n            e.printStackTrace();\n        }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u8bfb\u53d6\u6570\u636e<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>    @Test\n    public void testParse() {\n        TimeInterval timeInterval = new TimeInterval();\n        try {\n            File file = new File(filePath);\n            List&lt;BigJsonPO&gt; list = this.parseBigJsonStr(new FileReader(file), \"data\", BigJsonPO.class);\n            System.out.println(\"\u6587\u4ef6\u5927\u5c0f\uff1a\u3010\" + FileUtil.size(file) \/ (1024 * 1024) + \"M\u3011\uff0c\u89e3\u6790\u6570\u636e\uff1a\u3010\" + list.size() + \"\u3011\u6761\uff0c\u8017\u65f6\uff1a\u3010\" + timeInterval.intervalMs() + \"\u3011ms\");\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n    }\n\n\/**\n     * \u89e3\u6790 \u5927 json \u5bf9\u8c61\uff0c\u683c\u5f0f\uff1a\n     * {\n     *      jsonArrKey :&#91; \"key1\":\"value1\"...]\n     * }\n     * @param reader\n     * @param jsonArrKey\n     * @param jsonArrKeyType\n     * @param &lt;T&gt;\n     * @return\n     *\/\n    private &lt;T&gt; List&lt;T&gt; parseBigJsonStr(Reader reader, String jsonArrKey, Class&lt;T&gt; jsonArrKeyType) {\n        List&lt;T&gt; list = new ArrayList&lt;&gt;();\n        try {\n            JSONReader jsonReader = new JSONReader(reader);\n            jsonReader.startObject();\n            while (jsonReader.hasNext()) {\n                String tempJsonKey = jsonReader.readObject(String.class);\n                if (StrUtil.equalsIgnoreCase(jsonArrKey, tempJsonKey)) {\n                    jsonReader.startArray();\n                    while (jsonReader.hasNext()) {\n                        list.add(jsonReader.readObject(jsonArrKeyType));\n                    }\n                    jsonReader.endArray();\n                }\n            }\n            jsonReader.endObject();\n            jsonReader.close();\n        } catch (Exception e) {\n            e.printStackTrace();\n        }\n        return list;\n    }<\/code><\/pre>\n\n\n\n<p>\u81f3\u6b64\uff0c\u95ee\u9898\u5b8c\u7f8e\u89e3\u51b3\u3002<\/p>\n\n\n\n<h1 class=\"wp-block-heading\">\u5176\u4ed6\u89e3\u51b3\u65b9\u6848<\/h1>\n\n\n\n<p>\u641c\u4e86\u8d44\u6599\u540e\u53d1\u73b0\uff0c jackson \u7c7b\u5e93\u4e5f\u53ef\u4ee5\u89e3\u51b3\u95ee\u9898\uff0c\u4ee3\u7801\u7c7b\u4f3c\u3002<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u5f15\u5165\u4f9d\u8d56<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code> &lt;dependency&gt;\n      &lt;groupId&gt;cn.hutool&lt;\/groupId&gt;\n      &lt;artifactId&gt;hutool-all&lt;\/artifactId&gt;\n      &lt;version&gt;5.7.4&lt;\/version&gt;\n    &lt;\/dependency&gt;  \n\n&lt;!-- https:\/\/mvnrepository.com\/artifact\/com.fasterxml.jackson.core\/jackson-core --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;com.fasterxml.jackson.core&lt;\/groupId&gt;\n      &lt;artifactId&gt;jackson-core&lt;\/artifactId&gt;\n      &lt;version&gt;2.13.1&lt;\/version&gt;\n    &lt;\/dependency&gt;\n\n    &lt;!-- https:\/\/mvnrepository.com\/artifact\/com.fasterxml.jackson.core\/jackson-databind --&gt;\n    &lt;dependency&gt;\n      &lt;groupId&gt;com.fasterxml.jackson.core&lt;\/groupId&gt;\n      &lt;artifactId&gt;jackson-databind&lt;\/artifactId&gt;\n      &lt;version&gt;2.13.1&lt;\/version&gt;\n    &lt;\/dependency&gt;<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u6a21\u62df\u6570\u636e<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code> @Test\n    public void testWriteJson() {\n        TimeInterval timeInterval = new TimeInterval();\n        int dataCount = 100000;\n        this.writeJson(filePath, dataCount, BigJsonPO.class);\n        System.out.println(\"\u5199\u5165\u6570\u636e\u91cf\uff1a\" + dataCount + \"\uff0c\u8017\u65f6\uff1a\" + timeInterval.intervalMs());\n    }\n\n    private &lt;T&gt; void writeJson(String filePath, long dataCount, Class&lt;T&gt; poClass) {\n        JsonFactory factory = JsonFactory.builder().build();\n        try {\n            List&lt;Field&gt; fieldList = Arrays.stream(ReflectUtil.getFields(poClass)).filter(f -&gt; !StrUtil.equalsIgnoreCase(\"serialVersionUID\", f.getName())).collect(Collectors.toList());\n            JsonGenerator jg = factory.createGenerator(new File(filePath), JsonEncoding.UTF8);\n            jg.writeStartObject();\n            jg.writeFieldName(\"data\");\n            jg.writeStartArray();\n            for (long i = 0; i &lt; dataCount; i++) {\n                jg.writeStartObject();\n                for (int j = 0; j &lt; fieldList.size(); j++) {\n                    String fieldName = fieldList.get(j).getName();\n                    Object value = (j + 1) + \"-\" + IdUtil.fastSimpleUUID();\n                    jg.writeObjectField(fieldName, value);\n                }\n                jg.writeEndObject();\n            }\n            jg.writeEndArray();\n            jg.writeEndObject();\n            jg.close();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n    }<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u8bfb\u53d6\u6570\u636e<\/h3>\n\n\n\n<pre class=\"wp-block-code\"><code>@Test\n    public void testParseJson() {\n        TimeInterval timeInterval = new TimeInterval();\n        JsonFactory factory = JsonFactory.builder()\n                .build().setCodec(new ObjectMapper());\n        List&lt;BigJsonPO&gt; list = new ArrayList&lt;&gt;();\n        File file = new File(filePath);\n        try {\n            JsonParser jp = factory.createParser(file);\n            JsonToken outToken = jp.nextToken();\n            \/\/ \u6821\u9a8c\u683c\u5f0f\u662f\u5426\u6b63\u786e\n            if (outToken != JsonToken.START_OBJECT) {\n                throw new RuntimeException(\"Error json string\");\n            }\n            \/\/ \u83b7\u53d6\u5f53\u524d\u8282\u70b9\u540d\u79f0\n            String currentName;\n            \/\/ \u5faa\u73af \u76f4\u81f3 \u7ed3\u5c3e \u7b26\u53f7 \u51fa\u73b0\n            while (jp.nextToken() != JsonToken.END_OBJECT) {\n                currentName = jp.getCurrentName();\n                if (jp.nextToken() == JsonToken.START_ARRAY) {\n                    if (currentName.equals(\"data\")) {\n                        while (jp.nextToken() != JsonToken.END_ARRAY) {\n                            BigJsonPO po = jp.readValueAs(BigJsonPO.class);\n                            list.add(po);\n                        }\n                    } else {\n                        jp.skipChildren();\n                    }\n                } else {\n                    jp.skipChildren();\n                }\n            }\n            jp.close();\n        } catch (IOException e) {\n            e.printStackTrace();\n        }\n        System.out.println(\"\u6587\u4ef6\u5927\u5c0f\uff1a\u3010\" + FileUtil.size(file) \/ (1024 * 1024) + \"M\u3011\uff0c\u89e3\u6790\u6570\u636e\uff1a\u3010\" + list.size() + \"\u3011\u6761\uff0c\u8017\u65f6\uff1a\u3010\" + timeInterval.intervalMs() + \"\u3011ms\");\n    }<\/code><\/pre>\n\n\n\n<h1 class=\"wp-block-heading\">\u6027\u80fd\u5bf9\u6bd4<\/h1>\n\n\n\n<p>\u672c\u673a\u5904\u7406\u5668\uff1a ADM 4700U 8\u6838 16G<\/p>\n\n\n\n<p><strong>fastjson VS jackson<\/strong><\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>\u6570\u636e\u91cf\uff08W\uff09<\/th><th>\u6570\u636e\u5927\u5c0f(M)<\/th><th>\u5199\u5165\u8017\u65f6\uff08ms\uff09<\/th><th>\u89e3\u6790\u8017\u65f6\uff08ms\uff09<\/th><\/tr><\/thead><tbody><tr><td>0.2<\/td><td>8.74<\/td><td>316\/198<\/td><td>298\/338<\/td><\/tr><tr><td>2<\/td><td>87.4<\/td><td>1397\/1007<\/td><td>937\/848<\/td><\/tr><tr><td>20<\/td><td>874<\/td><td>12103\/8224<\/td><td>9479\/9992<\/td><\/tr><tr><td>200<\/td><td>8430<\/td><td>105898\/79756<\/td><td>\u6682\u672a\u6d4b\u8bd5<\/td><\/tr><\/tbody><\/table><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>\u80cc\u666f \u7cfb\u7edf\u8c03\u7528\u5916\u90e8\u63a5\u53e3\u83b7\u53d6\u6570\u636e\u540c\u6b65\u81f3\u672c\u5730\u5e93\uff0c\u65e0\u6cd5100%\u540c\u6b65\u6210\u529f\u3002 \u95ee\u9898\u5b9a\u4f4d \u67e5\u770b\u65e5\u5fd7\u540e\u6700\u7ec8\u5b9a\u4f4d\u5230\u662f\u7531\u4e8e fa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[20],"class_list":["post-92","post","type-post","status-publish","format-standard","hentry","category-java","tag-json"],"_links":{"self":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/92"}],"collection":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=92"}],"version-history":[{"count":10,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/92\/revisions"}],"predecessor-version":[{"id":222,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=\/wp\/v2\/posts\/92\/revisions\/222"}],"wp:attachment":[{"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=92"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=92"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/zhoujibin.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=92"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}