Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在java中使用REST模板Spring MVC获得大JSON而不存在内存问题_Java_Spring_Out Of Memory_Resttemplate - Fatal编程技术网

如何在java中使用REST模板Spring MVC获得大JSON而不存在内存问题

如何在java中使用REST模板Spring MVC获得大JSON而不存在内存问题,java,spring,out-of-memory,resttemplate,Java,Spring,Out Of Memory,Resttemplate,当我从REST服务获得大JSON时,我收到java.lang.OutOfMemoryError:java堆空间 这是在~1000次调用REST服务后发生的 HttpEntity<ProductRequest> requestUpdate = new HttpEntity<>(request, httpHeaders); ResponseEntity<String> messageEntity = restTemplate.exchange(g

当我从REST服务获得大JSON时,我收到java.lang.OutOfMemoryError:java堆空间

这是在~1000次调用REST服务后发生的

    HttpEntity<ProductRequest> requestUpdate = new HttpEntity<>(request, httpHeaders);

    ResponseEntity<String> messageEntity = restTemplate.exchange(getEndPointAddress(), HttpMethod.POST, requestUpdate, String.class);

    Map<String, Object> map = gson.fromJson(Helper.cleanJson(messageEntity.getBody()), Map.class);

<pre>
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOfRange(Arrays.java:2694) ~[?:1.7.0_181]
    at java.lang.String.<init>(String.java:203) ~[?:1.7.0_181]
    at java.lang.StringBuilder.toString(StringBuilder.java:405) ~[?:1.7.0_181]
    at org.springframework.util.StreamUtils.copyToString(StreamUtils.java:80) ~[stormjar.jar:4.0.3]
    at org.springframework.http.converter.StringHttpMessageConverter.readInternal(StringHttpMessageConverter.java:86) ~[stonjar.jar:4.0.3]
    at org.springframework.http.converter.StringHttpMessageConverter.readInternal(StringHttpMessageConverter.java:41) ~[stonjar.jar:4.0.3]
    at org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:193) ~[stonjar.jar:4.0.3]
    at org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:104) ~[stonjar.jar:4.0.3]
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:884) ~[stonjar.jar:4.0.3]
    at org.springframework.web.client.RestTemplate$ResponseEntityResponseExtractor.extractData(RestTemplate.java:868) ~[stonjar.jar:4.0.3]
    at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:622) ~[stonjar.jar:4.0.3]
    at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:580) ~[stonjar.jar:4.0.3]
    at org.springframework.web.client.RestTemplate.exchange(RestTemplate.java:498) ~[stonjar.jar:4.0.3]
    at com.myorg.wcf.PMiddle.retrieveP(PMiddle.java:95) ~[ssar.jar:4.0.3]
    at com.myorg.RetrieveP.getPJsonFromService(RetrieveP.java:188) ~[ssar.jar:4.0.3]
    at com.myorg.RetrieveP.execute(RetrieveP.java:107) ~[ssar.jar:4.0.3]
    at org.apache.storm.daemon.executor$fn__5044$tuple_action_fn__5046.invoke(executor.clj:727) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.daemon.executor$mk_task_receiver$fn__4965.invoke(executor.clj:459) ~[storm-core-1.1.0.jar:1.1.0]
    at org.apache.storm.disruptor$clojure_handler$reify__4480.onEvent(disruptor.clj:40) ~[ss-core-1.1.0.jar:1.1.0]
    at org.apache.storm.utils.DisruptorQueue.consumeBatchToCursor(DisruptorQueue.java:472) ~[ss-core-1.1.0.jar:1.1.0]
    at org.apache.storm.utils.DisruptorQueue.consumeBatchWhenAvailable(DisruptorQueue.java:451) ~[ss-core-1.1.0.jar:1.1.0]
    at org.apache.storm.disruptor$consume_batch_when_available.invoke(disruptor.clj:73) ~[ss-core-1.1.0.jar:1.1.0]
    at org.apache.storm.daemon.executor$fn__5044$fn__5057$fn__5110.invoke(executor.clj:846) ~[ss-core-1.1.0.jar:1.1.0]
    at org.apache.storm.util$async_loop$fn__557.invoke(util.clj:484) [ss-core-1.1.0.jar:1.1.0]
    at clojure.lang.AFn.run(AFn.java:22) [clojure-1.7.0.jar:?]
    at java.lang.Thread.run(Thread.java:748) [?:1.7.0_181]</pre>
