JAVA記憶體溢出異常解決方案

來源:互聯網
上載者:User

 一 調整 虛擬機器參數

  二 立即 釋放無用的對象

  三 利用序列化和還原序列化技術

  下面是具體的代碼實現

   package com.free;
  import java.io.File;

  import java.io.FileInputStream;

  import java.io.FileNotFoundException;

  import java.io.FileOutputStream;

  import java.io.IOException;

  import java.io.ObjectInputStream;

  import java.io.ObjectOutputStream;

  import java.math.BigInteger;

  import java.util.ArrayList;

  import java.util.List;

  /**

  * @author free

  * springcomingagain@gmail.com

  */

  public class OutMemorySolution {

  /***

  * Change JVM Arguments

  * 調整 虛擬機器參數

  *

  *

  *
  * First Try
  *
  * -Xloggc:gc.log
  * -Xms256M
  * -Xmx256M
  *
  * throw java.lang.OutOfMemoryError: Java heap space
  *
  *
  * Second Try
  *
  * -Xloggc:gc.log
  * -Xms512M
  * -Xmx512M
  *
  *
  */

  public static void changeJVMArguments() {

  long startTime = System.currentTimeMillis();

  System.out.println("Start : " + startTime);

  List list = new ArrayList(0);

  for (int i = 0; i < 5000000; i++) {

  list.add(new BigInteger("1000000"));

  }

  long endTime = System.currentTimeMillis();

  System.out.println("End.. : " + endTime + " Cost : "

  + (endTime - startTime));

  }

  /**

  * Release Object Immediate

  * 立即 釋放無用的對象

  *

  *
  * Release Object
  *
  *
  * //First Release Object
  * BigInteger temp1 = null;
  * for (int i = 0; i < 1200000; i++) {
  * temp1 = array1[i];
  * temp1 = null;
  * array1[i] = null;
  * }
  * array1 = null;
  * ...
  * //Second Release Object
  * temp1 = null;
  * for (int i = 0; i < 1200000; i++) {
  * temp1 = array2[i];
  * temp1 = null;
  * array2[i] = null;
  * }
  * array2 = null;
  *
  *
  */

  public static void releaseObjectImmediate() {

  long startTime = System.currentTimeMillis();

  System.out.println("First Start : " + startTime);

  BigInteger[] array1 = new BigInteger[1200000];

  for (int i = 0; i < 1200000; i++) {

  array1[i] = new BigInteger("10000000");

  }

  // First Release Object

  BigInteger temp1 = null;

  for (int i = 0; i < 1200000; i++) {

  temp1 = array1[i];

  temp1 = null;

  array1[i] = null;

  }

  array1 = null;

  long endTime = System.currentTimeMillis();

  System.out.println("First End.. : " + endTime + " Cost : "

  + (endTime - startTime));

  // do something start

  // do something end..

  startTime = System.currentTimeMillis();

  System.out.println("Second Start : " + startTime);

  BigInteger[] array2 = new BigInteger[1200000];

  for (int i = 0; i < 1200000; i++) {

  array2[i] = new BigInteger("10000000");

  }

  // Second Release Object

  temp1 = null;

  for (int i = 0; i < 1200000; i++) {

  temp1 = array2[i];

  temp1 = null;

  array2[i] = null;

  }

  array2 = null;

  endTime = System.currentTimeMillis();

  System.out.println("Second End.. : " + endTime + " Cost : "

  + (endTime - startTime));

  }

  /**

  * delaySave

  * 利用序列化和還原序列化技術

  *

Store Object

  *

read Object

  *

do something

  */

  @SuppressWarnings("unchecked")

  public static void delaySave() {

  final String objectStoreFolder ="D:\\obj\\";

  System.out.println("Store Object Start..");

  // Store Object 序列化對象

  ObjectOutputStream out = null;

  try {

  out = new ObjectOutputStream(new FileOutputStream(

  objectStoreFolder+ "objectFile.obj" + 0));

  List list = new ArrayList(0);

  for (int i = 0; i < 5000000; i++) {

  if (((i+1) % 100000) == 0) {

  out.writeObject(list);

  out.close();

  out = null;

  list = null;

  list = new ArrayList(0);

  out = new ObjectOutputStream(new FileOutputStream(

  objectStoreFolder+ "objectFile.obj" + ((i % 1000000) + 1)));

  }

  System.out.println(i);

  list.add(new BigInteger("1000000"));

  }

  } catch (FileNotFoundException e) {

  System.err.println(e.getMessage());

  } catch (IOException e) {

  System.err.println(e.getMessage());

  }

  finally{

  if(null != out ){

  try {

  out.close();

  out = null;

  } catch (IOException e) {

  // ignore

  }

  }

  }

  System.out.println("Store Object End..");

  System.out.println("Read Object Start..");

  // read Object 還原序列化對象

  File [] fileList = new File(objectStoreFolder).listFiles();

  int fileSize = fileList.length;

  ObjectInputStream in = null;

  try {

  for (int i = 0; i < fileSize; i++) {

  in = new ObjectInputStream(

  new FileInputStream(fileList[i]));

  List list = (List) in.readObject();

  // do something start

  System.out.println(list.size());

  // do something end..

  }

  } catch (FileNotFoundException e) {

  System.err.println(e.getMessage());

  } catch (IOException e) {

  System.err.println(e.getMessage());

  } catch (ClassNotFoundException e) {

  System.err.println(e.getMessage());

  }

  finally{

  if(null != in ){

  try {

  in.close();

  in = null;

  } catch (IOException e) {

  // ignore

  }

  }

  }

  System.out.println("Read Object End..");

  }

  /**

  * Test code

  * @param args

  */

  public static void main(String[] args) {

  changeJVMArguments();

  releaseObjectImmediate();

  delaySave();

  }

  }

 推薦初學者一個編程技術的學習網站,96堆棧 軟體編程網,http://www.96dz.com,裡面有C++視頻教程、C#視頻教程、Java視頻教程下載,還有C\C++、Java、C# .NET等編程技術文摘,包括目前主流的Linux編程與Web編程等學習資料視頻教程下載。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.