我正在做一个项目,开始进展的很顺利,但是后拉进展到酒店模块的时候要处理角色分配菜单的时候,应用了JSON技术。结果发生了内存泄漏的问题。
其中java中的方法代码如下:
/**
 * 通过角色id查找对应的菜单
 * @return
 */
public String findMenusByRole(){

String hql = "from Role r where r.roleId = " + Integer.parseInt(roleId);

try{
roles = template.find(hql);

//根据角色id查找相应的菜单 
if(roles != null && roles.size() > 0){

Role role = roles.get(0);
if(role != null){
menus = role.getMenus();

/* //把set转换成list
m.addAll(menus);*/

}
}
}catch(Exception e){
e.printStackTrace();
}

return SUCCESS;
}这个时候遍历menus是可以的,但是我前台用JSON解析。 <script type="text/javascript" language="javascript">
// Ajax请求子分类
function showSubSort(select) {
var url = 'role!findMenusByRole.action';
var params = 'roleId=' + select.value;
var myAjax = new Ajax.Request(
url,
{
method: 'post',
parameters: params,
onComplete: showSubSortComplete
}
);
}

function showSubSortComplete(request) {

var action = request.responseText.parseJSON();

var menus = action.menus;
if(menus==null || menus.length==0) {
$(mySubSort).innerHTML = "";
return ;
}
document.getElementById('menus').value = menus;
}
</script>
这个时候就发生了内存泄漏异常。>>>>>>>LOG4J<<<<<<< 0 2009-06-09 21:13:20,843 [http-80-Processor24] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/xinguozhan].[default]  - #org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:253)# - Servlet.service() for servlet default threw exception
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
at java.lang.StringBuilder.append(StringBuilder.java:119)
at java.lang.StringBuilder.append(StringBuilder.java:115)
at com.googlecode.jsonplugin.JSONWriter.add(JSONWriter.java:437)
at com.googlecode.jsonplugin.JSONWriter.add(JSONWriter.java:271)
at com.googlecode.jsonplugin.JSONWriter.bean(JSONWriter.java:214)
at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:145)
at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:115)
at com.googlecode.jsonplugin.JSONWriter.array(JSONWriter.java:351)
at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:139)
at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:115)
at com.googlecode.jsonplugin.JSONWriter.add(JSONWriter.java:272)
at com.googlecode.jsonplugin.JSONWriter.bean(JSONWriter.java:214)
at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:145)
at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:115)
at com.googlecode.jsonplugin.JSONWriter.array(JSONWriter.java:351)
at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:139)
at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:115)
at com.googlecode.jsonplugin.JSONWriter.add(JSONWriter.java:272)
at com.googlecode.jsonplugin.JSONWriter.bean(JSONWriter.java:214)
at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:145)
at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:115)
at com.googlecode.jsonplugin.JSONWriter.array(JSONWriter.java:351)
at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:139)
at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:115)
at com.googlecode.jsonplugin.JSONWriter.add(JSONWriter.java:272)
at com.googlecode.jsonplugin.JSONWriter.bean(JSONWriter.java:214)
at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:145)
at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:115)
at com.googlecode.jsonplugin.JSONWriter.array(JSONWriter.java:351)开始的时候我还抱着侥幸的心理看是不是分配的内存真的不够用了。我就用
-Xms128m -Xmx512m
-XX:MaxNewSize=256m
-XX:MaxPermSize=256m
这种方式调整了内存的大小。单这样的修改显然是徒劳的,修改的结果只是原来抛内存泄漏的时间托长了而已,最终还是抛内存泄漏异常。
第一次提问,也不知道问题描述的是否清楚。希望各位高人见谅。如果您以前有这方面的经验,请指教!!!比较急

解决方案 »

  1.   

    我很怀疑不是JSON内存泄露,而是你的逻辑导致的死循环,或者你一次搞的数据量过大。
      

  2.   

    at java.util.Arrays.copyOf(Arrays.java:2882) 
    action直接返回解析数据!
    return json[,,,,,]
    js
    alert(data)!!
      

  3.   

    应该不是JSON开源包的问题。是你程序的问题。你应该在控制台跟踪一下内存,用jstat跟踪就可以,看一下在那个操作内存消耗最大。我的项目也一直在用JSON包,没有出现过内存溢出的问题。
      

  4.   

    我之所以认为是JSON的问题是因为,我action中的方法直接打印查询的结果是对的。只是到前台JSON解析的时候发生了异常。后来我改成不用JSON,而是普通的操作查询,就没有问题了。
      

  5.   

    我之所以认为是JSON的问题是因为,我action中的方法直接打印查询的结果是对的。只是到前台JSON解析的时候发生了异常。后来我改成不用JSON,而是普通的操作查询,就没有问题了。
      

  6.   

    我之所以认为是JSON的问题是因为,我action中的方法直接打印查询的结果是对的。只是到前台JSON解析的时候发生了异常。后来我改成不用JSON,而是普通的操作查询,就没有问题了。
      

  7.   

    内存泄漏如果真在JSON,应该跟踪下结果转换,可以先用一个简单的结果测试下,在数组输出的时候可能进入了一个死循环,使得内存泄漏。
      

  8.   

    跟你的json没关系,程序逻辑问题
      

  9.   


    你每次用JSON操作的数据有多大?
      

  10.   

    JSON 只是一种数据传输格式,估计是你代码写的有问题,不会有关系的和json
      

  11.   


    虽然你的数据可能没有问题,但依然有可能在你转成JSON的过程出了死循环之类的。
      

  12.   

    你打下日志, 从数据库取数据的时候看挂了没有, 还有就是你使用这个JSONWriter的时候是不是什么循环死了.at com.googlecode.jsonplugin.JSONWriter.add(JSONWriter.java:437) 
      

  13.   

    现在的问题是json解析数据的时候,死循环为什么会发生。
      

  14.   

    可能是你的Bean中存在以下情况
    public class A{
      private B b;
      public B getB() {
        return b;
      }
    }public class B {
      private A a;
      public A getA() {
        return a;
      } 
    }
    这样一个循环对于Java来说是合法的,也不存在回收等问题。但是对于JSON来说可能会出现死循环的问题。
      

  15.   

    关于这个问题,我用C++版本的Json(版本:0.5.0)也发现了内存泄露。
    问题在于,Json::Value这个类的析构函数中,对value_.map_做delete操作之前,没有先调用此类的成员函数“clear”对前面new出来的指针做回收,那么delete掉value_.map_后就造成了内存泄露。解决方案:
    找到Json::Value析构函数,最前面加一条语句判断下,如果this的类型是nullValue、arrayValue、objectValue,那么调用clear。
      

  16.   

    我也有一个类似的错误··不知道为什么···不过总显示java.lang.NoSuchMethodException: com.car.model.WCarlocation.getCallbacks()
    at java.lang.Class.getMethod(Class.java:1605)
    at org.apache.struts2.json.JSONWriter.bean(JSONWriter.java:194)
    at org.apache.struts2.json.JSONWriter.process(JSONWriter.java:164)
    而我都不知道getCallbacks是个什么,model是我自己写的类啊··不知道怎么会有Callbacks