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 没用
谢谢了~
解决方案 »
- 泛型数组
- 一个关于继承的问题
- 用JSP写一个信息管理系统,建表的时候遇到问题
- 求一个用JAVA写的Telnet程序!急用!谢谢!
- 怎么使组件失效啊
- 关于java运行环境版本
- 200分求帮,我的一个反射的程序,出现java.lang.IllegalArgumentException异常,麻烦大家给看看
- java中如何限制用户只能输入中文汉字?
- 我编译java文件时为什末在Jcreate里好用,在dos下能生成类,却运行不了呢? 在别人机器上好用,在我的Jcreate上也好用
- 求助!Java1.3文档!!!
- 某段程序执行一段时间以后没有完成的话自动跳过的功能?
- 比较JAVA /DELPHI / POWER BUILDER / VC++ / C# 的前途
这一类的代码少写,在程序中如果要考虑内存问题的话,就尽量少的声明全局变量,应该多一些即用即声明的变量,当一圈结束后,会跟着释放,当然,你使用递归时,对于内存的消耗本来就大,如果想减少开销,我认为效果不大.不可调和的矛盾
2. static ArrayList<ChainNode> temp = new ArrayList<ChainNode>();
这个初始化的对象是多余的。当然对你的这个问题没多少影响。
3. 你的那些null赋值都是多余的。引用变量均是局部变量,都会在函数调用完毕后消失,对derefer对象没有帮助。可以简化掉这些代码。(实际上你每个循环中对他们重新赋值过了。)