如何解决java.lang.OutOfMemoryError
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决java.lang.OutOfMemoryError相关的知识,希望对你有一定的参考价值。
java.lang.OutOfMemoryError异常解决方法原因:
常见的有以下几种:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小;
常见错误提示:
1.tomcat:java.lang.OutOfMemoryError: PermGen space
2.tomcat:java.lang.OutOfMemoryError: Java heap space
3.weblogic:Root cause of ServletException java.lang.OutOfMemoryError
4.resin:java.lang.OutOfMemoryError
5.java:java.lang.OutOfMemoryError
解决;
1.应用服务器提示错误的解决:
把启动参数内存值设置足够大。
2.Java代码导致错误的解决:
重点排查以下几点:
1)检查代码中是否有死循环或递归调用。
2)检查是否有大循环重复产生新对象实体。
3)检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
4 )检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。 参考技术A Java常见的几种内存溢出及解决方法【情况一】: java.lang.OutOfMemoryError:Javaheapspace:这种是java堆内存不够,一个原因是真不够(如递归的层数太多等),另一个原因是程序中有死循环; 如果是java堆内存不够的话,可以通过调整JVM下面的配
由于在android中使用了太多背景,如何在内存已满时清除内存
【中文标题】由于在android中使用了太多背景,如何在内存已满时清除内存【英文标题】:how to clear memory when it is full because of using too many backgrounds in android 【发布时间】:2013-11-27 14:37:20 【问题描述】:大家好,我是 android 新手,一周前我在此链接中发布了一个问题,基本上说我在为我的活动使用很多不同的背景时遇到了 java.lang.outofmemory 错误。 why am I getting errors when I use different backgrounds in xml
因此,作为一名新开发人员,我已经搜索并搜索了有关如何在我从活动中清除内存的解决方案,但没有一个是清晰或准确的。然后我偶然发现了这个网站http://androidactivity.wordpress.com/2011/09/24/solution-for-outofmemoryerror-bitmap-size-exceeds-vm-budget/
它准确地描述了我正在经历的事情,除了他们使用 10 个活动,而我只使用 4 个。但是,当我实现他的代码时,我的项目最终出现了空指针异常,在摆弄他的代码后,我最终回到了我从同样的内存不足错误开始。 因此,任何人都可以指导我找到可以向我展示如何拥有尽可能多的背景而又不会耗尽内存的人。或者 android 是否不会让你简单地使用超过一定数量的背景?帮忙?
【问题讨论】:
【参考方案1】:并不是说背景的数量有限制,而是您加载的每个背景图像都是作为位图加载到内存中并保存在那里直到 Activity 被销毁。如果您一个接一个地打开多个活动,则每个背景图像都需要保存在内存中,因此最终您会遇到内存不足的异常。
如果你设置了一个大的背景图片,你也会在ui线程上遇到一些阻塞,而图片被加载到内存中。
对我有用的一种解决方法是使用图像加载器。这会从 ui 线程解码图像,将其缓存在磁盘上,将其加载到内存中,如果内存不足,则会从内存中清除图像并回退到磁盘缓存。加载图像时,您可能会出现轻微的延迟/淡入,但这在视觉上并没有那么糟糕,并且当加载一次时,如果您返回该活动,将立即加载。
查看 Picaso Picasso,它真的很容易实现和很棒的 api 或 Universal Image Loader。
我的布局都是RelativeLayouts,第一个孩子(将在所有其他视图后面)是一个ImageView,它的scaleType centercrop 和宽度和高度设置为match_parent。当每个活动加载(onCreate)时,只需在布局中获取对 imageview 的引用,并使用您选择的 ImageLoader 设置所需的背景图像。
另一种选择是在您的资源中拥有多个背景图像副本,每个副本都调整大小以完全适合您选择的分辨率(drawable-mdpi/-hdpi/-xhdpi 等)。这样,您可以确保您永远不会加载比您需要显示的更大的图像,并且您的应用程序在内存消耗方面将更加宽容。
【讨论】:
以上是关于如何解决java.lang.OutOfMemoryError的主要内容,如果未能解决你的问题,请参考以下文章
JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别
JVM虚拟机选项:Xms Xmx PermSize MaxPermSize区别