`
xuxiaoxiao
  • 浏览: 80253 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

内存溢出异常解决方案总结

阅读更多
  一 调整 虚拟机参数

  二 立即 释放无用的对象

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

  下面是具体的代码实现

package outofmemory;

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

}
分享到:
评论

相关推荐

    poi大量数据读取gc内存溢出解决方案

    poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...

    Tomcat内存溢出的三种情况及解决办法分析

    Tomcat内存溢出解决方案 对于前两种情况,在应用本身没有内存泄露的情况下可以用设置tomcat jvm参数来解决。(-Xms -Xmx -XX:PermSize -XX:MaxPermSize) 最后一种可能需要调整操作系统和tomcat jvm参数同时...

    java内存机制及异常处理

    描述java内存回收机制,异常出现原因,解决方案

    VisualBasic语言开发常见问题解决方案总结.docx

    解决方案:在进行数学运算前,检查操作数是否会导致溢出;使用适当的数据类型来存储结果,或采用异常处理机制捕获溢出错误。 版本与环境兼容性问题 不同操作系统下的程序移植 原因:VB程序可能仅适用于特定的操作...

    游戏画面就弹出内存不能为read修复工具

    该内存不能为read或written的解决方案关键词: 该内存不能为"read" 该内存不能为"written" 从网上搜索来的几篇相关文章. 【文章一】 使用Windows操作系统的人有时会遇到这样的错误信息: 「“0X????????”指令...

    0x00000000内存不能为read修复工具

    该内存不能为“read”或“written解决方案 运行某些程序的时候,有时会出现内存错误的提示,然后该程序就关闭。 “0x????????”指令引用的“0x????????”内存。该内存不能为“read”。 “0x????????”指令引用的...

    GitHub上最火的Android项目,所有开源项目都有详细资料和配套视频

    6-什么是内存溢出 7-什么情况会导致内存泄漏 8-避免程序的OOM异常 9-线程池原理 10-UI性能优化 11-内存优化之字符串优化 12-常见内存优化方式 13-性能分析之hierarchyviewer使用 14-性能分析之Lint规范代码 ...

    操作系统(内存管理)

    文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存。 为什么必须管理内存 内存管理是计算机编程最为基本的...

    软件工程课后习题宝典

    java为系统异常和普通异常提供了不同的解决方案,编译器强制普通异常必须try..catch处理或用throws声明继续抛给上层调用方法处理,所以普通异常也称为checked异常,而系统异常可以处理也可以不处理,所以,编译器不...

    NC(UFIDA)开发错误整理

    内存溢出 javax.swing.JPanel 的 main() 中发生异常 java.lang.ClassNotFoundException和java.lang.NoClassDefFoundError的区别 Oracle 一个表字段,更新另一个表字段 报 not null PowerDesigner去除引号方法 显示...

    Java进阶教程解密JVM视频教程

    4. 了解 Java 内存模型相关知识,见识多线程并发读写共享数据时的问题和 Java 的解决方案。 适应人群 有一定的Java基础,希望提升 Java 内功的人群。 课程亮点 * 系统地学习 JVM 内存结构,垃圾回收、字节码与类...

    POI读写海量Excel(详细解读)

    目前处理Excel的开源javaAPI主要有两种,一是Jxl(Java Excel API),Jxl只支持Excel2003以下的版本。另外一种是Apache的Jakarta POI,相比于...目前还没有好的解决方案,建议对于海量数据写入操作,尽量使用Excel2007。

    java 面试题 总结

    比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 16、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 ...

    JSTL详细标签库介绍

    &lt;BR&gt;3、常见异常实例包括:数组下标越界,算法溢出(超出数值表达范围),除数为零,无效参数、内存溢出异常处理功能:主要处理一些同步异常(除数为0),不宜处理一些异步事件(Disk I/O End、网络信息到达、点击...

    智能水位监测系统.pptx

    目录 CONTENTS 背景分析 解决方案 案例介绍 01 02 03 智能水位监测系统全文共15页,当前为第2页。 01 背景分析 智能水位监测系统全文共15页,当前为第3页。 图片 随着社会经济发展,城市范围扩展,人口剧增,城市...

    C#微软培训资料

    8.4 异常处理语句 .95 8.5 小 结 .100 第三部分 面向对象的 C#.101 第九章 面向对象的程序设计 .101 9.1 面向对象的基本概念.101 9.2 对象的模型技术 .103 9.3 面向对象的分析 .105 9.4 面向对象的设计...

    超级有影响力霸气的Java面试题大全文档

    比如说内存溢出。不可能指望程序能处理这样的情况。 exception 表示一种设计或实现问题。也就是说,它表示如果程序运行正常,从不会发生的情况。 19、同步和异步有何异同,在什么情况下分别使用他们?举例说明。 ...

    华为编程开发规范与案例

    而pDBFat是数据库的起始地址,如果pSysHead-&gt;dbf_count值异常过大,将导致pDBFat值超过最大内存地址值,随后进行的内存操作将导致内存操作越界错误,因而在测试过程中数据库破坏后就出现了主机死机的现象。...

    X-Scan v3.1

    对于多数已知漏洞,我们给出了相应的漏洞描述、解决方案及详细描述链接,其它漏洞资料正在进一步整理完善中,您也可以通过本站的“安全文摘”和“安全漏洞”栏目查阅相关说明。 3.0版本提供了简单的插件开发包,...

    X-Scan

    对于多数已知漏洞,我们给出了相应的漏洞描述、解决方案及详细描述链接,其它漏洞资料正在进一步整理完善中,您也可以通过本站的“安全文摘”和“安全漏洞”栏目查阅相关说明。 3.0版本提供了简单的插件开发包,...

Global site tag (gtag.js) - Google Analytics