2011-12-22 25 views
40
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(); 
} 

Đây ResultSet đã xử lý khoảng 500.000 hồ sơ, nhưng nó sẽ cho tôi lỗi như:Tăng không gian đống trong Eclipse: (java.lang.OutOfMemoryError)

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) 

Tôi biết lỗi này xuất phát vì VM bộ nhớ, nhưng không biết làm thế nào để tăng nó trong Eclipse?

Tôi phải làm gì nếu tôi phải xử lý hơn 500.000 hồ sơ?

+1

Có lẽ bạn cần phải thay đổi logic. tại sao bạn cần 500000 bản ghi trong một lần chụp. –

+0

Trong hầu hết các trường hợp như thế này, bạn phải sửa mã cần được cải thiện, nhưng phần lớn thời gian không phải là lựa chọn ngắn hạn khả thi và bạn cần giải pháp ngay lập tức. –

Trả lời

127

Trong Run-> Run Cấu hình tìm Tên của lớp bạn đã được chạy, chọn nó, nhấp vào tab Arguments sau đó thêm:

-Xms512M -Xmx1524M

vào phần Đối số VM

+0

Công việc của nó hoàn hảo – chetan

+0

Làm việc cho tôi với Eclipse Indigo và jdk 1.6. – matthewb

+0

Làm việc cho tôi với Eclipse Indigo và JDK 1.7 – Xenalin

1

Bạn có thể tăng kích thước bộ nhớ thông qua việc sử dụng dòng lệnh rguments.

Xem this link.

eclipse -vmargs -Xmx1024m

Chỉnh sửa: Xem thêm see this excellent question

+1

Điều này sẽ không hoạt động; nó chỉ cung cấp cho Eclipse nhiều bộ nhớ hơn, không phải chương trình của riêng bạn khi bạn chạy nó từ bên trong Eclipse. – Jesper

7

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

-Xms và -Xmx thiết lập tối thiểu và kích thước tối đa cho các heap. Được giới thiệu là một tính năng, Hotspot đặt một giới hạn kích thước trên heap để ngăn không cho nó thổi ra khỏi hệ thống của bạn. Vì vậy, khi bạn tìm ra bộ nhớ tối đa mà ứng dụng của bạn cần, bạn hãy giới hạn bộ nhớ đó để giữ cho mã lừa đảo không ảnh hưởng đến các ứng dụng khác. Sử dụng các cờ như -Xmx512M, trong đó M là viết tắt của MB. Nếu bạn không bao gồm nó, bạn chỉ định byte. Một số cờ sử dụng định dạng này. Bạn cũng có thể nhận được một sự thúc đẩy khởi động nhỏ bằng cách thiết lập tối thiểu cao hơn, vì nó không phải phát triển heap ngay lập tức.

-XX: MaxPermSize = ### M đặt kích thước "thế hệ vĩnh viễn" tối đa. Điểm nóng là bất thường ở chỗ một số loại dữ liệu được lưu trữ trong "thế hệ vĩnh viễn", một khu vực riêng biệt của đống mà chỉ hiếm khi (hoặc không bao giờ) thu gom rác thải. Danh sách dữ liệu được lưu trữ trên máy ảo hơi mờ, nhưng nó chứa đựng những thứ như siêu dữ liệu lớp, bytecode, chuỗi ký tự, vv .. (và điều này chắc chắn khác nhau giữa các phiên bản Hotspot). Bởi vì thế hệ này hiếm khi hoặc không bao giờ được thu thập, bạn có thể cần phải tăng kích thước của nó (hoặc bật quét quét bằng một vài cờ khác). Trong JRuby đặc biệt chúng tôi tạo ra rất nhiều bộ chuyển đổi bytecode, mà thường đòi hỏi nhiều không gian gen hơn.

5

Làm thế nào để cung cấp cho chương trình của bạn bộ nhớ hơn khi chạy từ Eclipse

Đến Chạy/Run Configurations. Chọn cấu hình chạy cho chương trình của bạn. Nhấp vào tab "Đối số". Trong khu vực "Đối số chương trình", hãy thêm đối số -Xmx, ví dụ: -Xmx2048m để cung cấp cho chương trình của bạn tối đa. bộ nhớ 2048 MB (2 GB).

Làm thế nào để ngăn chặn vấn đề bộ nhớ này

Viết lại chương trình của bạn trong một cách mà nó không cần phải lưu trữ dữ liệu quá nhiều trong bộ nhớ. Tôi chưa xem chi tiết mã của bạn, nhưng có vẻ như bạn đang lưu trữ nhiều dữ liệu trong một số HashMap; nhiều hơn phù hợp trong bộ nhớ khi bạn có nhiều hồ sơ.

0

Phải làm gì nếu tôi phải xử lý nhiều hơn 500.000 bản ghi?

Có một số cách để tăng kích thước heap java cho ứng dụng của bạn, nơi một số đã gợi ý. Ứng dụng của bạn cần phải xóa các phần tử khỏi adddressMap của bạn vì ứng dụng của bạn thêm phần tử mới vào đó và do đó bạn sẽ không gặp phải oom nếu có nhiều bản ghi hơn. Hãy tìm người tiêu dùng sản xuất nếu bạn quan tâm.

34

Trong thư mục tải về Eclipse làm cho các mục trong file eclipse.ini:

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

hay bất cứ những giá trị mà bạn muốn.

+0

Cảm ơn bạn đã trả lời – chetan

+0

câu trả lời hay, cảm ơn –

+0

Đã hoạt động hoàn hảo. Cảm ơn –

0

Tôi không phải chuyên nghiệp về Java nhưng vấn đề của bạn có thể được giải quyết bằng cách "ngăn chặn" nếu bạn sử dụng nó một cách khôn ngoan.

Cố gắng truy xuất một đoạn bản ghi trước, xử lý và lặp lại quy trình cho đến khi bạn hoàn tất quá trình xử lý của mình. Điều này có thể giúp bạn thoát khỏi số OutOfMemory Exceptions.

0

Trong Eclipse goto Run-> Run Cấu hình tìm Tên của lớp bạn đã được chạy, chọn nó, nhấp vào tab Target sau đó trong "bổ sung Emulator Command Line Options" thêm:

-Xms512M -Xmx1524M

sau đó nhấp vào áp dụng.

0

Đến "Window -> Preferences -> General -> C/C++ -> Mã phân tích" và vô hiệu hóa "Cú pháp và ngữ nghĩa lỗi -> lớp trừu tượng không thể được khởi tạo"

1

Bạn có thể muốn đóng mở dự án trong Project Explorer của bạn. Bạn có thể làm điều này bằng cách kích chuột phải vào một dự án đang mở và chọn "Close Project".

Đây là những gì làm việc cho tôi sau khi tôi nhận thấy rằng tôi đã phải định kỳ tăng kích thước heap trong my_directory \ eclipse \ eclipse.ini.

Hy vọng điều này sẽ hữu ích! Hòa bình!

0

Trong file eclipse.ini, làm cho bên dưới mục

-Xms512m

-Xmx2048m

-XX: MaxPermSize = 1024M

Các vấn đề liên quan