JAVA内存溢出详解_第1页
JAVA内存溢出详解_第2页
JAVA内存溢出详解_第3页
JAVA内存溢出详解_第4页
JAVA内存溢出详解_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、调整 虚拟机参数二 立即 释放无用的对象三 利用序列化和反序列化技术 下面是具体的代码实现 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.BigInt

2、eger;import java.util.ArrayList;import java.util.List;* author free* springcomingagain*/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*/

3、 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

4、.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 = array1i;* temp1 = null;* array1i = null;* * array1 = null;* /S

5、econd Release Object* temp1 = null;* for (int i = 0; i < 1200000; i+) * temp1 = array2i;* temp1 = null;* array2i = null;* * array2 = null;*/ public static void releaseObjectImmediate() long startTime = System.currentTimeMillis(); System.out.println("First Start : " + startTime); BigInte

6、ger array1 = new BigInteger1200000;for (int i = 0; i < 1200000; i+) array1i = new BigInteger("10000000");/ First Release ObjectBigInteger temp1 = null;for (int i = 0; i < 1200000; i+) temp1 = array1i;temp1 = null;array1i = null;array1 = null;long endTime = System.currentTimeMillis();

7、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 BigInteger1200000;for (int i = 0; i &

8、lt; 1200000; i+) array2i = new BigInteger("10000000");/ Second Release Objecttemp1 = null;for (int i = 0; i < 1200000; i+) temp1 = array2i;temp1 = null;array2i = null;array2 = null;endTime = System.currentTimeMillis();System.out.println("Second End. : " + endTime + " Cost

9、 : " + (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 序列化对象ObjectOu

10、tputStream 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

11、);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.

12、getMessage(); finally if(null != out ) try out.close(); out = null; catch (IOException e) / ignoreSystem.out.println("Store Object End."); System.out.println("Read Object Start.");/ read Object 反序列化对象File fileList = new File(objectStoreFolder).listFiles(); int fileSize = fileList

