2016-08-17 44 views
5

Mam do czynienia z problemem braku pamięci w systemie Linux/redhat, a ten sam program działa na moim komputerze z systemem Windows.Wyjątek braku pamięci w java z linux-redhat

Moja konfiguracja komputera z systemem Linux to 15 GB pamięci RAM.

import java.awt.image.BufferedImage; 
import java.io.File; 
import java.io.FileOutputStream; 
import java.io.InputStream; 
import java.io.OutputStream; 
import java.net.URL; 
import java.sql.ResultSet; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 

/** 
* 
* @author ndoshi 
*/ 
public class Dwnld { 

    BufferedImage bi8 = null, bi16 = null; 
    ImageIcon ii = null; 
    ResultSet rs, rsDwnld; 
    String OG = "ogImage\\"; 
    String CROP8 = "Crop8\\"; 
    String CROP16 = "Crop16\\"; 
    String TIME = "", ErrorLog = "", ErrorLogPro = ""; 
    int hashInc8 = 0; 
    int hashInc16 = 0; 
    int totalround = 0; 
    int countProcess = 0; 
    boolean download_new = false; 
    private int row = 0; 
    int Dwnld = 0, NotDwnld = 0; 
    final String OP_Log = "Log", OP_Error = "ErrorLog", OP_ErrorPro = "ErrorLogProcess"; 

    int r, g, b, k, ih, j; 
    int sr = 0, sg = 0, sb = 0, sk = 0; 
    int rg, gg, bg, kg; 
    String s = "", s1 = "", hash16, hash8; 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     new Dwnld(); 
    } 

    public Dwnld(){ 
    try { 
      BufferedImage image = null; 
      InputStream is = null; 
      OutputStream os = null; 
      URL url = new URL("https://rukminim1.flixcart.com/image/312/312/t-shirt/u/g/k/33solidblackmelangeblack-sayitloud-m-original-imaehfytzzzazfyf.jpeg?q=70"); 
      is = url.openStream(); 
      os = new FileOutputStream(OG + "1.jpg"); 
      byte[] b = new byte[2048]; 
      int length; 
      while ((length = is.read(b)) != -1) { 
       os.write(b, 0, length); 
      } 
      image = ImageIO.read(new File(OG + "1.jpg")); 
      is.close(); 
      os.close(); 
      System.out.println("Hash 16 = "+hash16); 
      System.out.println("Hash 8 = "+hash8); 
     } catch (Exception ex) { 
      System.out.println(ex.getMessage()); 
     } 

    } 

} 

Używam Eby Sam coraz większą pamięć z XMS & XMX jak

java -Xms2048m -Xmx6096m Dwnld 

błąd otrzymuję:

Exception in thread "main" java.lang.OutOfMemoryError: unable to create new native thread 
     at java.lang.Thread.start0(Native Method) 
     at java.lang.Thread.start(Thread.java:714) 
     at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1056) 
     at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332) 
     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359) 
     at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343) 
     at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563) 
     at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) 
     at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1301) 
     at sun.net.www.protocol.https.HttpsURLConnectionImpl.getInputStream(HttpsURLConnectionImpl.java:254) 
     at java.net.URL.openStream(URL.java:1037) 
     at Dwnld.<init>(Dwnld.java:53) 
     at Dwnld.main(Dwnld.java:43) 
+0

należy zamknąć swoje transmisje w klauzuli finally (lub skorzystać z zasobów spróbować) – Michael

+0

To może być pomocne - https://plumbr.eu/outofmemoryerror/unable-to-create-new-native -wątek – Manish

Odpowiedz

0

uruchomieniem z gwintem zrzut i starają się analizować to.

Alternatywnie istnieje wiele innych sposobów, które mogą działać jako obejście:

  1. Plik /proc/sys/kernel/threads-max zapewnia ogólnosystemowe ograniczenie dla liczby wątków. Użytkownik root może zmienić tę wartość, jeśli chcą:

    $ echo 100000>/proc/sys/kernel/wątków-Max

  2. W przypadku Linuksa Nici są tylko procesy o wspólnej przestrzeni adresowej, a tym samym powinieneś sprawdzić liczbę procesów na użytkownika.

  3. Sprawdź limit PID gwintu, ponieważ istnieje maksymalny limit PID w oparciu o wartość parametru limitu kernel.pid_max. Skorzystaj z tego command $ sysctl -a | grep kernel.pid_max, aby uzyskać maksymalny dopuszczalny PID.
  4. jeśli nie można zmienić ustawień systemu operacyjnego, to zmniejsza się rozmiar stosu. z czymś JAVA_OPTS="-Xss256k"