《深入理解java虚拟机》读书笔记1--java内存区域
Java内存管理
本文主要介绍Java虚拟机运行时的内存区域是如何划分的、Java对象的创建过程、Java对象的内存布局、Java对象的访问定位
一:运行时区域划分
主要可以分为以下 几个:
程序计数器;
栈(虚拟机栈和本地方法栈);
堆;
方法区;
1.程序计数器
记录正在执行的虚拟机字节码指令的地址.唯一一个没有规定任何OutOfMemoryError的区域。
2.栈
栈主要用来存储局部变量表(各种局部变量(方法中的变量),基本类型和对象引用类型)、操作数栈、动态链接等信息。线程私有的。所以方法中的变量不是线程共享数据。
虚拟机栈和本地方法栈比较相似,他们的区别是虚拟机栈为虚拟机执行Java方法服务,本地方法栈为虚拟机使用到的native方法服务。
3.堆
堆是Java虚拟机管理的内存最大的一块。虚拟机启动时创建,用于存放所有的对象实例以及数组。各个线程共享,所以,对象数据是共享数据。
4.方法区
各个线程共享区域。存储已被虚拟机加载的类信息、常量、静态变量等。这些数据都是共享数据
二:对象创建
类加载->分配内存->初始化为0->设置-><init>
类加载:第七章
内存分配:指针碰撞和空闲列表
指针碰撞:当堆中内存是绝对规整的,用此方法。此内存可以看做两部分,一边是使用过的内存,另一边是空闲的内存,中间用一个指针隔开。分配内存时,只需将指针向空闲内存那边移动一段与对象大小相等的距离即可。
空闲列表:当堆中内存不是规整时用此方法。虚拟机必须维护一个列表,该表记录了哪些内存块是可用的,在分配的时候找到一块足够大的区域分配,并更新表上的记录即可。
设置:对象头的信息进行设置。
<init>:按照程序员的意愿进行初始化。
三:对象的内存布局
对象的内存布局可以分为三块区域:对象头、实例数据和对齐填充。
对象头:主要包含两部分信息:1,用于存储对象自身运行时数据,如哈希码、GC分代年龄、线程持有的锁、锁状态标志等;2,类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例;3,如果对象是数组,对象头还要有数组长度。
实例数据:对象真正存储的有效信息,代码中定义的各种字段,包括父类的。
对齐填充:充当占位符。对象的大小必须是8字节的整数倍,对象头正好是8字节的整数倍。
四:对象的访问定位
Java程序需要通过栈上的对象引用数据来操作堆上的具体对象。有两种访问方式:使用句柄和直接指针。
使用句柄:在Java堆中划分一个区域来作为句柄池,reference中存储的就是对象的句柄地址,而句柄中包含了对象实例数据和对象类型数据(类数据)的地址信息。如图:

直接指针访问:reference中存储的直接就是对象的地址,而堆对象中就必须考虑 如何访问类型数据的相关信息.

