一 調整 虛擬機器參數
二 立即 釋放無用的對象
三 利用序列化和還原序列化技術
下面是具體的代碼實現
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();
}
}
推薦初學者一個編程技術的學習網站,96堆棧 軟體編程網,http://www.96dz.com,裡面有C++視頻教程、C#視頻教程、Java視頻教程下載,還有C\C++、Java、C# .NET等編程技術文摘,包括目前主流的Linux編程與Web編程等學習資料視頻教程下載。