轉帖|其它|編輯:郝浩|2009-01-13 11:35:55.000|閱讀 1662 次
概述:這幾天剛好碰到一個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
*/
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@fc6vip.cn
文章轉載自:IT專家網