• 运行时数据区域:

    • 程序计数器(Program Counter Register):
      当前线程执行码行号指示器,属于线程私有内存。字节码解释器工作时就是通过调整这个计数器的值来选取下一条需要执行
      字节码指令。当执行Java代码时,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果是本地Native方法时为空,
      该区域不会出现OutOfMemmoryError错误的区域。
    • Java虚拟机栈(Java VM Stack):
      线程私有,生命周期与线程一致。其描述了Java方法执行的内存模型:每个方法执行时都会创建一个对应的栈帧(Stack Frame)
      用于存储局部变量表、操作数栈、动态链接、方法出口等信息。每一个方法从调用到执行完成的过程,就对应着一个栈帧在虚拟机
      栈中从入栈到出栈的过程。局部变量中存放了编译期可知的各种基本数据类型(64位long、double占用2个局部变量空间Slot)、
      对象引用、returnAddress类型。局部变量表所需内存空间在编译期间完成分配,当进入一个方法时,这个方法需要在帧中分配多大
      的局部变量表空间是完全确定的,在方法运行期不会改变局部变量表的大小。
      可能出现的异常:1.线程请求的栈深度大于虚拟机所允许的深度,StackOverflowError异常。2.如果虚拟机栈可以动态扩展,当扩展
      时无法申请足够的内存时,OutOfMemoryError异常。
    • 本地方法栈(Native Method Stack):
      与Java虚拟机栈相似,只是其描述的执行本地方法时内存区域,也是线程私有。
    • Java堆(Heap):线程共享,随虚拟机启动而创建,用途为存放对象实例,几乎所有的对象实例均在此处存放,是垃圾收集器工作
      的主要区域。现代收集器大都采用分代收集算法,故Java堆还可细分为:新生代和老年代,再细分为:Eden空间、From Survivor空
      间、To Survivor空间等。-Xmx -Xms调整其大小。
    • 方法区(Method Area):线程共享,存储虚拟机加载的类信息、常量、静态常量、即时编译器编译的代码等信息。
    • 运行时常量池(Runtime Constant Pool):是方法区一部分
    • 直接内存(Direct Memory):NIO直接分配堆外内存。
  • 虚拟机对象
    • 对象的创建:
      内存分配:虚拟机遇到一条new指令时,首先先去检查指令参数是否能在常量池中定位到一个类的符号引用,并且检查这个符号引用
      代表的类是否已被加载、解析、初始化。如果没有,则执行相应的类加载过程。在类加载检查通过后,接下来虚拟机将为新对象分配内
      存,对象所需内存的大小在类加载完成后便可完全确定。虚拟机为对象分配内存空间策略有两种:1.若果内存空间绝对规整,则采用“指
      针碰撞(Bump The Pointer)”,使用过的内存放在一侧,未使用过的内存放在另一侧,中间放着一个指针作为分界点的指示器,分配时
      只需将指针想空闲区域移动所需大小的区域即可完成分配。2.若果内存空间是不规整的,则需要采用“空闲列表(Free List)”,将空闲内
      存空间记录下来,每次分配时需要检查空闲列表来分配所需内存大小。选择哪种分配策略需要根据内存时否规整决定,而Java堆是否规
      整又由所采用的垃圾收集器是否带有压缩整理功能所决定的。防止内存分配过程中的并发问题:1.同步,CAS失败重试方案。2.本地线程
      缓冲(TLAB),线程分配内存隔离。
      内存初始化:内存分配完成后,将内存初始化为零值。
      对象设置:对象头(Object Head)
    • 对象的内存布局:对象头(Object Head)、实例数据(Instance Data)、对齐填充(Padding)
      对象头:1.存储对象自身运行时数据,哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时间戳。
                       2.类型指针,指向该对象属于哪个类。
    • 对象的访问:栈上reference来操作堆上的具体对象。访问方式有两种:1.句柄 2.直接引用

