作者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)