2016-08-17 5 views
5

linux/redhatのメモリ不足の問題があり、同じプログラムがWindowsマシンで動作しています。linux-redhatを使ったjavaのメモリ不足の例外

私のLinuxマシン構成は15Gb 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()); 
     } 

    } 

} 

エラーが取得しています

java -Xms2048m -Xmx6096m Dwnld 

として、私はXMS & XMXでメモリを増やすのSAMイービを実行しています:

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

のようなものを持つあなたがfinally節(またはリソースでみてください使用)で、あなたのストリームを閉じる必要があります – Michael

+0

これは役に立つかもしれません - https://plumbr.eu/outofmemoryerror/unable-to-create-new-native -糸 – Manish

答えて

0

GETスレッドダンプを起動し、分析しようとしますそれ。

  1. /proc/sys/kernel/threads-maxファイルは、スレッドの数に対するシステム全体の制限を提供する:

    は、代替的な回避策として作用することができる他の多くの方法があります。彼らがしたい場合は、rootユーザーがその値を変更することができます。

    $はLinuxスレッドの場合は100000>は、/ proc/sys/kernel /スレッド-maxの

  2. をエコーちょうどので、共有アドレススペースで処理していますユーザーあたりのプロセス数を確認する必要があります。

  3. kernel.pid_maxのlimitパラメータの値に基づいて最大PID制限があるため、スレッドのPID制限を確認してください。 許容最大PIDを得るには、command $ sysctl -a | grep kernel.pid_maxを使用してください。
  4. OSの設定を変更できない場合は、スタックサイズが小さくなります。 JAVA_OPTS="-Xss256k"