必威体育Betway必威体育官网
当前位置:首页 > IT技术

内存溢出

时间:2019-10-07 07:12:14来源:IT技术作者:seo实验室小编阅读:72次「手机版」
 

内存溢出

#什么是内存溢出

内存溢出是指应用系统中存在无法回收的内存或者使用的内存过多,最终使得程序运行所需要的内存大于JVM所提供的最大内存。

#java如何管理内存

java的内存管理就是对象的分配和释放问题。在java中,内存的分配是由程序来完成的,而内存的释放是由垃圾收集器(Garbage Collection,GC)完成的,开发者不需要通过调用GC来释放内存,因为不同的JVM实现者可能使用不同的算法管理GC,有的是内存使用达到一定程度时,GC才开始工作,也有定时执行的,有的是中断式执行GC。

#GC回收机制

GC只能回收无用并且不再被其他对象引用的那些对象所占用的空间。java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。

#内存溢出的原因

常见的有以下几种:

①内存中加载的数据量过于庞大,如一次从数据库取出过多数据

②集合类中有对对象的引用,使用完后未清空,使得JVM不能回收

代码中存在死循环或循环中产生大量重复的对象实体

④使用的第三方软件中存在BUG

⑤启动参数内存设定值过小

#内存溢出的解决方式

①修改JVM启动参数,直接增加内存。<物理方式>

容器为tomcat:修改catalina.BAT

set JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%

下面加

JAVA_OPTS='-Xms512m -Xmx1024m'
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=64M -XX:MaxPermSize=256m"

其中 JAVA_OPTS='-Xms512m -Xmx1024m' 是设置Tomcat使用的内存的大小.

-XX:PermSize=64M -XX:MaxPermSize=256m 指定类空间(用于加载类)的内存大小

②检查错误日志,查看“OutOfMemMemory”错误前是否有其他的异常或者错误。

--java.lang.outofmemoryERROR: ......java heap space....<堆栈溢出>
--java.lang.OutOfMemoryError: GC overhead limit exceeded 
JDK6新增错误类型,当GC为释放很小空间占用大量时间时抛出;一般是因为堆太小,导致异常的原因,没有足够的内存。 
  【解决方案】: 
  1、查看系统是否有使用大内存的代码或死循环; 
  2、通过添加JVM配置,来限制使用内存: 
  < jvm-arg>-XX:-UseGCOverheadLimit< /jvm-arg> 
--java.lang.OutOfMemoryError: PermGen space:这种是P区内存不够,可通过调整JVM的配置: 
  < jvm-arg>-XX:MaxPermSize=128m< /jvm-arg> 
  < jvm-arg>-XXermSize=128m< /jvm-arg> 
  【注】: 
  JVM的Perm区主要用于存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space,这个区域成为年老代,GC在主程序运行期间不会对年老区进行清理,默认是64M大小,当程序需要加载的对象比较多时,超过64M就会报这部分内存溢出了,需要加大内存分配,一般128m足够。 

③对代码进行走查和分析,找出可能发生内存溢出的位置。重点排查一下几点:

–检查代码中是否有死循环或递归调用

–检查是否有大循环重复产生新对象实体

–检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。

–检查List、Map等集合对象是否有使用完后,未清除的问题。List、Map等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

④使用内存查看工具动态查看内存使用情况:Optimizeit profiler、JProbe Profiler、JinSight和Java1.5的jconsole等。

一般来说,一个正常的系统在其启动完成后其内存的占用量是基本稳定的,而不应该是无限制的增长的。持续地观察系统运行时使用的内存的大小,可以看到在内存使用监控窗口中是基本规则的锯齿形的图线,如果内存的大小持续地增长,则说明系统存在内存泄漏问题。

相关阅读

笔记本电脑如何选购并安装内存条

1、首先你要查看你的原先内存条的型号、代数。现在在内存分为|DDR、DDR2、DDR3的代数。如今一般的内存都是三代,即DDR3,而DDR3与DDR

Windriver PCI大内存分配说明

在使用windriver进行驱动开发时,不可避免地会使用到内存分配的功能,这里先介绍下jungo公司的技术手册 https://www.jungo.com/st/su

栈溢出例子理解

背景:最近在看一些教学视频,然后主讲人敲了一段栈溢出的代码。我当场蒙蔽了-。- ! 而且他也没有细讲原理,最为一名爱探险星人,我决定

文本溢出隐藏

1、单行文本溢出隐藏{overflow : hidden;text-overflow : ellipsis;white-space : nowrap;}2、多行文本溢出{overflow : hidden;t

Java中关于内存泄漏出现的原因汇总及如何避免内存泄漏

来先看看下面的例子,为什么会发生内存泄漏。下面这个例子中,A对象引用B对象,A对象的生命周期(t1-t4)比B对象的生命周期(t2-t3)长的多。当

分享到:

栏目导航

推荐阅读

热门阅读