一 调整 虚拟机参数
二 立即 释放无用的对象 

三 利用序列化和反序列化技术 

下面是具体的代码实现
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 
          * 调整 虚拟机参数
     * 
     * <pre>
     * <li>
     * First Try
     * </li>
     * -Xloggc:gc.log
     * -Xms256M
     * -Xmx256M
     * 
     * throw java.lang.OutOfMemoryError: Java heap space
     * 
     * <li>
     * Second Try
     * </li>
     * -Xloggc:gc.log
     * -Xms512M
     * -Xmx512M
     * 
     * </pre>
     */
    public static void changeJVMArguments() {
        long startTime = System.currentTimeMillis();
        System.out.println("Start : " + startTime);
        List<BigInteger> list = new ArrayList<BigInteger>(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
     * 立即 释放无用的对象
     * <pre>
     * <li>
     *  Release Object
     * </li>
     * <code>
     * //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;
     * </code>
     * </pre>
     */
    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
     * 利用序列化和反序列化技术 
     * <li>Store Object </li>
     * <li>read Object</li>
     * <li>do something</li>
     */
    @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<BigInteger> list = new ArrayList<BigInteger>(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<BigInteger>(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<BigInteger> list = (List<BigInteger>) 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();
    }

}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