`

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; 

  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内存溢出解决方案

    本文将深入探讨Java内存溢出的不同类型及其解决方案。 1. **内存溢出类型** - **1.1. java.lang.OutOfMemoryError: PermGen space** PermGen空间是JVM用于存储类元数据和常量池的部分,不会被垃圾收集器自动...

    Java内存溢出解决办法

    Java内存溢出问题,全称为Java OutOfMemoryError,是Java开发者经常遇到的运行时异常。内存溢出通常发生在程序运行过程中,系统无法为运行的应用程序分配足够的内存资源,导致程序无法正常执行。理解并解决Java内存...

    Java 内存溢出解决办法

    Java内存溢出问题通常指的是程序在试图分配内存时,无法找到足够的连续内存空间而抛出的异常。在Java中,内存分为几个区域:堆(Heap)、栈(Stack)、方法区(Method Area,Java 8后被元空间取代)以及程序计数器和...

    spring mvc重定向导致内存溢出解决方案

    当`entityId`的数据量特别大时,多次请求累积可能导致内存消耗过大,进而触发内存溢出异常。 ##### 1.2 原因分析 内存溢出的根本原因是服务器内存不足以存储所有的数据。在本例中,具体体现在以下几个方面: - **...

    图片过大引起的内存溢出解决方案

    ### 图片过大引起的内存溢出解决方案 在Android开发过程中,我们经常会遇到因加载大尺寸图片而引发的`OutOfMemoryError`(内存溢出错误)。这种问题通常发生在使用`BitmapFactory`来加载图片时,尤其是在资源有限的...

    JVM实战-对象访问与内存溢出异常解析

    2. **掌握Java堆内存溢出异常的测试**:通过编写程序不断地创建对象,直至消耗完所有可用的堆内存,从而触发`OutOfMemoryError`异常。 3. **掌握虚拟机栈和本地方法栈内存溢出异常的测试**:探究如何通过递归调用或...

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

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

    Java内存溢出问题

    Java内存溢出问题,是Java开发中常见的性能问题,它发生在程序运行时,由于系统无法分配足够的内存资源来满足程序的运行需求,导致程序异常终止。深入理解Java内存溢出,有助于我们优化程序,提高系统稳定性。下面...

    内存溢出及解决方案.docx

    ### 内存溢出及其解决方案 #### 一、内存溢出概述 内存溢出是指程序在运行过程中,因持续申请内存资源而导致系统无法满足其内存需求的现象。这通常发生在资源管理不当的情况下,例如未能及时释放不再使用的内存...

    Java内存溢出实现原因及解决方案

    "Java内存溢出实现原因及解决方案" Java内存溢出是一种常见的错误,可能导致Java应用程序崩溃或无法正常运行。下面将详细介绍Java内存溢出实现原因及解决方案。 JVM Heap溢出 JVM Heap溢出是指Java虚拟机(JVM)...

    JAVA内存溢出解决方案图解

    在了解了Java内存溢出的类型之后,针对不同类型的内存溢出,我们可以采取以下解决方案: - 增加堆内存大小:可以通过JVM参数-Xms(堆的最小值)和-Xmx(堆的最大值)来控制堆内存的大小,以适应应用程序的需求。...

    java异常解决方案.docx

    Java 异常是 Java 开发中经常遇到的问题,本文档将提供 Java 异常解决方案,涵盖 Hibernate、Tomcat、Java 基本、JSP、SSH 整合等多个方面的异常解决方案。 一、Hibernate 异常解决方案 * org.hibernate....

    apache服务器出现内存溢出的解决方法.doc

    文章深入分析了内存溢出的具体表现形式,并提供了相应的解决方案。 #### 内存溢出类型及原因分析 内存溢出主要分为三种类型: 1. **Java heap space** - **原因**:当JVM的堆内存不足以存储更多的数据时会发生...

    java正则表达式例子

    此外,"JAVA内存溢出异常解决方案"讨论了Java内存管理,当程序使用过多内存时,了解如何排查和解决内存溢出问题是非常重要的。 总的来说,Java正则表达式是处理字符串的强大工具,理解其工作原理和用法对提升代码...

    解决OutOfMemoryError内存溢出

    ### 解决OutOfMemoryError内存溢出 在Java开发过程中,我们经常会遇到`java.lang.OutOfMemoryError`(简称OOM)的问题。这个问题的发生主要是由于JVM内存不足或程序中存在内存泄漏所引起的。本文将深入探讨OOM产生...

    jboss内存溢出原因

    在JBoss运行过程中,常见的内存溢出异常包括: 1. **PermGen Space(永久代)内存溢出**:当JVM的永久代空间不足时,会抛出`java.lang.OutOfMemoryError: PermGen space`异常。 2. **Heap Space(堆空间)内存溢出*...

    完美解决java读取大文件内存溢出的问题

    以上两种解决方案都可以完美解决java读取大文件内存溢出的问题。它们可以让我们遍历大文件,而不需要将整个文件读取到内存中,从而避免内存溢出。 在实际应用中,我们可以根据具体情况选择合适的解决方案。比如,...

    MyEclipse下tomcat日志输出和内存溢出解决方法.doc

    内存溢出(OutOfMemoryError)是由于Java虚拟机(JVM)无法分配足够的内存给新对象造成的异常。对于Tomcat服务器而言,内存溢出问题主要出现在两个方面:堆内存溢出和永久代内存溢出。 1. **堆内存溢出**:当应用...

    Tomcat内存溢出的解决方法(java.util.concurrent.ExecutionException)

    不过,解决这类问题通常需要结合具体的应用场景和日志信息进行调试,因此可能需要多次尝试和调整才能找到最佳解决方案。在实际操作中,记得备份当前的配置,并在测试环境中先进行调整,以避免对生产环境造成影响。

Global site tag (gtag.js) - Google Analytics