我正在做一个项目,开始进展的很顺利,但是后拉进展到酒店模块的时候要处理角色分配菜单的时候,应用了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
这种方式调整了内存的大小。单这样的修改显然是徒劳的,修改的结果只是原来抛内存泄漏的时间托长了而已,最终还是抛内存泄漏异常。
第一次提问,也不知道问题描述的是否清楚。希望各位高人见谅。如果您以前有这方面的经验,请指教!!!比较急
其中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
这种方式调整了内存的大小。单这样的修改显然是徒劳的,修改的结果只是原来抛内存泄漏的时间托长了而已,最终还是抛内存泄漏异常。
第一次提问,也不知道问题描述的是否清楚。希望各位高人见谅。如果您以前有这方面的经验,请指教!!!比较急
action直接返回解析数据!
return json[,,,,,]
js
alert(data)!!
你每次用JSON操作的数据有多大?
虽然你的数据可能没有问题,但依然有可能在你转成JSON的过程出了死循环之类的。
public class A{
private B b;
public B getB() {
return b;
}
}public class B {
private A a;
public A getA() {
return a;
}
}
这样一个循环对于Java来说是合法的,也不存在回收等问题。但是对于JSON来说可能会出现死循环的问题。
问题在于,Json::Value这个类的析构函数中,对value_.map_做delete操作之前,没有先调用此类的成员函数“clear”对前面new出来的指针做回收,那么delete掉value_.map_后就造成了内存泄露。解决方案:
找到Json::Value析构函数,最前面加一条语句判断下,如果this的类型是nullValue、arrayValue、objectValue,那么调用clear。
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