public static void searchForChains(Synset source,Synset target,ArrayList<ChainNode> inherit)
{
if(inherit.size() < max+1)
{
try
{
ArrayList<ChainNode> temp = (ArrayList<ChainNode>)inherit.clone();
PointerUtils util = PointerUtils.getInstance(); PointerTargetNodeList list = util.getDirectHypernyms(source);
if(0 != list.size())
{
searchForChain(list,target,temp,1);
} list = util.getDirectHyponyms(source);
if(0 != list.size())
{
searchForChain(list,target,temp,2);
} list = util.getHolonyms(source);
if(0 != list.size())
{
searchForChain(list,target,temp,3);
} list = util.getMeronyms(source);
if(0 != list.size())
{
searchForChain(list,target,temp,4);
}
inherit = null;
list = null;
}
catch(JWNLException e)
{
e.printStackTrace();
}
}
else
{
inherit = null;
return;
}
}
static ArrayList<ChainNode> temp = new ArrayList<ChainNode>();
public static void searchForChain(PointerTargetNodeList list,Synset target,ArrayList<ChainNode> inherit,int type)
{
for(Iterator it = list.iterator();it.hasNext();)
{
PointerTargetNode Node = (PointerTargetNode)it.next();
if(!target.equals(Node.getSynset()))
{
if(!Circle.hasCircle(inherit,Node.getSynset()))
{
temp = (ArrayList<ChainNode>)inherit.clone();
switch(type)
{
case 1:
temp.add(new ChainNode(Node.getSynset(),"hypernym"));
break;
case 2:
temp.add(new ChainNode(Node.getSynset(),"hyponym"));
break;
case 3:
temp.add(new ChainNode(Node.getSynset(),"holonym"));
break;
case 4:
temp.add(new ChainNode(Node.getSynset(),"meronym"));
break;
default:
break;
}
searchForChains(Node.getSynset(),target,temp);
Node = null;
temp = null; }
else
{
inherit = null;
return;
}
}
else
{
switch(type)
{
case 1:
inherit.add(new ChainNode(Node.getSynset(),"hypernym"));
break;
case 2:
inherit.add(new ChainNode(Node.getSynset(),"hyponym"));
break;
case 3:
inherit.add(new ChainNode(Node.getSynset(),"holonym"));
break;
case 4:
inherit.add(new ChainNode(Node.getSynset(),"meronym"));
break;
default:
break;
}
Chains.add(inherit);
return;
}
}
}这是两个相互调用的函数,不是死循环,当第一个函数的max值大于8的时候就出现java heap space的内存不足错误了
我不知道如何才能改进这个程序使得所占内存尽量小一点
设置JAVA的JAVA_OPTS=-Xms64m -Xmx512m 没用
谢谢了~

解决方案 »

  1.   

    建议lz去看看一些关于 GC 的文章,会对你很有帮助。
      

  2.   

    static ArrayList<ChainNode> temp = new ArrayList<ChainNode>();
    这一类的代码少写,在程序中如果要考虑内存问题的话,就尽量少的声明全局变量,应该多一些即用即声明的变量,当一圈结束后,会跟着释放,当然,你使用递归时,对于内存的消耗本来就大,如果想减少开销,我认为效果不大.不可调和的矛盾
      

  3.   

    你不觉得你得代码有问题么??????????????max是哪里来得?????????
      

  4.   

    1. 把ArrayList改成LinkedList
    2. static ArrayList<ChainNode> temp = new ArrayList<ChainNode>();
       这个初始化的对象是多余的。当然对你的这个问题没多少影响。
    3. 你的那些null赋值都是多余的。引用变量均是局部变量,都会在函数调用完毕后消失,对derefer对象没有帮助。可以简化掉这些代码。(实际上你每个循环中对他们重新赋值过了。)