2016-08-17 54 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()); 
     } 

    } 

} 

我運行的SAM伊比與XMS &增加內存XMX作爲

java -Xms2048m -Xmx6096m Dwnld 

錯誤我得到:

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

要啓動以獲取線程轉儲,並嘗試分析它。

或者有一些可以作爲解決辦法很多其他方式:

  1. /proc/sys/kernel/threads-max文件提供的線程數系統範圍的限制。如果他們希望根用戶可以更改該值:

    $回聲100000>的/ proc/SYS /內核/線程-MAX

  2. 在linux中線程的情況下,都只是一個共享的地址空間,因此處理你應該檢查每個用戶的進程數量。

  3. 檢查線程PID限制,因爲根據kernel.pid_max限制參數的值存在最大PID限制。 使用此command $ sysctl -a | grep kernel.pid_max獲得最大允許PID。
  4. 如果您無法修改操作系統設置,則會降低堆棧大小。喜歡的東西JAVA_OPTS="-Xss256k"