作者fillmore (.......................)
看板java
标题Re: [J2SE] 关於java.lang.OutOfMemoryError: Java …
时间Thu Mar 9 00:39:29 2006
※ 引述《PsMonkey (痞子军团团长)》之铭言:
: ※ 引述《fillmore (.......................)》之铭言:
: : 我想请问一下关於java.lang.OutOfMemoryError: Java heap space
: : 我要怎麽样去debug
: : 怎样可以看我为什麽发生这个问题
: : 是因为什麽东西导致Java heap space 空间不足
: : ps.我IDE是使用Eclipse
: Eclipse... 跟 Eclipse 完全没关系吧? T__T
: Eclipse 跑 Java 程式,也是用独立的 Process 跑阿 XD
: 这... 跟你的程式码比较有关系吧...
: 目前常见的几种可能:
: 1. 你 new 了一堆物件,但是都没办法(或是来不及)回收
: 2. 你要写 recursive 的 method,但是终止条件没有设好
: 或是在跑到终止条件前,记忆体就被用完了
: 当然,如果你的程式都没有上述的问题...
: 那就只能透过 java -Xmx 来弥补了
: 也许是有再注意或是单纯运气好,我还没遇到 OutOfMemoryError 耶
: (也许就快遇到了... 该死的 DataMining)
: 趁这个机会顺便问一下高手们
: 拿到一份程式码,怎麽快速抓到我列的 1, 2 的问题点呢?
※ 引述《PsMonkey (痞子军团团长)》之铭言:
: ※ 引述《fillmore (.......................)》之铭言:
: : 我想请问一下关於java.lang.OutOfMemoryError: Java heap space
: : 我要怎麽样去debug
: : 怎样可以看我为什麽发生这个问题
: : 是因为什麽东西导致Java heap space 空间不足
: : ps.我IDE是使用Eclipse
: Eclipse... 跟 Eclipse 完全没关系吧? T__T
: Eclipse 跑 Java 程式,也是用独立的 Process 跑阿 XD
: 这... 跟你的程式码比较有关系吧...
我会提一下是看看有没有外挂程式可以使用@@
: 目前常见的几种可能:
: 1. 你 new 了一堆物件,但是都没办法(或是来不及)回收
: 2. 你要写 recursive 的 method,但是终止条件没有设好
: 或是在跑到终止条件前,记忆体就被用完了
详细一点的code在这边
http://0rz.net/4618A
我先讲讲我程式主要在干麻,主要是在做prefix minimization , bit数是16
Ex: 0000000000001011
0000000000001111 ==>只有两个的话合并成0000000000001*11 (当然有一堆)
.
.
.
采用的演算法是Quine-McCluskey (
http://0rz.net/661a7)
程式流程: 1.Grouping (16bit所以将data分成17个group,依据有几个bit 1)
2.QMCsimplify (重复call QMC()让最後group剩1个group ,及最後output)
3.QMC (主要合并group的function)
以下就只列出QMCsimplify , QMC的code ,heap报掉的地方猜测应该是在QMC的函式里
下面列的code用网页看
http://0rz.net/0b17L
public String QMCsimpl
ify()
throws ExceptionQuine
{
while (QMC() > 1);
StringBuffer buf =
new StringBuffer();
if(groups[0].size()!= 0)
{
for(
int i = 0;i<groups[0].size();i++)
buf.append(((MinTerm)groups[0].get(i)).toString() + "\n");
}
for(
int i = 0;i<middle_prime.size();i++)
{
buf.append(((MinTerm)middle_prime.get(i)).toString() + "\n");
}
//System.out.pr
intln(buf.toString());
return buf.toString();
}
private int QMC()
throws ExceptionQuine
{
boolean used[][] =
new boolean[groupCount][];
for(
int i = 0 ; i<groupCount ; i++)
used[i]=
new boolean[groups[i].size()];
//Combine Group
for(
int i = 0 ; i<groupCount-1 ; i++)//只做group-1次
{
ArrayList temp =
new ArrayList();
//group combine
for(
int m = 0 ; m<groups[i].size() ; m++)
{
for(
int n = 0 ; n<groups[i+1].size() ; n++)
{
if ( ((MinTerm)groups[i].get(m)).resolutionCount(((MinTerm
//这边有切行
)groups[i+1].get(n))) == 1)
{
MinTerm tempMinTerm = MinTerm.combine((MinTerm)groups[i
//这边有切行
].get(m), (MinTerm)groups[i+1].get(n));
if(temp.size()==0) temp.add(tempMinTerm);
for(
int x = 0 ; x < temp.size() ; x++)
{
if(((MinTerm)temp.get(x)).isSame(tempMinTerm))
break;
if (x==temp.size()-1) temp.add(tempMinTerm);
}
used[i][m] =
true;
used[i+1][n] =
true;
}
}
}
//prime implicants另外储存
for(
int m = 0 ; m<groups[i].size() ; m++)
{
if(used[i][m] ==
false)
this.middle_prime.add(groups[i].get(m));
}
if(i == groupCount-2)
{
for(
int m = 0 ; m<groups[i+1].size() ; m++)
{
if( used[i+1][m] ==
false)
this.middle_prime.add(groups[i+1].get(m));
}
}
groups[i] = temp;
}
System.out.pr
intln("groupCount :"+groupCount);
groups[groupCount-1]=
null;
groupCount--;
return groupCount;
}
}
MinTerm的个数(input data)在5000都还能跑
到1万的资料量就会挂了
有空看完的大大就给点指教巴@@
感谢各位
: 当然,如果你的程式都没有上述的问题...
: 那就只能透过 java -Xmx 来弥补了
请问原始预设的heap空间是多大呢???
: 也许是有再注意或是单纯运气好,我还没遇到 OutOfMemoryError 耶
: (也许就快遇到了... 该死的 DataMining)
: 趁这个机会顺便问一下高手们
: 拿到一份程式码,怎麽快速抓到我列的 1, 2 的问题点呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 218.168.207.190
※ 编辑: fillmore 来自: 218.168.207.190 (03/09 00:42)
※ 编辑: fillmore 来自: 218.168.207.190 (03/09 00:53)