yinxin
作者yinxin2015-04-13 19:00
项目经理, 某金融机构

内存溢出异常解决方案总结

字数 4878阅读 1222评论 0赞 0

这几天刚好碰到一个java 内存溢出的问题。一直尝试着解决这个问题目前想到了三个方法:一 调整 虚拟机参数二 立即 释放无用的对象三 利用序列化和反序列化技术

  下面是具体的代码实现

  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();

      }

      }

    如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

    0

    添加新评论0 条评论

    Ctrl+Enter 发表

    作者其他文章

    相关文章

    相关问题

    相关资料

    X社区推广