第二章 Java内存区域与内存溢出异常的更多相关文章

  1. <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记

    Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...

  2. 深入理解java虚拟机-第二章:java内存区域与内存泄露异常

    2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...

  3. 虚拟机--第二章java内存区域与内存溢出异常--(抄书)

    这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第二章java内存区域与内存溢出 ...

  4. 深入理解java虚拟机-第二章

    第2章 Java内存区域与内存溢出异常 运行数据区域 1.程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 2.J ...

  5. JAVA基础第二章-java三大特性:封装、继承、多态

    业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...

  6. java入门第二章——java编程基础

    习题 一.填空题 (p)1.java中的程序代码都必须在一个类中定义,类使用(class)关键字来定义. (p)2.布尔常量即布尔类型的两个值,分别是(true)和(false) (p18)3.jav ...

  7. 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常

    第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域  

  8. 《深入理解Java虚拟机》笔记--第二章、Java内存区域与内存溢出异常

    Java程序员把内存的控制权交给了Java虚拟机.在Java虚拟机内存管理机制的帮助下,程序员不再需要为每一个new操作写对应的delete/free代码,而且不容易出现内存泄露和溢出. 虚拟机在执行 ...

  9. 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常

    2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...

  10. 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略

    身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...

随机推荐

  1. Json 网络传递解析异常

    在项目中碰到一个bug,A项目请求B项目,获取到的Json无法解析,B项目封装的Json,在项目内部可以正常解析,问题并不是Json 解析的错误,而是实体Bean中有数组类型的字段;解决办法就是对封装 ...

  2. 除了Udacity,全球最聪明的那群人还上哪些网站?

    01. ***,与世界相连 WikiWand——打开维基百科的新方式 http://www.wikiwand.com/ InsightfulQuestions(subreddit)——跨越界限的智力讨 ...

  3. 指导手册03:Hadoop基础操作

    指导手册03:Hadoop基础操作 Part 1:查看Hadoop集群的基本信息1.查询存储系统信息(1)在WEB浏览器的地址栏输入http://master:50070/ 请查看自己的Hadoop集 ...

  4. Python编程--类的分析

    一.类的概念 python是面向对象的编程语言,详细来说,我们把一类相同的事物叫做类,其中用相同的属性(其实就是变量描述),里面封装了相同的方法,比如:汽车是一个类,它包括价格.品牌等属性.那么我们如 ...

  5. TensorFlow函数:tf.random_shuffle

    tf.random_shuffle 函数 random_shuffle( value, seed=None, name=None ) 定义在:tensorflow/python/ops/random_ ...

  6. TP5 强制下载PDF

    为什么叫强制下载  因为你点击你的PDF文件路劲的话   浏览器是默认字网页上打开,而不是下载 我们需要做的就是 修改header头信息  使其变为下载状态 //下载PDF public functi ...

  7. Python基础+模块、异常

    date:2018414+2018415 day1+2 一.python基础 #coding=utf-8 #注释 #算数运算 +(加)  -(减)  *(乘)  /(除)  //(取整)  %(取余) ...

  8. Ubuntu16.04的sublime text3 的安装教程

    1. sublime text3的官网位置 https://www.sublimetext.com/3 2.apt安装方式 1.  安装 GPG -key: wget -qO - https://do ...

  9. hsdfz -- 6.17 -- day2

    今日依旧康复…… 当天晚上被老师拉去小吃街了,晚上回来精力憔悴,所以并没有当天写 反正就惨,因为估错复杂度,期望得分100分最后结果20分 (我的复杂度是nlog^2n的,正确性有保障,稳! 事后:还 ...

  10. JVM的基本结构及其各部分详解(二)

    3.2 栈帧组成之操作数栈 操作数栈是栈帧的主要内容之一,它主要用于保存计算过程中的中间结果,同时作为计算过程中变量临时的存储空间. 操作数栈也是一个先进后出的数据结构,只支持入栈和出栈两种操作,许多 ...