使用Jackson 1.9时的OutOfMemory

使用Jackson 1.9时的OutOfMemory,jackson,out-of-memory,Jackson,Out Of Memory,我正在使用Jackson 1.9。在我的web应用程序中,我需要将复杂对象(例如Spring的ModelMap、BindingResult、java.uil.Map)转换为JSON字符串对象 请考虑下面的代码片段,我正在尝试一个这样的转换: Map<String, Object> methodArgsMap = new HashMap<String, Object>(); methodArgsMap.put("map", map);/*map is an instan

我正在使用Jackson 1.9。在我的web应用程序中,我需要将复杂对象(例如Spring的ModelMap、BindingResult、java.uil.Map)转换为JSON字符串对象

请考虑下面的代码片段,我正在尝试一个这样的转换:

Map<String, Object> methodArgsMap  = new HashMap<String, Object>();

methodArgsMap.put("map", map);/*map is an instance of org.springframework.ui.ModelMap*/ 

methodArgsMap.put("command", command);/*command is an instance of a custom  POJO     viz.ReportBeanParam*/ 
methodArgsMap.put("result", result);/*result is an instance of org.springframework.validation.BindingResult*/
请指导如何解决相同的问题


谢谢和问候

听起来像是在生成一个巨大的JSON输出,它在内存中得到缓冲。 这基于错误消息

您的选择是:

  • 使用流式输出避免在内存中缓冲它(但是,我不确定Spring是否允许您这样做),或者
  • 增加堆大小,以便有足够的内存
禁用interning和规范化的功能仅与解析相关,您正在生成JSON,而不是解析

public final class JSONProcessUtil {

private static ObjectMapper objectMapper;

        static {
                objectMapper = new ObjectMapper();
/*Start : Configs. suggested by Jackson docs to avoid OutOfMemoryError*/
                SerializationConfig serConfig = objectMapper.getSerializationConfig();
                serConfig.disable(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS);

                objectMapper.getJsonFactory().configure(
                                JsonParser.Feature.INTERN_FIELD_NAMES, false);
                objectMapper.getJsonFactory().configure(
                                JsonParser.Feature.CANONICALIZE_FIELD_NAMES, false);
/*End : Configs. suggested by Jackson docs to avoid OutOfMemoryError*/

        }


public static Map<String, String> getObjectsAsJSONString(
                        Map<String, Object> argsMap) throws JsonGenerationException,
                        JsonMappingException, IOException {

                log.info("Source app.In JSONProcessUtil.getObjectsAsJSONString(...)");

                Map<String, String> jsonStrMap = null;

                if (!(argsMap == null || argsMap.isEmpty())) {
                        jsonStrMap = new HashMap<String, String>();

                        Set<String> keySet = argsMap.keySet();
                        Iterator<String> iter = keySet.iterator();
                        String argName = null;

                        while (iter.hasNext()) {

                                argName = iter.next();

                                log.info("Source app. argName = {}, arg = {} ", argName,
                                                argsMap.get(argName));

                                jsonStrMap.put(argName,
                                                objectMapper.writeValueAsString(argsMap.get(argName)));/*The line giving error*/

                                log.info("Proceeding to the next arg !");
                        }
                }

                log.info("Source app. Exit from JSONProcessUtil.getObjectsAsJSONString(...)");

                return jsonStrMap;
        }
}
INFO [http-8080-7] (JSONProcessUtil.java:73) - Source app. argName  =    result, arg   =   org.springframework.validation.BeanPropertyBindingResult: 0 errors DEBUG [http-8080-7] (SecurityContextPersistenceFilter.java:89) - SecurityContextHolder now cleared, as request processing completed Feb 20, 2012 5:03:30 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet saas threw exception
java.lang.OutOfMemoryError: Java heap space
        at org.codehaus.jackson.util.TextBuffer._charArray(TextBuffer.java:    
674)
        at org.codehaus.jackson.util.TextBuffer.expand(TextBuffer.java:633)
        at org.codehaus.jackson.util.TextBuffer.append(TextBuffer.java:438)
        at org.codehaus.jackson.io.SegmentedStringWriter.write(SegmentedStringWriter.java:69)
        at org.codehaus.jackson.impl.WriterBasedGenerator._flushBuffer(WriterBasedGenerator.java:1810)
        at org.codehaus.jackson.impl.WriterBasedGenerator._writeFieldName(WriterBasedGenerator.java:345)
        at org.codehaus.jackson.impl.WriterBasedGenerator.writeFieldName(WriterBasedGenerator.java:217)
        at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:426)
        at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
        at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
        at org.codehaus.jackson.map.ser.impl.ObjectArraySerializer.serializeContents(ObjectArraySerializer.java:121)
        at org.codehaus.jackson.map.ser.impl.ObjectArraySerializer.serializeContents(ObjectArraySerializer.java:28)
        at org.codehaus.jackson.map.ser.ArraySerializers$AsArraySerializer.serialize(ArraySerializers.java:56)
        at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428)
        at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
        at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
        at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428)
        at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
        at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
        at org.codehaus.jackson.map.ser.MapSerializer.serializeFields(MapSerializer.java:287)
        at org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:212)
        at org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:23)
        at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428)
        at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
        at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
        at org.codehaus.jackson.map.ser.MapSerializer.serializeFields(MapSerializer.java:287)
        at org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:212)
        at org.codehaus.jackson.map.ser.MapSerializer.serialize(MapSerializer.java:23)
        at org.codehaus.jackson.map.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:428)
        at org.codehaus.jackson.map.ser.BeanSerializer.serializeFields(BeanSerializer.java:175)
        at org.codehaus.jackson.map.ser.BeanSerializer.serialize(BeanSerializer.java:142)
        at org.codehaus.jackson.map.ser.MapSerializer.serializeFields(MapSerializer.java:287)