• 运行时数据区域:

    • 程序计数器(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. Beta 冲刺 (3/7)

    Beta 冲刺 (3/7) 队名:第三视角 组长博客链接 本次作业链接 团队部分 团队燃尽图 工作情况汇报 张扬(组长) 过去两天完成了哪些任务 文字/口头描述 参与开发关键词提醒部分 展示GitHu ...

  2. LinuxTimeLine

  3. python与sqlserver接口包pymssql

    包下载地址(对应着自己的电脑和Python的版本下载即可,我电脑是win32,Python是3.6的) https://pypi.python.org/pypi/pymssql/ 下载后我放到了d盘中 ...

  4. 学习animejs

    1.安装方式 (1)npm install animejs 2.引入 import anime from 'animejs' 3.使用 (anime({ targets: 'div', transla ...

  5. 项目配置linux上, 配置文件访问不到

    /** * 读入TXT文件 */public List<String> readFile(String pathName) { List<String> list = new ...

  6. C# 网络通信功能 同步数据交互开发

    前言 本文将使用一个Nuget公开的组件技术来实现一对多的数据通信功能,提供了一些简单的API,来方便的向服务器进行数据请求. 在visual studio 中的Nuget管理器中可以下载安装,也可以 ...

  7. php英语单词大全95

    abstract抽象的 -挨伯丝拽克特 access存取.访问 -挨克色丝 account账户 -厄靠恩特 action动作 -爱克身 activate激活 -爱克特维特 active活动的 -爱克得 ...

  8. 【开发遇到的问题】Spring Mvc使用Jackson进行json转对象时,遇到的字符串转日期的异常处理(JSON parse error: Can not deserialize value of type java.util.Date from String[)

    1.问题排查 - 项目配置 springboot 2.1 maven配置jackson - 出现的场景: 服务端通过springmvc写了一个对外的接口,查询数据中的表,表中有一个字段属性是时间戳,返 ...

  9. python txt文件常用读写操作

    文件的打开的两种方式 f = open("data.txt","r") #设置文件对象 f.close() #关闭文件 #为了方便,避免忘记close掉这个文件 ...

  10. C++学习(三十八)(C语言部分)之 排序(冒泡 选择 插入 快排)

    算法是解决一类问题的方法排序算法 根据元素大小关系排序 从小到大 从大到小冒泡 选择 插入 快排希尔排序 归并排序 堆排序 冒泡排序 从头到尾比较 每一轮将最大的数沉底 或者最小数字上浮 选择排序 1 ...