java.lang.OutOfMemory总结分析

本文详细解析了Java中出现OutOfMemoryError的原因,并提供了多种解决策略。重点介绍了与PermGenSpace和HeapSpace相关的内存溢出问题及其解决方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

OOM浅析


        相信有一定java开发经验的人或多或少都会遇到OutOfMemoryError的问题,这个问题曾困扰了我很长时间,随着解决各类问题经验的积累以及对问题根源的探索,终于有了一个比较深入的认识。参照网上的一些解决方案,在这里加以整理。
在解决java内存溢出问题之前,需要对jvm(java虚拟机)的内存管理有一定的认识。jvm管理的内存大致包括三种不同类型的内存区域: Permanent Generation space(永久            保存区域)、Heap space(堆区域)、Java Stacks(Java栈)。
         永久保存区域主要存放Class(类)和Meta的信息,Class第一次被Load的时候被放入PermGen space区域,Class需要存储的内容主要包括方法和静态属性。
         堆区域用来存放Class的实例(即对象),对象需要存储的内容主要是非静态属性。每次用new创建一个对象实例后,对象实例存储在堆区域中,这部分空间也被jvm的垃圾回收机制管理。
         Java栈跟大多数编程语言包括汇编语言的栈功能相似,主要基本类型变量以及方法的输入输出参数。Java程序的每个线程中都有一个独立的堆栈。

容易发生内存溢出问题的内存空间包括:Permanent Generation space和Heap space。


第一种OutOfMemoryError: PermGen space


发生这种问题的原意是程序中使用了大量的jar或class,使java虚拟机装载类的空间不够,与Permanent Generation space有关。解决这类问题有以下两种办法:

1. 增加java虚拟机中的XX:PermSize和XX:MaxPermSize参数的大小,其中XX:PermSize是初始永久保存区域大小,XX:MaxPermSize是最大永久保存区域大小。

       如针对tomcat6.0,在catalina.sh 或catalina.bat文件中一系列环境变量名说明结束处(大约在70行左右) 增加一行:JAVA_OPTS=" -XX:PermSize=64M -XX:MaxPermSize=128m"

       如果是windows服务器还可以在系统环境变量中设置。感觉用tomcat发布sprint+struts+hibernate架构的程序时很容易发生这种内存溢出错误。使用上述方法,我成功解决了部署ssh项目的tomcat服务器经常宕机的问题。

2. 清理应用程序中web-inf/lib下的jar。

        如果tomcat部署了多个应用,很多应用都使用了相同的jar,可以将共同的jar移到tomcat共同的lib下,减少类的重复加载。这种方法是网上部分人推荐的,我没试过,但感觉减少不了太大的空间,最靠谱的还是第一种方法。


第二种OutOfMemoryError:  Java heap space


发生这种问题的原因是java虚拟机创建的对象太多,在进行垃圾回收之间,虚拟机分配的到堆内存空间已经用满了,与Heap space有关。解决这类问题有两种思路:

1. 检查程序,看是否有死循环或不必要地重复创建大量对象。找到原因后,修改程序和算法。

2. 增加Java虚拟机中Xms(初始堆大小)和Xmx(最大堆大小)参数的大小。如:set JAVA_OPTS= -Xms256m -Xmx1024m


第三种OutOfMemoryError:unable to create new native thread


这种错误在Java线程个数很多的情况下容易发生,我暂时还没遇到过,发生原意和解决办法可以参考:
http://hi.baidu.com/hexiong/blog/item/16dc9e518fb10c2542a75b3c.html

参考自:http://blog.sina.com.cn/s/blog_701c951f0100n1sp.html


代码中如何查看JVM内存设置信息


1、Runtime.getRuntime().maxMemory(); 
        最大可用内存,对应-Xmx;为JVM的最大可用内存,可通过-Xmx设置,默认值为物理内存的1/4,设值不能高于计算机物理内存;
2、Runtime.getRuntime().freeMemory(); 
         当前JVM空闲内存;其为当前JVM空闲内存,因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,而JVM实际可用内存并不等于freeMemory(),而应该等maxMemory()-totalMemory()+freeMemory().及其设置JVM内存分配。
3、Runtime.getRuntime().totalMemory();

        当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和。为当前JVM占用的内存总数,其值相当于当前JVM已使用的内存及freeMemory()的总和,会随着JVM使用内存的增加而增加;


 修改了这些配置没有用,怎么办?


1、修改ini文件
         在eclipse.ini文件中将默认设置改为-vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M或者更大,这要看你自己机器的内存配置而定;
2、在IDE中修改配置
        打开eclipse,选择Window--Preferences...在对话框左边的树上双击Java,再双击Installed JREs,在右边选择前面有对勾的JRE,再单击右边的“Edit”按钮,出现一个 Edit JRE 的对话框,在其中的Default VM Arguments: 框中输入 -Xms128m -Xmx512m ,这样设置Java拟虚机内存使用最小是128M,最大是512M,再单击“OK”关闭 Edit JRE 对话框,再单击“OK”关闭 Preferences对话框;
3、在快捷方式标签下修改
        如果这样还解决不了,就右击eclipse快捷方式,在属性---快捷方式标签下---目标中输入D:\eclipse\eclipse.exe -clean -vmargs -Xms128M -Xmx512M -XX:PermSize=64M -XX:MaxPermSize=128M,其中D:\eclipse\eclipse.exe是eclipse的位置,就可以了。

参考自:http://www.360doc.com/content/12/0504/18/1527319_208660024.shtml


