《深入理解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运行时数据区域 运行时数据区分为方法区,堆,虚拟机栈,本地方法栈,程序计数器 方法区和堆是线程共享的区域 虚拟机栈,本地方法栈,程序计数器是数据隔离的数据 ...
随机推荐
- 【java集合框架源码剖析系列】java源码剖析之ArrayList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 本博客将从源码角度带领大家学习关于ArrayList的知识. 一ArrayList类的定义: public class Arr ...
- GDAL1.11版本对SHP文件索引加速测试
GDAL库中对于矢量数据的读取中可以设置一些过滤器来对矢量图形进行筛选,对于Shapefile格式来说,如果数据量太大,设置这个过滤器时间慢的简直无法忍受.好在GDAL1.10版本开始支持读取Shap ...
- UNIX网络编程——socket概述和字节序、地址转换函数
一.什么是socket socket可以看成是用户进程与内核网络协议栈的编程接口.socket不仅可以用于本机的进程间通信,还可以用于网络上不同主机的进程间通信. socket API是一层抽象的网络 ...
- 【项目管理】 PMBOK 基础概念 (引论 PMBOK 笔记)
好紧张, 3月28考试, 全力学 PMP ~~ 一. 项目 1. 项目的定义 项目 : 项目是为创造 独特 的 产品, 服务 或 成果 而进行的 临时性 工作; -- 独特 : 独特性是项目的特征, ...
- HBase作为存储方案
HBase存储特点 * Client 1. 包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息. * Zookeeper: 1. 选举集群中的Master, ...
- iOS体会篇 大学编程到公司的过程
原文作者:朱众 授权本技术博文转载. 刚进公司时,在你正式动手写代码前,很可能要理解code base.这一过程至少持续1个月,取决于你所在项目的规模.你会发现你不得不使用你浑身所学之能事,理解上古程 ...
- go: 一个通用log模块的实现
在go里面,虽然有log模块,但是该模块提供的功能并不强,譬如就没有我们常用的level log功能,但是自己实现一个log模块也并不困难. 对于log的level,我们定义如下: const ( L ...
- C#中的泛型化方法的实现
在一个基本数据类型的方法中求解最大值或者最小值是一件很方便,同时也是很简单的事.但是如果你想复用这个方法,我们就需要使用到泛型编程的概念了.这就好比是C++中的模板函数,或者java中的泛型操作.相比 ...
- 多层界面之间显示与隐藏tabBar
IOS中多层界面之间显示与隐藏tabBar? 在做项目的时候,遇到了一个难题,使用hidesBottomWhenPushed=YES属性设置,可以让本级界面及其以后界面都隐藏,但是根据项目 需求,在第 ...
- 并发服务器--02(基于I/O复用——运用epoll技术)
本文承接自上一博文I/O复用——运用Select函数. epoll介绍 epoll是在2.6内核中提出的.和select类似,它也是一种I/O复用技术,是之前的select和poll的增强版本. Li ...