try {
// CompareRecord record = new CompareRecord();
Connection conn = new CompareRecord().getConection("eliteddaprd","eliteddaprd","192.168.14.104","1521");
ResultSet res = null;
if (conn != null){
Statement stmt = conn.createStatement();
res = stmt.executeQuery("select rowindx,ADDRLINE1 from dedupinitial order by rowindx");
}
Map<Integer,String> adddressMap = new LinkedHashMap<Integer, String>();
if (res != null){
System.out.println("result set is not null ");
while(res.next()){
adddressMap.put(res.getInt(1),res.getString(2));
}
}
System.out.println("address Map size =========> "+adddressMap.size());
Iterator it = adddressMap.entrySet().iterator();
int count = 0;
int min = 0;
while (it.hasNext()){
Map.Entry pairs = (Map.Entry)it.next();
Pattern p = Pattern.compile("[,\\s]+");
Integer outerkey = (Integer)pairs.getKey();
String outerValue = (String)pairs.getValue();
//System.out.println("outer Value ======> "+outerValue);
String[] outerresult = p.split(outerValue);
Map.Entry pairs2 = null;
count++;
List<Integer> dupList = new ArrayList<Integer>();
Iterator innerit = adddressMap.entrySet().iterator();
boolean first = true;
while (innerit.hasNext()){
//System.out.println("count value ===> "+count);
int totmatch = 0;
if(first){
if(count == adddressMap.size()){
break;
}
for(int i=0;i<=count;i++){
pairs2 = (Map.Entry)innerit.next();
}
first = false;
}
else{
pairs2 = (Map.Entry)innerit.next();
}
Integer innterKey = (Integer)pairs2.getKey();
String innerValue = (String)pairs2.getValue();
//System.out.println("innrer value "+innerValue);
String[] innerresult = p.split(innerValue);
for(int j=0;j<outerresult.length;j++){
for(int k=0;k<innerresult.length;k++){
if(outerresult[j].equalsIgnoreCase(innerresult[k])){
//System.out.println(outerresult[j]+" Match With "+innerresult[k]);
totmatch++;
break;
}
}
}
min = Math.min(outerresult.length, innerresult.length);
if(min != 0 && ((totmatch*100)/min) > 50) {
//System.out.println("maching inner key =========> "+innterKey);
dupList.add(innterKey);
}
}
//System.out.println("Duplilcate List Sisze ===================> "+dupList.size()+" "+outerkey);
}
System.out.println("End =========> "+new Date());
}
catch (Exception e) {
e.printStackTrace();
}
这里ResultSet已处理了大约500000条记录,但它会给我一个错误:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.HashMap.resize(HashMap.java:508)
at java.util.LinkedHashMap.addEntry(LinkedHashMap.java:406)
at java.util.HashMap.put(HashMap.java:431)
at spite.CompareRecord.main(CompareRecord.java:91)
我知道这个错误是因为VM内存,但不知道如何在Eclipse中增加它?
如果我必须处理超过500,000条记录,我该怎么办?
答案 0 :(得分:147)
在Run-&gt; Run Configuration中找到您正在运行的类的名称,选择它,单击Arguments选项卡,然后添加:
-Xms512M -Xmx1524M
到VM Arguments部分
答案 1 :(得分:38)
在Eclipse下载文件夹中,输入eclipse.ini
文件中的条目:
--launcher.XXMaxPermSize
512M
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms512m
-Xmx1024m
或者你想要的任何价值。
答案 2 :(得分:7)
请参阅http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html
-Xms和-Xmx设置堆的最小和最大大小。作为一项功能,Hotspot限制了堆大小,以防止它吹灭你的系统。因此,一旦你弄清楚应用程序需要的最大内存,你就可以限制它以防止恶意代码影响其他应用程序。使用这些标志,如-Xmx512M,其中M代表MB。如果不包含它,则指定字节。几个标志使用这种格式。您还可以通过设置最小值来获得较小的启动性提升,因为它不必立即增加堆。
-XX:MaxPermSize = ### M设置最大“永久代”大小。 Hotspot是不寻常的,因为几种类型的数据存储在“永久代”中,这是堆的一个单独的区域,很少(或从不)被垃圾收集。 perm-gen托管数据列表有点模糊,但它通常包含类元数据,字节码,实习字符串等内容(这在Hotspot版本中肯定会有所不同)。因为很少或从未收集过这一代,你可能需要增加它的大小(或者用其他几个标志打开perm-gen扫描)。在JRuby中,我们生成了很多适配器字节码,通常需要更多的perm gen空间。
答案 3 :(得分:5)
如何在从Eclipse运行时为程序提供更多内存
转到“运行/运行配置”。选择程序的运行配置。单击“参数”选项卡。在“程序参数”区域中,添加-Xmx
参数,例如-Xmx2048m
,以便为程序提供最大值。 2048 MB(2 GB)内存。
如何预防此内存问题
以不需要在内存中存储如此多数据的方式重新编写程序。我没有详细查看您的代码,但看起来您在HashMap
中存储了大量数据;当你有很多记录时,你会记忆犹新。
答案 4 :(得分:2)
您可能希望在Project Explorer中关闭打开的项目。您可以通过右键单击打开的项目,然后选择&#34;关闭项目&#34;来执行此操作。
在我注意到我必须定期增加my_directory \ eclipse \ eclipse.ini中的堆大小之后,这对我有用。
希望这有帮助!和平!
答案 5 :(得分:1)
要在eclipse中增加堆大小,请更改eclipse.ini文件。
参考
http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F
答案 6 :(得分:1)
答案 7 :(得分:1)
在eclipse.ini文件中,输入以下条目
-Xms512m
-Xmx2048m
-XX:MaxPermSize参数=1024米
答案 8 :(得分:0)
如果我需要处理超过500000条记录该怎么办?
有几种方法可以增加您的应用程序的Java堆大小,其中一些已经建议。您的应用需要从您的adddressMap中删除元素,因为您的应用会在其中添加新元素,因此如果有更多记录,您将不会遇到oom。如果您感兴趣,请查找生产者 - 消费者。
答案 9 :(得分:0)
我不是Java的专家,但你的问题可以通过&#34; blockingqueue&#34;来解决。如果你明智地使用它。
首先尝试检索一大块记录,处理它们并迭代该过程,直到完成处理。这可以帮助您摆脱OutOfMemory Exceptions
。
答案 10 :(得分:0)
在Eclipse goto Run-&gt; Run Configuration中找到您正在运行的类的名称,选择它,单击Target选项卡,然后在“Additional Emulator Command Line Options”中添加:
-Xms512M -Xmx1524M
然后点击“应用”。
答案 11 :(得分:0)
转到&#34;窗口 - &gt;偏好 - &gt;一般 - &gt; C / C ++ - &gt;代码分析&#34; 并禁用&#34;语法和语义错误 - &gt;抽象类无法实例化&#34;
答案 12 :(得分:0)
有时在eclipse ini文件中增加内存后异常不会停止。然后尝试以下选项
转到窗口&gt;&gt;偏好设置&gt;&gt; MyEclipse&gt;&gt; Java Enterprise Project&gt;&gt; Web项目&gt;&gt;部署选项卡 在 - &gt;下在库部署策略下 取消检查 - &gt;用户库中的罐子
答案 13 :(得分:0)
公认的修改运行配置的解决方案对我来说并不理想,因为我有一些不同的运行配置,将来添加更多配置时,很容易忘记这样做。我也希望该设置在运行任何内容时都适用,例如通过右键单击并选择“运行方式”->“ JUnit测试”来运行JUnit测试时。
以上内容可以通过修改JRE / JDK设置来实现:-
-Xms512m -Xmx4G -XX:MaxPermSize=256M
答案 14 :(得分:0)
请确保您的代码正确。我也曾经陷入这个问题,并尝试了这里接受的解决方案,但是徒劳。因此,我再次编写了代码。显然我正在使用自定义数组列表并添加数组中的值。我尝试将ArrayList更改为仅接受原始值,并且可以正常工作。