- 一. 调整 虚拟机参数
- 二. 立即 释放无用的对象
- 三. 利用序列化和反序列化技术
下面是具体的代码实现 :
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;
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
* 利用序列化和反序列化技术
*/
@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();
}
}
分享到:
相关推荐
本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. **内存溢出类型** - **1.1. java.lang.OutOfMemoryError: PermGen space** PermGen空间是JVM用于存储类元数据和常量池的部分,不会被垃圾收集器自动...
Java内存溢出问题,全称为Java OutOfMemoryError,是Java开发者经常遇到的运行时异常。内存溢出通常发生在程序运行过程中,系统无法为运行的应用程序分配足够的内存资源,导致程序无法正常执行。理解并解决Java内存...
Java内存溢出问题通常指的是程序在试图分配内存时,无法找到足够的连续内存空间而抛出的异常。在Java中,内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area,Java 8后被元空间取代)以及程序计数器和...
当`entityId`的数据量特别大时,多次请求累积可能导致内存消耗过大,进而触发内存溢出异常。 ##### 1.2 原因分析 内存溢出的根本原因是服务器内存不足以存储所有的数据。在本例中,具体体现在以下几个方面: - **...
### 图片过大引起的内存溢出解决方案 在Android开发过程中,我们经常会遇到因加载大尺寸图片而引发的`OutOfMemoryError`(内存溢出错误)。这种问题通常发生在使用`BitmapFactory`来加载图片时,尤其是在资源有限的...
2. **掌握Java堆内存溢出异常的测试**:通过编写程序不断地创建对象,直至消耗完所有可用的堆内存,从而触发`OutOfMemoryError`异常。 3. **掌握虚拟机栈和本地方法栈内存溢出异常的测试**:探究如何通过递归调用或...
poi读取大量数据会造成gc内存溢出的报错,由于垃圾回收机制无法将大量的对象及时的回收,而这些对象又会保存在内存中,会导致内存不够用的情况,这时候我们就需要使用新的方法,读取为cvs即可.此解决方案可支持千万数据的...
Java内存溢出问题,是Java开发中常见的性能问题,它发生在程序运行时,由于系统无法分配足够的内存资源来满足程序的运行需求,导致程序异常终止。深入理解Java内存溢出,有助于我们优化程序,提高系统稳定性。下面...
### 内存溢出及其解决方案 #### 一、内存溢出概述 内存溢出是指程序在运行过程中,因持续申请内存资源而导致系统无法满足其内存需求的现象。这通常发生在资源管理不当的情况下,例如未能及时释放不再使用的内存...
"Java内存溢出实现原因及解决方案" Java内存溢出是一种常见的错误,可能导致Java应用程序崩溃或无法正常运行。下面将详细介绍Java内存溢出实现原因及解决方案。 JVM Heap溢出 JVM Heap溢出是指Java虚拟机(JVM)...
在了解了Java内存溢出的类型之后,针对不同类型的内存溢出,我们可以采取以下解决方案: - 增加堆内存大小:可以通过JVM参数-Xms(堆的最小值)和-Xmx(堆的最大值)来控制堆内存的大小,以适应应用程序的需求。...
Java 异常是 Java 开发中经常遇到的问题,本文档将提供 Java 异常解决方案,涵盖 Hibernate、Tomcat、Java 基本、JSP、SSH 整合等多个方面的异常解决方案。 一、Hibernate 异常解决方案 * org.hibernate....
文章深入分析了内存溢出的具体表现形式,并提供了相应的解决方案。 #### 内存溢出类型及原因分析 内存溢出主要分为三种类型: 1. **Java heap space** - **原因**:当JVM的堆内存不足以存储更多的数据时会发生...
此外,"JAVA内存溢出异常解决方案"讨论了Java内存管理,当程序使用过多内存时,了解如何排查和解决内存溢出问题是非常重要的。 总的来说,Java正则表达式是处理字符串的强大工具,理解其工作原理和用法对提升代码...
### 解决OutOfMemoryError内存溢出 在Java开发过程中,我们经常会遇到`java.lang.OutOfMemoryError`(简称OOM)的问题。这个问题的发生主要是由于JVM内存不足或程序中存在内存泄漏所引起的。本文将深入探讨OOM产生...
在JBoss运行过程中,常见的内存溢出异常包括: 1. **PermGen Space(永久代)内存溢出**:当JVM的永久代空间不足时,会抛出`java.lang.OutOfMemoryError: PermGen space`异常。 2. **Heap Space(堆空间)内存溢出*...
以上两种解决方案都可以完美解决java读取大文件内存溢出的问题。它们可以让我们遍历大文件,而不需要将整个文件读取到内存中,从而避免内存溢出。 在实际应用中,我们可以根据具体情况选择合适的解决方案。比如,...
内存溢出(OutOfMemoryError)是由于Java虚拟机(JVM)无法分配足够的内存给新对象造成的异常。对于Tomcat服务器而言,内存溢出问题主要出现在两个方面:堆内存溢出和永久代内存溢出。 1. **堆内存溢出**:当应用...
不过,解决这类问题通常需要结合具体的应用场景和日志信息进行调试,因此可能需要多次尝试和调整才能找到最佳解决方案。在实际操作中,记得备份当前的配置,并在测试环境中先进行调整,以避免对生产环境造成影响。