关于一次http请求获取大数据量json串导致内存溢出处理

8,448 阅读1分钟

100多M的json串处理

首先正常获取处理,通过http请求,这里是使用的AsyncHttpclient框架,

原代码:

类(例):

    class TestHttp{
        private Long id;
        private String name;
    }

http获取数据:

    Future<Response> responseFuture = client.preparePost(url).execute();
    Response response = responseFuture.get();
    responseStr = response.getResponseBody();//获取到json串
    
    TestHttp t = JSON.parseObject(responseStr,TestHttp.class);//解析到对象中

看着很正常,但是当responseStr是一个超大字符串(比如我的超过了100M),问题就出现了,程序肯定会报OOM(java.lang.OutOfMemoryError)。

解决方法:使用流来处理,先把获取到的数据分批次存下来,再通过JSONReader分批次读取。

JSONReader的用法可以参考:blog.csdn.net/drlyee/arti…

优化代码:

    Future<Response> responseFuture = client.preparePost(url).execute();
    Response response = responseFuture.get();

    InputStream in = response.getResponseBodyAsStream();
    byte[] bytes = new byte[1024];
    FileOutputStream fos=new FileOutputStream(filePath);//filePath为需要存储的文件位置
    int b;
    while( (b =in.read(bytes)) != -1){
        fos.write(bytes,0,b);
    }
    fos.close();
    in.close();

读取数据:

    JSONReader jsonReader = new JSONReader(new FileReader(filePath));//filePath为存储的文件位置
    jsonReader.startObject();
    while(jsonReader.hasNext()){
        String key = jsonReader.readString();
        if("id".equalsIgnoreCase(key)){
            //处理数据
        }else if("name".equalsIgnoreCase(key)){
            //处理数据
        }
    }
    jsonReader.endObject();
    jsonReader.close();

结束,程序上线运行正常,不会再有OOM错误了