|
一 调整 虚拟机参数 二 立即 释放无用的对象 三 利用序列化和反序列化技术 下面是具体的代码实现 package com.free; 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 * 调整 虚拟机参数 * *
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 * 立即 释放无用的对象 *
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(); } } 我常用JDK1.4 写这段代码我用的是JDK6.0发现 立即释放无用的对象 这个方法来解决内存溢出不是很理想。 |