码迷,mamicode.com
首页 > 编程语言 > 详细

Java 出现内存溢出的定位以及解决方案

时间:2017-08-01 22:58:47      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:ring   color   glib   java   net   创建线程   sdn   targe   rms   

在上一节中Java虚拟机内存分布   说了Java虚拟机中分为五个区域,而且也知道了在Java程序计数器区域不会出现OOM(OutOfMemeryError),那么以下就对除了程序计数器以外的四个区域出现OOM的原理以及解决方案进行解说。


1.Java虚拟机栈与本地方法栈

栈的大小控制參数时 -Xss。

Java虚拟机在栈中定义了两种异常,StrackOverFlowError和OutOfMemeryError。当请求栈的深度大于java虚拟机所同意的最大深度则抛出StrackOverFlowError;假设Java虚拟机在栈扩展时。没有申请到足够的空间时,则抛出OutOfMemeryError。

StrackOverFlowError:Java虚拟机在执行中,调用方法时,都要创建栈帧,当栈的空间不够时就会产生StrackOverFlowError。那么相应的解决方法就仅仅能是调节-Xss參数,或者降低方法的调用,减小栈帧的大小两种方式。

OutOfMemeryError:在栈上出现OOM通常是多线程的情形。

首先咋们解析一下栈使用的空间能够有多大,拿32位操作系统来举例。 最大内存2G - Xmx(最大堆容量)- MaxPermSize(最慷慨法区容量)- 虚拟机本身耗费的内存和程序计数器使用的内存。

剩下的内存就是栈能够使用的空间,当Xss配置的參数一定时,那么在不断的创建线程过程中。遇到不能申请到栈空间的时候就会抛出OOM。那么相应的解决方案就是,调节-Xss參数减少栈大小,或者调节-Xmx以及MaxPermSize的大小扩大留给栈的空间。


2.方法区内存溢出

方法区的大小通过-PermSize和-MaxPermSize控制。


由于类常量和执行时常量也存储在方法区中,所以执行时常量过多也可导致方法区的OOM,可是没有直接控制常量池大小的參数,仅仅能通过-PermSize和-MaxPermSize来间接控制。

在Spring以及Hibernate。Mybatis中都会使用GeneratedConstructorAccessor、动态代理以及CGLib字节码增强技术的等动态生成类,那么就须要强大的方法区来支撑。


3.堆内存的溢出

堆内存的溢出比較复杂,须要调节GC等多种參数,我们在后面的章节中会进行解说。


Java 出现内存溢出的定位以及解决方案

标签:ring   color   glib   java   net   创建线程   sdn   targe   rms   

原文地址:http://www.cnblogs.com/zhchoutai/p/7270886.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!