java.lang.OutOfMemoryError从嵌套的JSONArrays中读取

时间:2017-11-21 23:40:04

标签: java arrays json performance heap-memory

我从API导入数据,该数据以JSONArrays内部的JSONArrays格式返回,具有6个深度级别。 为了从可能的最低级别检索数据,我当前正在从数组循环到数组,最后创建一个JSON对象。喜欢的东西:

JSONObject jsonObject = new JSONObject(result);
JSONObject resultSet = jsonObject.getJSONObject("result_set");
if (resultSet.has("field1")) {
JSONArray field1ResultSet = resultSet.getJSONArray("field1");
for (int i = 0; i < field1ResultSet.length(); i++) {
    JSONObject field1Object = countriesResultSet.getJSONObject(i);
    String field1 = field1Object.getString("field1Object");
    JSONArray field2Array = field1Object.getJSONArray("field2");
    for (int t = 0; t < field2Array.length(); t++) {
        JSONObject field2Object = field2Array.getJSONObject(t);
        String field2 = field2Object.getString("name");
        JSONArray field3Array = field2Object.getJSONArray("field3");
        for (int z = 0; z < field3Array.length(); z++) {
            JSONObject field3Object = field3Array.getJSONObject(z);
            String field3 = field3Object.getString("name");
            String field3_2 = field3Object.getString("token");
            JSONArray field4Array = field3Object.getJSONArray("field4");
            for (int m = 0; m < field4Array.length(); m++) {
                JSONObject field4Object = field4Array.getJSONObject(m);
                String field4 = field4Object.getString("name");
                JSONArray field5Array = field4Object.getJSONArray("field5");
                for (int n = 0; n < field5Array.length(); n++) {
                JSONObject field5Object = field5Array.getJSONObject(n);
                String field5 = field5Object.getString("name");
                JSONArray field6Array = field5Object.getJSONArray("field6");
                for (int g = 0; g < field6Array.length(); g++) {
                    JSONObject field6Object = field6Array.getJSONObject(g);
                    String field6 = field6Object.getString("name");
                    JSONArray kpiValues = field6Object.getJSONArray("kpi_values");
                    JSONObject finalObject = new JSONObject();
                    finalObject.put("date", DATE);
                    finalObject.put("field1", field1);
                    finalObject.put("field2", field2);
                    finalObject.put("field3", field3);
                    finalObject.put("field3_2", field3_2);
                    finalObject.put("field4", field4);
                    finalObject.put("field5", field5);
                    finalObject.put("field6", field6);

然后我将这个JSONObject存储在JSONArray中以便稍后导出,这几乎就是这个过程。 这里的问题是被检索的信息太大,导致我在进程中途导致“线程中的异常”主“java.lang.OutOfMemoryError:Java堆空间”。 遗憾的是,没有任何逻辑可以通过页面或类似的方式发送数据,因此我非常有限。 有没有人对我如何处理这个问题有任何建议?

感谢您的时间

1 个答案:

答案 0 :(得分:0)

OutOfMemoryError表示JVM已预先分配给它的内存不足。

这通常是内存泄漏的情况,我不确定是这种情况。

您要导入的数据有多大?

使用这些JVM参数分配更多内存。

java -Xms1024M -Xmx1024M ...

1024M可以根据需要进行调整。 -Xms是初始堆大小,-Xmx是最大堆

如果您使用的是Eclipse,则可以将它们添加到启动配置中。