注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

程序员小站

J2EE丨Spring | JVM | Scala

 
 
 

日志

 
 

java内存区域与内存溢出异常  

2012-02-17 18:31:30|  分类: JVM |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

1.运行时数据区域

1.1 程序计数器

记录当前线程所执行字节码的行号指示器。线程私有,占有很小一块内存,唯一一块没有OutOfMemoryError的区域。

1.2  java虚拟机栈

线程私有,生命周期与线程一样,描述的是Java方法执行的区域:每个方法被执行就回生成一个栈帧(Stack Frame)用于存储局部变量表,操作栈,动态链接,方法出口等信息。

局部变量表存储编译器可知的各种基本数据类型(boolean byte char short int float long double)对象引用(reference)和returnAddress类型,其中floatdouble占用两个局部变量空间Slot,其余占用一个。

两种异常:线程请求的深度大于虚拟机允许深度,StackOverFlowError

    无法申请到足够的空间:OutOfMemoryError

1.3本地方法栈

与虚拟机栈的作用相同,只不过执行的是本地方法NativeHotSpotjava虚拟机栈和本地方法栈合二为一。

无法申请到足够的空间:OutOfMemoryError  unable to cteate new native thread

1.4 java堆(java Heap

是内存中占用最大的一块,被所有线程共享。所有的对象实例和数组都在这上面分配,但是随着JIT编译器的发展和逃逸技术的成熟等,也不是那么绝对了。

Java堆是内存回收的主要区域,也成为“GC堆”(Garbage Collected Heap

如果如法申请到足够的空间抛出OutOfMemoryError : Java heap space

1.5 方法区

用来存储虚拟机加载的类信息,常量,静态常量,即时编译器编译后的代码等。也就是平时大家说的永久代,本质上并不等价,或者说使用永久代实现方法区而已。一般方法区内存回收成绩不令人满意。

如果如法申请到足够的空间抛出OutOfMemoryError PermGen space

1.6运行时常量池 (Runtime Constant Pool

是方法区的一部分,Class文件除了有类的版本信息、字段方法接口外,还有一项信息是常量池,用于存放编译器生成的各种字面量和符号引用,这部分信息在类加载后存放到方法区的运行时常量池中。

具有动态性,可以使用String类的intern()方法加入。

1.7直接内存

并不是虚拟机运行时数据区的一部分。JDK1.4中引入了NIO类,引入了一种基于通道与缓冲区的I/O方式,可以使用Native直接分配堆外内存,避免了再Java堆和Native堆中来回复制数据。

不会受到Java堆内存限制,但会受到机器总内存的限制。

如果如法申请到足够的空间抛出OutOfMemoryError 

 

2OutOfMemoryError异常

2.1Java堆异常

堆的最小值:-Xms -Xms20m

堆的最大值  -Xmx 如果设为一样的则可避免堆自动扩展。

年轻代大小: -Xmn

-XX+HeapDumpOnOutOfMemoryError 当内存溢出时Dump出当前的内存堆转存快照。

Eclipse中虚拟机参数设置:debug As-->open dubug dialog

java内存区域与内存溢出异常 - 湘雅之梦 - nbsp爱的天空

 

生成之后使用Eclipse Memory Analyzer 进行堆转储文件分析(需要安装MAT插件)。

2.2虚拟机栈和本地方法栈溢出

-Xss:设置每条线程的Statck大小.JDK1.5以后默认是1M,之前是256K 

抛出StackOverFlow异常:操作系统分配给每个线程的内存是有限的,机器总内存减去Xmx再减去MaxPermSize,程序计数器占内存很少忽略,剩下的内存被虚拟机栈和本地方法栈瓜分,每个线程分到的栈容量越大,分配的线程数就小。正常情况栈深度1000-2000没问题,如果是建立更多线程导致的内存溢出,在不能减少线程的情况下,只能通过减小Xmx和栈容量来换取更多线程。

2.3方法区和运行时常量池溢出

-PermSize :方法区的初始容量,默认是物理内存的1/64

-MaxPermSize :最大方法区容量。

2.4本机直接内存溢出

-XXMaxDirectMemorySize 本机直接内存大小,如果不指定,则与Xmx一样

  评论这张
 
阅读(866)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018