您的位置:首页 > 编程语言 > Java开发

java虚拟机运行时的内存分类以及出现异常分析

2017-12-02 12:11 363 查看
来源:https://my.oschina.net/u/566829/blog/62249

 

java虚拟机所管理的内存包括以下几个运行时数据区域: 

方法区(Method Area):线程共享的,存放已被虚拟机记载的类信息、常量、静态变量等数据。“永久代(Permanent Generation)” 

虚拟机栈(Virtual Machine Stacks):线程私有,生命周期跟线程相同;java方法执行时创建栈帧存放局部变量表(各种基本数据类型、对象引用等)、操作数栈、动态链接等信息。 

本地方法栈(Native Method Stack) 

堆(Heap):线程共享的;存放对象实例;垃圾收集器管理的主要区域即GC堆。 

程序计数器(Program Counter Register):当前线程所执行的字节码的行号指示器。Java虚拟机多线程是通过线程轮流切换并分配处理器执行时间的方式来实现的,所以线程需要一个独立程序计数器。 

OutOfMemoryError异常 

1、Java堆(heap)溢出 

java HeapOOM -Xms20m -Xmx20m -XX:+HeapDumpOnOutOfMemoryError 

(将堆的最小值-Xms与最大值-Xmx参数设置为一样可以避免堆自动扩展;-XX:+HeapDumpOnOutOfMemoryError出现内存溢出异常时Dump出当前的内存堆转储快照以分析) 
Java堆内存的OOM异常是实际应用中最常见的内存溢出溢出情况。异常信息:java.lang.OutOfMemoryError: Java heap space 

解决简答思路: 

       内存映像分析工具---内存泄漏(Memory Leak)or内存溢出(Memory Overflow)---

if it is Memory Leak(泄漏对象到GC Roots的引用链),找到泄露对象是通过怎样的路径与GC Roots相关联并导致垃圾收集器无法自动回收

else Memory Overflow 
       (内存对象还存活,检查虚拟机的堆参数-Xmx与-Xms,与机器物理内存对比是否可以调大) 

2.虚拟机栈(VM stack)和本地方法栈(Native Method stack)溢出 

-Xoss参数(设置本地方法栈大小) -Xss参数(设置栈容量) HotSpot虚拟机中并不区分本地方法栈和虚拟机栈 

异常: 

    栈深度(线程请求的)>虚拟机所允许的最大深度  : StackOverflowError 

    虚拟机在扩展栈时无法申请到足够的内存空间    : OutOfMemoryError 

当栈空间无法继续分配时,本质上只是对同一件事情的两种描述 

java JavaVMStackSOF -Xss128k 
在单个线程下,无论是那种异常,都抛出下面异常: 
异常信息:java.lang.StackOverflowError 
在多线程下,OOM异常与栈空间是否足够大无关,而是每个线程分配内存越大,反而容易常生OOM异常(OS分配内存给线程有限,分配到大栈容量越大,建立线程越小,建立 
线程的时候越容易将剩下的内存耗尽)。开发多线程应用时建立过多多线程导致OOM异常,在不能减少线程数或更换64位虚拟机的情况下,减少最大堆和减少栈容量来换取更多线程。 

3、运行时常量池(Runtime constant Pool)溢出 

常量池分配在方法区(method Area)内, -XX:PermSize和-XX:MaxPermSize控制方法区大小,间接控制常量池。 

java RuntimeConstantPoolOOM -XX:PermSize=10M -XX:MaxPermSize=10M 

异常信息:java.lang.OutOfMemoryError: PermGen space 

4、方法区溢出

方法区用于存放Class的相关信息,如类名、访问修饰符、常量池、字段描述、方法描述等 

异常信息:java.lang.OutOfMemoryError: PermGen space 

5、本机直接内存溢出

通过-XX:MaxDirectMemorySize制定,如果不指定,则默认与Java堆最大值-Xms一样
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