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

- 程序计数器(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内存区域与内存溢出异常的更多相关文章
- <<深入Java虚拟机>>-第二章-Java内存区域-学习笔记
Java运行时内存区域 Java虚拟机在运行Java程序的时候会将它所管理的内存区域划分为多个不同的区域.每个区域都有自己的用途,创建以及销毁的时间.有的随着虚拟机的启动而存在,有的则是依赖用户线程来 ...
- 深入理解java虚拟机-第二章:java内存区域与内存泄露异常
2.1概述: java将内存的管理(主要是回收工作),交由jvm管理,确实很省事,但是一点jvm因内存出现问题,排查起来将会很困难,为了能够成为独当一面的大牛呢,自然要了解vm是怎么去使用内存的. 2 ...
- 虚拟机--第二章java内存区域与内存溢出异常--(抄书)
这是本人阅读周志明老师的<深入理解Java虚拟机>第二版抄写的,有很多省略,不适合直接阅读,需要阅读请出门左转淘宝,右转京东,支持周老师(侵权请联系删除) 第二章java内存区域与内存溢出 ...
- 深入理解java虚拟机-第二章
第2章 Java内存区域与内存溢出异常 运行数据区域 1.程序计数器(Program Counter Register) 是一块较小的内存空间,它可以看作是当前线程所执行的字节码的行号指示器. 2.J ...
- JAVA基础第二章-java三大特性:封装、继承、多态
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- java入门第二章——java编程基础
习题 一.填空题 (p)1.java中的程序代码都必须在一个类中定义,类使用(class)关键字来定义. (p)2.布尔常量即布尔类型的两个值,分别是(true)和(false) (p18)3.jav ...
- 《深入理解java虚拟机》第二章 Java内存区域与内存溢出异常
第二章 Java内存区域与内存溢出异常 2.2 运行时数据区域
- 《深入理解Java虚拟机》笔记--第二章、Java内存区域与内存溢出异常
Java程序员把内存的控制权交给了Java虚拟机.在Java虚拟机内存管理机制的帮助下,程序员不再需要为每一个new操作写对应的delete/free代码,而且不容易出现内存泄露和溢出. 虚拟机在执行 ...
- 《深入理解Java虚拟机》-----第2章 Java内存区域与内存溢出异常
2.1 概述 对于从事C.C++程序开发的开发人员来说,在内存管理领域,他们即是拥有最高权力的皇帝又是执行最基础工作的劳动人民——拥有每一个对象的“所有权”,又担负着每一个对象生命开始到终结的维护责任 ...
- 深入学习重点分析java基础---第一章:深入理解jvm(java虚拟机) 第一节 java内存模型及gc策略
身为一个java程序员如果只会使用而不知原理称其为初级java程序员,知晓原理而升中级.融会贯通则为高级 作为有一个有技术追求的人,应当利用业余时间及零碎时间了解原理 近期在看深入理解java虚拟机 ...
随机推荐
- Python *Mix_w2
1.循环: 执行流程: 1. 判断条件是否为真. 如果真. 执行代码块 2. 再次判断条件是否为真...... 3. 当条件为假.执行else 跳出循环. 循环结束. while 条件: 代码块(又叫 ...
- 同时使用n和nvm踩到的坑
平时在公司的时候,一直只使用一个node版本.这两天想多了解下node的新版本,使用tj大神的 n 包管理工具来安装node包. 安装过程中一直难以容忍过慢的包下载速度,于是根据日志的描述直接把包下载 ...
- tensorFlow(一)相关重要函数理解
1.函数及参数:tf.nn.conv2d conv2d( input, filter, strides, padding, use_cudnn_on_gpu=True, data_format='NH ...
- [Leetcode 134]汽车加油站 Gas Station (环形)
[题目] There are N gas stations along a circular route, where the amount of gas at station i is gas[i] ...
- 王者荣耀交流协会第5次Scrum立会
开会时间:2017年10月31日下午18:00-18:31 共计31分钟 开会地点:一食堂二楼靠近窗户倒数第四排 今日完成工作进度: 王超同学完成了将生成饼状图原型整合到程序中 立会内容: 添加了新 ...
- SpringBoot下如何配置实现跨域请求?
一.什么是跨域请求? 跨域请求,就是说浏览器在执行脚本文件的ajax请求时,脚本文件所在的服务地址和请求的服务地址不一样.说白了就是ip.网络协议.端口都一样的时候,就是同一个域,否则就是跨域.这是由 ...
- IC卡冷复位时序
冷复位(cold reset):当提供给IC卡的电源电压和其他信号从静止状态中复苏且收到复位信号后,IC卡产生的复位. 在触点激活后,终端将发出一个冷复位信号,并从IC卡获得一个复位应答信号,过程如下 ...
- python------Socket网略编程+动态导入模块
上节课程回顾: 静态变量:与类无关,不能访问类里的任何属性和方法. 类方法:只能访问类变量. 属性:把一个方法变成静态属性, 反射: __new__:先于__init__执行: __call__: c ...
- mac添加redis 环境变量
cd /etc/paths.d touch redis vim redis 写入 /Users/love/Downloads/redis-4.0.10/src 之后就可以直接执行redis-cli r ...
- 【SpringBoot】数据库操作之整合Mybaties和事务讲解
========================8.数据库操作之整合Mybaties和事务讲解 ================================ 1.SpringBoot2.x持久化数 ...