HttpEntity requestUpdate=新的HttpEntity(请求,httpHeaders);
ResponseEntity messageEntity=restTemplate.exchange(getEndPointAddress(),HttpMethod.POST,requestUpdate,String.class);
Map Map=gson.fromJson(Helper.cleanJson(messageEntity.getBody()),Map.class);
java.lang.OutOfMemoryError:java堆空间
在java.util.Arrays.copyOfRange(Arrays.java:2694)~[?:1.7.0_181]
在java.lang.String.(String.java:203)~[?:1.7.0_181]
在java.lang.StringBuilder.toString(StringBuilder.java:405)~[?:1.7.0_181]
在org.springframework.util.StreamUtils.copyToString(StreamUtils.java:80)~[stormjar.jar:4.0.3]
在org.springframework.http.converter.StringHttpMessageConverter.readInternal(StringHttpMessageConverter.java:86)~[stonjar.jar:4.0.3]
在org.springframework.http.converter.StringHttpMessageConverter.readInternal(StringHttpMessageConverter.java:41)~[stonjar.jar:4.0.3]
在org.springframework.http.converter.AbstractHttpMessageConverter.read(AbstractHttpMessageConverter.java:193)~[stonjar.jar:4.0.3]
在org.springframework.web.client.HttpMessageConverterExtractor.extractData(HttpMessageConverterExtractor.java:104)~[stonjar.jar:4.0.3]
在org.springframework.web.client.restemplate$ResponseEntityResponseExtractor.extractData(restemplate.java:884)~[stonjar.jar:4.0.3]
在org.springframework.web.client.restemplate$ResponseEntityResponseExtractor.extractData(restemplate.java:868)~[stonjar.jar:4.0.3]
在org.springframework.web.client.restemplate.doExecute(restemplate.java:622)~[stonjar.jar:4.0.3]
在org.springframework.web.client.restemplate.execute(restemplate.java:580)~[stonjar.jar:4.0.3]
在org.springframework.web.client.restemplate.exchange(restemplate.java:498)~[stonjar.jar:4.0.3]
在com.myorg.wcf.pmidle.retrieveP(pmidle.java:95)~[ssar.jar:4.0.3]
在com.myorg.RetrieveP.getPJsonFromService(RetrieveP.java:188)~[ssar.jar:4.0.3]
在com.myorg.RetrieveP.execute(RetrieveP.java:107)~[ssar.jar:4.0.3]
在org.apache.storm.daemon.executor$fn\u 5044$tuple\u action\u fn\u 5046.invoke(executor.clj:727)~[storm-core-1.1.0.jar:1.1.0]
在org.apache.storm.daemon.executor$mk_task_receiver$fn__4965.invoke(executor.clj:459)~[storm-core-1.1.0.jar:1.1.0]
在org.apache.storm.disruptor$clojure\u handler$reify\u 4480.onEvent(disruptor.clj:40)~[ss-core-1.1.0.jar:1.1.0]
在org.apache.storm.utils.DisruptorQueue.ConsumerBatchToCursor(DisruptorQueue.java:472)~[ss-core-1.1.0.jar:1.1.0]
在org.apache.storm.utils.DisruptorQueue.ConsumerBatchWhenAvailable(DisruptorQueue.java:451)~[ss-core-1.1.0.jar:1.1.0]
在org.apache.storm.disruptor$consume\u batch\u当可用时调用(disruptor.clj:73)~[ss-core-1.1.0.jar:1.1.0]
在org.apache.storm.daemon.executor$fn_uuu5044$fn_uuu5057$fn_uuu5110.invoke(executor.clj:846)~[ss-core-1.1.0.jar:1.1.0]
在org.apache.storm.util$async_loop$fn__557.invoke(util.clj:484)[ss-core-1.1.0.jar:1.1.0]
在clojure.lang.AFn.run(AFn.java:22)[clojure-1.7.0.jar:?]
在java.lang.Thread.run(Thread.java:748)[?:1.7.0_181]

restemplate
和底层Springbean不是为流处理而设计的,它们在内存中构建整个
响应实体。根据您的示例,您没有按预期使用
restemplate
。您正在读取
String
,而不是将响应对象
Map
反序列化委托给底层转换器bean

如果JSON响应实在太大,无法放入堆中,您可以用
URLConnection
或任何其他允许您直接访问响应
InputStream
的HTTP客户端库替换
RestTemplate
。这将允许您手动读取和分析响应,例如:


通过避免使用一个大的
字符串
对象来保存整个JSON正文,您可以通过这种方式节省内存。

因此,您调用某个对象超过1000次,并保留所有结果,或者?您可能希望保存到一个文件中,并在每次调用后追加。我每次都会调用其他服务以获取put resultat JSON。您可以显示循环吗?你能发出第1000个请求吗?不,这是一个调用其他服务==>microservices的大型项目,但是在多次(>1000)之后,给我这个异常java.lang.OutOfMemoryError。你能显示循环吗谢谢你的回答,但是requestUpdate包含一个对象(类)的请求使用属性和值,因为我想提供参数,用于基于给定数据检索结果。
URLConnection conn = // create and open
JsonReader reader = new JsonReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));
// read manually using reader