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一样
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一样
相关文章推荐
- 生成器+列表生成式,生成器可以节省内存,随时调取函数运行,以及实现多线程运行函数,__next__()和.send(参数)的区别,a,b=b,a+b其实是元祖的用法,出现异常状态用try...except StopIteration来处理
- OO中的继承分析,主要分析在编译和运行过程中子类父类的方法、字段和实例化时候在内存中分配和执行的先后,以及两个原则
- java虚拟机以及与运行原理分析
- 网页使用ie或者360打开时按F12出现程序停止运行异常的原因以及解决方案
- OO 中的继承分析:主要分析在编译和运行过程中 子类、父类 的字段和方法以及实例化时候在内存中分配 和 执行的先后,以及两个原则
- 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析
- 程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析
- Android 3.0获取互联网资源时出现异常的原因分析以及解决方案
- Android开发异常篇:运行工程出现:Connection with adb was interrupted错误提示以及解决办法
- Java虚拟机内存溢出原因分析以及解决方案
- Android JNI调用OpenCV,长时间运行内存异常,导致闪退的log分析和解决---(ReferenceTable overflow (max=1024)造成的)
- 关于C++程序运行程序是出现的this application has requested the runtime to terminate it in an unusual way. 异常分析
- Eclipse中在android项目中出现新建一个Activity后,出现整个工程的报错以及包导入以后无法运行等等情况分析。
- TomatoUSB - 挂载了/jffs/opt之后登录出现$提示符以及VI内存耗尽等各种异常
- 服务器因为其他原因打了系统补丁,导致.net2.0损坏,IIS以及运行.net2.0的程序出现异常
- MySQL 出现 java.sql.SQLException 之 Got error 28 from storage engine 问题分析以及解决方法
- java虚拟机类加载过程内存情况底层源码分析及ClassLoader讲解
- mysql 索引分类以及用途分析
- Linux内存使用情况以及内存泄露分析之工具与方法
- Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)