《深入理解java虚拟机》读书笔记1--java内存区域的更多相关文章
- 深入理解Java虚拟机 -- 读书笔记(1):JVM运行时数据区域
深入理解Java虚拟机 -- 读书笔记:JVM运行时数据区域 本文转载:http://blog.csdn.net/jubincn/article/details/8607790 本系列为<深入理 ...
- 深入Java虚拟机读书笔记第五章Java虚拟机
Java虚拟机 Java虚拟机之所以被称之为是虚拟的,就是因为它仅仅是由一个规范来定义的抽象计算机.因此,要运行某个Java程序,首先需要一个符合该规范的具体实现. Java虚拟机的生命周期 一个运行 ...
- 【Todo】深入理解Java虚拟机 读书笔记
有一个在线系列地址 <深入理解Java虚拟机:JVM高级特性与最佳实践(第2版)> http://book.2cto.com/201306/25426.html 已经下载了这本书(60多M ...
- 深入理解Java虚拟机读书笔记5----虚拟机字节码执行引擎
五 虚拟机字节码执行引擎 1 运行时栈帧结构 ---栈帧是用于支持虚拟机进行方法调用和方法执行的数据结构,是虚拟机运行时数据区中的虚拟机栈的栈元素. ---栈帧中存储了方法的局部变 ...
- 深入理解Java虚拟机读书笔记8----Java内存模型与线程
八 Java内存模型与线程 1 Java内存模型 ---主要目标:定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节. ---此处的变量和J ...
- 深入理解Java虚拟机读书笔记7----晚期(运行期)优化
七 晚期(运行期)优化 1 即时编译器(JIT编译器) ---当虚拟机发现某个方法或代码块的运行特别频繁时,就会把这些代码认定为“热点代码”,包括被多次调用的方法和被多次执行的循环体. ...
- 深入理解Java虚拟机读书笔记4----虚拟机类加载机制
四 虚拟机类加载机制 1 类加载机制 ---概念:虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验.转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型. -- ...
- 深入理解Java虚拟机读书笔记3----类文件结构
三 类文件结构 1 Java虚拟机的两种中立特性 · 平台无关性 · 语言无关性 实现平台无关性和语言无关性的基础是虚拟机和字节码存储格式(Class文件). 2 Clas ...
- 深入理解Java虚拟机读书笔记1----Java内存区域与HotSpot虚拟机对象
一 Java内存区域与HotSpot虚拟机对象 1 Java技术体系.JDK.JRE? Java技术体系包括: · Java程序设计语言: · 各种硬件平台上的 ...
- 深入理解java虚拟机读书笔记--java内存区域和管理
第二章:Java内存区域和内存溢出异常 2.2运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...
随机推荐
- 如何正确的理解和解决 ORA-01843:not a valid month
今天码代码的时候遇到了这个问题,因为oracle用的比较少,所在查询了一下. 顿时傻眼,有很多的贴子说是因为nls_date_language的问题,还要改会话级的NLS_DATE_LANGUAGE设 ...
- 使用lrucache和diskLrucache实现照片墙
其实,在真正的项目实战当中如果仅仅是使用硬盘缓存的话,程序是有明显短板的.而如果只使用内存缓存的话,程序当然也会有很大的缺陷.因此,一个优秀的程序必然会将内存缓存和硬盘缓存结合到一起使用,那么本篇文章 ...
- UNIX网络编程——基本TCP套接字编程
一.基于TCP协议的网络程序 下图是基于TCP协议的客户端/服务器程序的一般流程: 服务器调用socket().bind().listen()完成初始化后,调用accept()阻塞等待,处于监听端口的 ...
- 【Unity Shaders】Transparency —— 使用alpha通道创建透明效果
本系列主要参考<Unity Shaders and Effects Cookbook>一书(感谢原书作者),同时会加上一点个人理解或拓展. 这里是本书所有的插图.这里是本书所需的代码和资源 ...
- 分布式进阶(三)Ubuntu 14.04 之JDK安装
Ubuntu 10.04 之JDK安装 1.从官网 (http://www.Oracle.com/technetwork/java/javase/downloads/jdk6u35-downloads ...
- 利用编辑距离(Edit Distance)计算两个字符串的相似度
利用编辑距离(Edit Distance)计算两个字符串的相似度 编辑距离(Edit Distance),又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数.许可 ...
- mysql的基本使用命令
启动:net start mySql; 进入:mysql -u root -p/mysql -h localhost -u root -p databaseName; 列出数据库:show datab ...
- C++编译器何时为用户提供默认构造函数
第一种是类成员中有成员是类对象,并且该成员的类含有默认构造函数,那么C++编译器会帮你给这个类也生成一个默认构造函数,用来调用其成员对象的构造函数,完成该成员的初始化构造.需要强调的是,如果这个成员的 ...
- chrome "Provisional headers are shown"
我的问题的,每次打开浏览器,点开有视频的页面(云平台的存储),然后当视频还没有加载完,就马上关闭,连续操作很多次(测试的暴力测试把),F12查看就有很多很多在加载中的连接,因为连续点击太多次了,第一个 ...
- Android图片加载库Fresco
在Android设备上面,快速高效的显示图片是极为重要的.过去的几年里,我们在如何高效的存储图像这方面遇到了很多问题.图片太大,但是手机的内存却很小.每一个像素的R.G.B和alpha通道总共要占用4 ...