`
吖龙Sam
  • 浏览: 20336 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

02Java内存区域与内存溢出异常-2运行时数据区域

阅读更多

2.2 运行时数据区域

根据Java虚拟机规范,Java虚拟机所管理的内存包含以下几个运行时数据区域:

程序计数器,虚拟机栈,本地方法栈,Java堆,方法区。

线程共享:Java堆,方法区

线程私有:程序计数器,虚拟机栈,本地方法栈

 

 1)程序计数器

  1-程序计数器是一块较小的内存,可以看作是当前线程所执行的字节码的行号指示器

  2-字节码解释器在工作时,就是通过改变这个计数器的值来选取下一条需要执行的字节码指令

  3-每条线程都需要有一个独立的程序计数器,互不影响,独立存储,这类区域的内存称为“线程私有”的内存

  4-此内存区域是唯一在Java虚拟机规范中没有规定任何OOM情况的区域

 

 2)Java虚拟机栈

  1-与程序计数器一样,是线程私有的,它的生命周期和线程相同

  2-虚拟机栈描述的是Java方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧用于存储局部变量表,操作数栈,动态链接,方法出口信息等

  3-每一个方法从调用到执行结束的过程,都会对应着一个栈帧在虚拟机栈中的入栈和出栈的过程

  4-Java虚拟机规范中,对这个区域规定了两种异常状态:

  -StackOverflowError异常:

  如果线程请求的栈深度超过虚拟机所允许的深度,则会抛出这个异常

  -OutOfMemoryError异常:

  如果虚拟机栈可以动态扩展,如果扩展时无法申请到足够的内存,则会抛出这个异常

 

 3)本地方法栈

  1-本地方法栈的作用和虚拟机栈是相似的,它们之间的区别是,虚拟机栈是为Java方法服务,而本地方法栈为虚拟机使用到Native方法服务

  2-sun HotSpot虚拟机把虚拟机栈和本地方法栈二合为一

  3-本地方法栈也会抛出:

  StackOverflowError

  OutOfMemoryError

 

 4)Java堆

  1-Java堆是Java虚拟机所管理的内存中最大的一块,是线程共享的一块区域

  2-此区域的唯一目的就是存放对象实例

  3-Java堆还可以细分为:新生代和老年代;再细一点还可以分为:Eden空间,From Survior空间,To Survivor空间

  4-根据Java虚拟机规范,Java堆可以处于物理上不连续的内存空间中,主要逻辑上是连续的即可;在实现上,可以实现成固定大小,也可以实现成可扩展

  5-如果堆中没有内存完成实例分配,并且无法再扩展,则会抛出:

  OutOfMemoryError

 

 5)方法区

  1-方法区与Java堆一样,是线程共享的内存区域

  2-它用来存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等

  3-在HotSpot虚拟机上的开发者,常常称这块为“永久代”

  4-根据Java虚拟机规范,方法区可以是不连续的物理内存,可以固定大小或者可扩展,还可以选择不实现垃圾收集

  5-当方法区无法满足内存分配时,则会抛出:

  OutOfMemoryError

 

 6)运行时常量池(方法区的一部分)

  1-方法区的一部分

  2-Class文件除了有类的版本,字段,方法,接口等描述信息外,还有一个项信息就是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容将在类加载之后存放在方法区的运行时常量池中

  3-对于方法区的运行时常量池,虚拟机没有做任何细节上的要求,一般来说,除了保存Class文件中描述的符号引用外,还会保存翻译出来的直接引用

  2-当常量池无法在申请到内存时,则会抛出:

  OutOfMemoryError

 

 7)直接内存

  1-不是虚拟机运行时数据的一部分,也不是Java虚拟机规范中定义的内存区域。

  2-但是这部分内存比较频繁被使用,而且会导致OOM异常

  3-直接内存分配不受Java堆大小的限制,但是既然是内存,肯定还是会受到本机总内存大小与物理寻址空间的限制

 

分享到:
评论

相关推荐

    Tomcat内存溢出的三种情况及解决办法分析

    Tomcat内存溢出的三种情况及解决办法分析 Tomcat内存溢出的原因 在生产环境中tomcat内存设置不好很容易出现内存溢出。造成内存原因是不一样的,当然处理方式也不一样。 这里根据平时遇到的情况和相关资料进行一个...

    深入理解JVM内存结构及运行原理全套视频加资料.txt

     第28讲 Java内存区域-直接内存和运行时常量池 00:15:53  第29讲 对象在内存中的布局-对象的创建 00:21:19  第30讲 探究对象的结构 00:13:47  第31讲 深入理解对象的访问定位 00:08:01  第32讲 垃圾回收-...

    深入理解Java虚拟机视频教程(jvm性能调优+内存模型+虚拟机原理)视频教程

    第28节Java内存区域-直接内存和运行时常量池00:15:53分钟 | 第29节对象在内存中的布局-对象的创建00:21:19分钟 | 第30节探究对象的结构00:13:47分钟 | 第31节深入理解对象的访问定位00:08:01分钟 | 第32节垃圾...

    深入理解_Java_虚拟机 JVM_高级特性与最佳实践

    第2章 Java内存区域与内存溢出异常 / 24 2.1 概述 / 24 2.2 运行时数据区域 / 25 2.2.1 程序计数器 / 25 2.2.2 Java虚拟机栈 / 26 2.2.3 本地方法栈 / 27 2.2.4 Java堆 / 27 2.2.5 方法区 / 28 2.2.6 运行...

    Java虚拟机

    第2章 Java内存区域与内存溢出异常 2.1 概述 2.2 运行时数据区域 2.2.1 程序计数器 2.2.2 Java虚拟机栈 2.2.3 本地方法栈 2.2.4 Java堆 2.2.5 方法区 2.2.6 运行时常量池 2.2.7 直接内存 2.3 HotSpot...

    Java常见面试问题整理.docx

    直接内存:不受JVM GC管理,直接内存并不是虚拟机运行时数据区的一部分,也不是Java 虚拟机规范中定义的内存区域。在JDK1.4 中新加入了NIO(New Input/Output)类,引入了一种基于通道(Channel)与缓冲区(Buffer)的I/...

    java堆栈的区别 -- 详解

    堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。堆的大小受限于计算机系统中有效的虚拟内存。由此可见,...

    java8rt.jar源码-JVM:学习JVM

    第2章:java内存模型和内存溢出异常 1.运行时数据区域 1.程序计数器:线程私有 2.java虚拟机栈:线程私有,虚拟机栈描述的是java方法执行的内存模型:每个方法在执行的时候都会创建一个栈帧,存储局部变量表、操作数...

    java 面试题 总结

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 6、说出Servlet的生命周期,并说出Servlet和CGI的区别。 Servlet被服务器实例化后,容器运行其init方法,...

    超级有影响力霸气的Java面试题大全文档

    java编译器要求方法必须声明抛出可能发生的非运行时异常,但是并不要求必须声明抛出未被捕获的运行时异常。 9、说出Servlet的生命周期,并说出Servlet和CGI的区别。  Servlet被服务器实例化后,容器运行其init方法...

    C#微软培训资料

    2.2 公用语言运行时环境与公用语言规范.13 2.3 开 发 工 具 .17 2.4 小 结 .19 第三章 编写第一个应用程序 .20 3.1 Welcome 程序 .20 3.2 代 码 分 析 .20 3.3 运 行 程 序 .23 .4 添 加 注 释 .25 ...

Global site tag (gtag.js) - Google Analytics