补充各参数含义


 -vmargs:说明后面是VM(即Myeclipse虚拟机)的参数
 -Xms128m:虚拟机占用系统的最小堆内存为128M
 -Xmx512m:虚拟机占用系统的最大堆内存为512M
 -XX:PermSize=128m:最小堆大小(最小永久保存区域)。一般报内存不足时,都是说这个太小,堆空间剩余小于5%就会警告,建议把这个稍微设大一点,不过要视自己机器内存大小来设置。
 -XX:MaxPermSize=256m:最大堆大小(最大永久保存区域)。这个也适当大些。
 注意: -Xmx512M的5%为25.6M,理论上要求-Xmx的数值与-XX:MaxPermSize必须大于25.6M.
 所以,按照上面的方法适当进行修改,下面是我电脑上配置的:
 -vmargs
 -Xms128m
 -Xmx512m
 -XX:PermSize=64m
 -XX:MaxPermSize=128m
 -XX:ReservedCodeCacheSize=64m

如何监视jvm内存?使用jvisualvm


        不能一味加内存解决问题,最好定期检查一下程序对内存的消耗,以避免潜 在的内存溢出。建议大家使用jvisualvm来监控JVM。(JDK自带,命令行直接打jvisualvm即可),下面是工具截图,参考自:

http://my.oschina.net/zmen/blog/108989


### 回答1: 飞歌GS2屏幕出现英文"java.lang.out of memory error",意思是"内存不足错误"。这种错误通常发生在手机的操作系统无法分配足够的内存来运行应用程序时。 当一个应用程序需要大量的内存资源时,如果手机的内存不足,就会出现这个错误。这种情况下,手机屏幕上会弹出一条错误信息,并且应用程序可能会崩溃或表现出其他异常行为。 要解决这个问题,我们可以尝试以下几种方法: 1. 清理手机内存:关闭一些不必要的后台应用程序,清理缓存数据和临时文件,以释放一些内存空间。 2. 重启手机:通过重启手机,可以清理掉一些占用内存的后台进程,从而释放更多的可用内存。 3. 卸载不需要的应用程序:如果手机内存空间非常有限,可以考虑卸载一些不常用或不必要的应用程序,以释放更多空间。 4. 限制后台应用程序:在手机的设置中,可以设置一些应用程序在后台运行时的限制,以减少内存的消耗。 5. 更新或升级应用程序:有时,这个错误可能是由于应用程序的bug或不兼容性引起的。更新或升级应用程序到最新版本可能会修复这些问题。 总之,当飞歌GS2屏幕上出现"java.lang.out of memory error"错误时,我们可以尝试一些方法来释放内存或修复应用程序相关问题,以解决这个问题。 ### 回答2: 当飞歌GS2手机屏幕出现英文"java.lang.out of memory error"时,这意味着手机的内存不足以执行当前的操作或运行应用程序。在Android系统中,每个应用程序都被分配了一定的内存空间来运行。当一个应用程序需要更多的内存来继续运行,而系统内存已经用尽时,就会出现"out of memory"错误。 这种错误可能发生在以下情况下: 1. 运行过多应用程序或后台进程:如果同时运行了许多内存占用较高的应用程序或后台进程,会导致内存不足,从而出现此错误。关闭一些不必要的应用程序或清理后台进程可以释放一些内存空间。 2. 单个应用程序内存泄漏:有时候某个应用程序可能会出现内存泄漏问题,导致内存持续被占用而无法释放,最终导致内存耗尽。在这种情况下,卸载或更新该应用程序可能是解决问题的办法。 为了解决这个问题,可以尝试以下解决方法: 1. 关闭一些不必要的应用程序或后台进程,以释放一些内存空间。 2. 尝试重启手机,这样可以清理内存并重新启动操作系统。 3. 卸载或更新最近安装的应用程序,特别是那些可能会导致内存泄漏的应用程序。 4. 如果问题仍然存在,考虑将手机的储存空间扩展,可以使用外部存储卡或者清理一些不必要的文件来释放内存。 如果以上方法都不能解决问题,建议联系手机制造商或售后服务中心,以获取更专业的技术支持和帮助。 ### 回答3: 飞歌GS2是一款智能手机,出现"java.lang.Out of Memory Error"错误可能是由于手机内存不足导致的。这种错误通常在手机运行内存较小,同时运行多个应用程序或者特别占用内存的应用程序时出现。 当手机内存不足时,可能导致正在运行的应用程序无法正常加载和运行,从而引发该错误。这个错误信息提示了一个Java语言的内存溢出错误,意味着手机无法再为正在运行的应用程序分配足够的内存空间。 为了解决这个问题,你可以尝试以下方法: 1. 关闭正在运行的应用程序:通过长按Home键或者使用任务管理器关闭一些已经打开但未使用的应用程序,以释放内存空间。 2. 清理缓存:进入手机设置,找到应用程序管理器,选择需要清理缓存的应用程序,清理掉缓存文件可以释放一部分内存。 3. 卸载不常用的应用程序:如果你的手机上安装了很多不常用的应用程序,可以考虑卸载掉一些以释放内存空间。 4. 避免同时运行多个占用内存的应用程序:尽量避免同时运行多个占用内存较大的应用程序,可以尝试轮流使用这些应用程序。 5. 清除手机垃圾文件:使用一些手机清理应用程序帮助清除手机中的垃圾文件,以释放内存空间。 如果以上方法无法解决问题,那么可能需要考虑将手机进行出厂恢复设置,但请注意备份你的重要数据。如果问题仍然存在,可能需要联系飞歌的技术支持团队或者到售后服务中心进行进一步的处理和解决。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值