13、.length;ObjectInputStream in = null;try for (int i = 0; i < fileSize; i+) in = new ObjectInputStream( new FileInputStream(fileListi); List list = (List) in.readObject();/ do something startSystem.out.println(list.size();/ do something end. catch (FileNotFoundException e) System.err.println(e.getM

14、essage(); 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

15、static void main(String args) changeJVMArguments();releaseObjectImmediate(); delaySave();提示:这段代码用的是 JDK6.0 ,发现立即释放无用的对象,这个方法来解决内存溢出 不是很理想。、 java.lang.OutOfMemoryError: PermGen spacePermGen space的全称是 Permanent Generation space, 是指内存的永久保存区 域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被 放至U PermGen spa

16、ce 中,它和存放类实例(Instanee)的Heap区域不同,GC(Garbage Collection) 不会在主 程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS勺话,就很可能出现 PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP 下都用了大量的第三方 jar, 其大小超过了 jvm默认的大小(4M)那么就会产生此错误信息了。解决方法:手动设置MaxPermSize大小修改 TOMCAT_HOME/bin/catalina.sh在“ echo "Usi ng CATALI

17、NA_BASE: $CATALINA_BAS” 上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128M" 建议:将相同的第三方 jar 文件移置到 tomcat/shared/lib 目录下, 这样可以达 到减少 jar 文档重复占用内存的目的。二、 java.lang.OutOfMemoryError: Java heap spaceHeap size 设置JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设置JVM在启动的时候会自动设置 Heap size的值,其初始空间(即

18、-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可 以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 Heapsize 的大小是 YoungGeneration 和 Tenured Generaion 之和。 提示:在JVM中如果98%的时间是用于GC且可用的Heap size不足2%的时候 将抛出此异常信息。提示:Heap Size最大不要超过可用物理内存的 80%, 一般的要将-Xms和-Xmx 选项设置为相同,而-Xmn为1/4的-Xmx值。解决方法:手动设置 Heap size修改 TOMCAT_HOME/bin/catalina.sh 在“ e

19、cho "Usi ng CATALINA_BASE: $CATALINA_BASE"上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"、实例,以下给出1G内存环境下java jvm 的参数设置参考:JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M -XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "一、 java.l

20、ang.OutOfMemoryError: PermGen spacePermGen space的全称是 Permanent Generation space, 是指内存的永久保存区 域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被 放至U PermGen space 中,它和存放类实例(Instanee)的Heap区域不同,GC(Garbage Collection) 不会在主 程序运行期对PermGen space进行清理,所以如果你的应用中有很多CLASS勺话,就很可能出现 PermGen space错误,这种错误常见在web服务器对JSP进行

21、pre compile的时候。如果你的WEB APP 下都用了大量的第三方 jar, 其大小超过了 jvm默认的大小(4M)那么就会产生此错误信息了。解决方法:手动设置MaxPermSize大小修改 TOMCAT_HOME/bin/catalina.sh在“ echo "Us ing CATALINA _BASE: $CATALINA_BAS” 上面加入以下行: JAVA_OPTS="-server -XX:PermSize=64M -XX:MaxPermSize=128M" 建议:将相同的第三方 jar 文件移置到 tomcat/shared/lib 目录下,这

22、样可以达 到减少 jar 文档重复占用内存的目的。二、 java.lang.OutOfMemoryError: Java heap spaceHeap size 设置JVM堆的设置是指java程序运行过程中JVM可以调配使用的内存空间的设 置JVM在启动的时候会自动设置 Heap size的值,其初始空间(即-Xms)是物理内存的1/64,最大空间(-Xmx)是物理内存的1/4。可 以利用JVM提供的-Xmn -Xms -Xmx等选项可进行设置。 Heapsize 的大小是 YoungGeneration 和 Tenured Generaion 之和。 提示:在JVM中如果98%的时间是用于G

23、C且可用的Heap size不足2%的时候 将抛出此异常信息。提示:Heap Size最大不要超过可用物理内存的 80%, 一般的要将-Xms和-Xmx 选项设置为相同,而-Xmn为1/4的-Xmx值。解决方法:手动设置 Heap size修改 TOMCAT_HOME/bin/catalina.sh 在“ echo "Usi ng CATALINA_BASE: $CATALINA_BASE"上面加入以下行: JAVA_OPTS="-server -Xms800m -Xmx800m -XX:MaxNewSize=256m"、实例,以下给出1G内存环境下ja

24、va jvm 的参数设置参考:JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=64M-XX:MaxNewSize=256m -XX:MaxPermSize=128m -Djava.awt.headless=true "关于 Java 内存溢出的解决办法你好,前几天我上msn时候看到你在 msn的签名是JDK解决内存溢出,突然想给你提点这方 面的建议。1. 内存容易溢出可以说是因为在程序中有内存泄漏 (memory leak) 的问题 , 容易引起内存溢 出的直接原因可以归结为代码质量问题,在内存中存在大量的对象,垃圾回收器

25、不能回收, 随着程序的不断运行, 程序会创造更多的对象, 这些对象之间存在一定的内联关系, 所以不 容易造成被 java 垃圾回收器回收。解决的办法就是,对所有的代码包括页面中的 java 代码都进行一遍彻底的 review ,对那些 静态 (static) 的对象要特别留神,特别是类型为 Map,List,Set 的,静态的变量会一直驻存 在内存中,生命周期比较长,不会被垃圾器回收。对于代码, 要审查是否生成了大量的冗余的对象, 还有一些逻辑业务处理的类, 算法是否过 于复杂,调整算法。对于代码认真审查,再仔细重构一遍代码,能提高代码质量,提高程序运行稳定性。在人工审查前,可以先由工具审查一遍,几个开源的工具如下:1. Findbugs, 2. Checkstyle, 3. PMD,人工和工具相互结合,效果更好一些。2. 程序运行的时间过长了后, 还是容易在内存中生成过多的对象, 造成一些问题, 所以可以 编写一个脚本( lin

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论