GC overhead limit exceeded求助

u010062710 2015-01-08 03:10:23

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.HashMap.createEntry(HashMap.java:901)
at java.util.HashMap.addEntry(HashMap.java:888)
at java.util.HashMap.put(HashMap.java:509)
at java.util.HashSet.add(HashSet.java:217)
at java.util.AbstractCollection.addAll(AbstractCollection.java:342)
at cn.ac.ict.cluster.LinkCluster.clusterSim(LinkCluster.java:134)
at cn.ac.ict.cluster.LinkCluster.startAnalysis(LinkCluster.java:84)
at cn.ac.ict.cluster.LinkCluster.main(LinkCluster.java:144)

报如上错误。就是把大量时间用于GC垃圾回收,却只对2%一下的堆有影响,即大量时间用于垃圾回收,还没有效果。
程序是自己实现的一个聚类算法,计算两个cluster的相似度,现在的思路是通过计算两个cluster合并后外部链接会减少的数目,衡量相似度。在 遍历任意两个簇,找到最像似的两簇合并时,会不断调用clusterSim函数,即不断使用set.addAll()函数,set的add方法是通过HashMap实现的,大量GC操作就是在set.addAll()进行的。
自己大概想明白了报错的原理,但没有任何思路怎样解决,跪求大神相助

private int clusterSim(Cluster A, Cluster B) {
HashSet<Integer> merge = A.getLink();
merge.addAll(B.getLink());
return A.getLink().size() + B.getLink().size() - merge.size();
}
public ArrayList<Cluster> startAnalysis(double threshold, String toFile) {
long t1, t2;
t1 = System.currentTimeMillis();
System.out.println("开始聚类!");
ArrayList<Cluster> finalClusters = new ArrayList<Cluster>();

ArrayList<Cluster> originalClusters = initClusters();
finalClusters = originalClusters;
int clusternum = -1;
double mostsim = threshold;
while (mostsim >= threshold) {
if (clusternum == finalClusters.size())
break;
clusternum = finalClusters.size();
mostsim = 0;
int mergeIndexA = 0;
int mergeIndexB = 0;

// 遍历任意两个簇,找到最像似的两簇合并
for (int i = 0; i < clusternum; i++) {
for (int j = i+1 ; j < clusternum; j++) {
Cluster clusterA = finalClusters.get(i);
Cluster clusterB = finalClusters.get(j);
int tempDis = this.clusterSim(clusterA, clusterB);
System.out.println(i+"/"+j+"tempDis: "+tempDis);
if (tempDis > mostsim) {
mostsim = tempDis;
mergeIndexA = i;
mergeIndexB = j;
}
}
}

// 合并簇
if (mostsim >= threshold){
finalClusters = mergeCluster(finalClusters, mergeIndexA,
mergeIndexB);
System.out.println(clusters.size());
}

}
this.clusters = finalClusters;
for (Cluster cluster : originalClusters) {
System.out.println(cluster.toString());
fileUtil.saveToFile(cluster.toString()+"\n", toFile, true);
}
System.out.println("==========================================");
fileUtil.saveToFile("================================="+"\n\n", toFile, true);

t2 = System.currentTimeMillis();
System.out.println("聚类完成,耗时:" + (t2 - t1) / 1000 + "s");

return finalClusters;
}

...全文
301 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

33,013

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