메모리 넘 침 이상 해결 방안 총화

요 며칠 동안 자바 메모리 가 넘 치 는 문제 에 부 딪 혔 습 니 다.이 문 제 를 해결 하려 고 시 도 했 는데 현재 세 가지 방법 이 생각 났 다. 하 나 는 가상 컴퓨터 의 매개 변 수 를 조정 하고 하 나 는 바로 쓸모없는 대상 을 방출 하 는 것 이다. 하 나 는 직렬 화 와 반 직렬 화 기술 을 이용 하 는 것 이다.
다음은 구체 적 인 코드 구현 입 니 다.
  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
  * [email protected]
  */
  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();

  }

  }

 

좋은 웹페이지 즐겨찾기