在Eclipse中增加堆空间:(java.lang.OutOfMemoryError)

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条logging,但它会给我错误,如:

 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中增加它?

如果我必须处理超过50万条logging,我该怎么办?

在“运行” – >“运行configuration”中find您正在运行的类的名称,select它,单击“参数”选项卡,然后添加:

-Xms512M -Xmx1524M

到虚拟机参数部分

在Eclipse下载文件夹中,在eclipse.ini文件中创build条目:

 --launcher.XXMaxPermSize 512M -vmargs -Dosgi.requiredJavaVersion=1.5 -Xms512m -Xmx1024m 

或者你想要的任何价值。

http://blog.headius.com/2009/01/my-favorite-hotspot-jvm-flags.html

-Xms和-Xmx设置堆的最小和最大尺寸。 作为一个function,热点放在堆的大小,以防止它吹出你的系统。 所以,一旦你找出你的应用程序需要的最大内存,你可以限制它,以防止恶意代码影响其他应用程序。 使用这些标志,如-Xmx512M,其中M代表MB。 如果你不包含它,你指定的字节。 几个标志使用这种格式。 你也可以通过设置最小值来获得较小的启动性能,因为它不需要马上增加堆。

-XX:MaxPermSize = ### M设置最大的“永久代”大小。 热点是不常见的,因为有几种types的数据被存储在“永久代”中,这是一个很less(或从不)被垃圾收集的独立区域。 perm-gen托pipe的数据列表有点模糊,但通常包含类元数据,字节码,实际string等等(这在热点版本中肯定会有所不同)。 因为这一代很less或从未收集过,所以你可能需要增加它的尺寸(或者使用其他标志打开烫发器)。 特别是在JRuby中,我们生成了很多适配器字节码,这通常需要更多的发行版空间。

如何从Eclipse运行时为程序提供更多的内存

转到运行/运行configuration。 select程序的运行configuration。 点击标签“参数”。 在“程序参数”区域中,添加一个-Xmx参数,例如-Xmx2048m以使程序达到最大值。 2048 MB(2 GB)内存。

如何防止这种内存问题

重新编写程序,不需要将太多的数据存储在内存中。 我没有仔细看过你的代码,但是看起来好像在HashMap存储了很多数据; 当你有很多的logging时,超过内存。

要增加eclipse中的堆大小,请更改eclipse.ini文件。

参考

http://wiki.eclipse.org/FAQ_How_do_I_increase_the_heap_size_available_to_Eclipse%3F

你可以通过使用命令行参数来增加内存的大小。

看到这个链接 。

eclipse -vmargs -Xmx1024m

编辑:另见见这个优秀的问题

您可能想closures您的Project Explorer中打开的项目。 您可以通过右键单击打开的项目并select“closures项目”来完成此操作。

我注意到我必须定期增加my_directory \ eclipse \ eclipse.ini中的堆大小,这对我来说是有用的。

希望这可以帮助! 和平!

如果我必须处理更多的500000条logging,该怎么办?

有几种方法可以增加您的应用程序的java堆大小,其中有几个已经提出。 您的应用程序需要从您的adddressMap中删除元素,因为您的应用程序添加了新元素,所以如果有更多logging进来,您将不会遇到oom。如果您感兴趣,请查找生产者 – 消费者。

我不是在Java亲,但你的问题可以通过“blockingqueue”,如果你明智地使用它来解决。

尝试首先检索一大块logging,处理它们,并重复这个过程,直到完成处理。 这可能会帮助您摆脱OutOfMemory Exceptions

在Eclipse中运行 – >运行configurationfind你已经运行的类的名称,select它,点击Target选项卡,然后在“Additional Emulator Command Line Options”中添加:

-Xms512M -Xmx1524M

然后点击应用。

转到“窗口 – >首选项 – >常规 – > C / C ++ – >代码分析”,并禁用“语法和语义错误 – >抽象类不能被实例化”