彩票走势图

java内存溢出异常解决方案

转帖|其它|编辑:郝浩|2009-01-13 11:35:55.000|阅读 1647 次

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

# 慧都年终大促·界面/图表报表/文档/IDE等千款热门软控件火热促销中 >>

文章关键字:|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));

    }[SPAN]

  /**

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

    }

  }


标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@pclwef.cn

文章转载自:IT专家网

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
扫码咨询


添加微信 立即咨询

电话咨询

客服热线
023-68661681

TOP