浅谈Java虚拟机内存中的对象创建,内存布局,访问定位
参考于
深入理解Java虚拟机
这里介绍HotSpot虚拟机(自带的虚拟机)
1.对象的创建
对于程序员来说,创建对象的方法:
User user1 = new User();
User user2 = new User(04, "Tom", 20);
对于虚拟机来说:
1.首先遇到new指令,先去方法区(一块内存,有些人也叫永久代,不过书上说了这种叫法其实不是很准确)检查类有没有加载过了,如果没有,虚拟机去加载,如果加载了,在堆中进行创建。
2.创建对象有两种方法:由虚拟机自己决定,虚拟机自己判断用哪种方法
2.1.如果java堆中都是很规整的:Bump the Pointer 指针碰撞

红色:原来已经分配了的。 黄色:新创建的。 白色:空的内存。 中间竖线:指针。
根据第1步获得的对象大小,中间指针像空的内存挪动和对象大小相等的一段距离。
2.2.如果堆不规整:Free List 空闲列表

红色:原来已经分配了的。 白色:空的内存。 蓝色:一张列表
列表中记录哪块是空的,哪块是空的,然后分配一块合适的用来创建对象,随后更新列表。
2.3.堆是线程共享,虚拟机解决创建对象时线程不安全的方法
第一种,CAS保证原子性操作
第二种,TLAB本地线程分配缓冲,每个线程都先独占一小块内存,不够了再加,不过再加这个动作需要同步
3.内存分配完成后,内存空间初始化为0(不包括对象头),这也是为什么我们的字段都有一个默认值的原因
4.如果执行的是带参数的构造方法,为参数初始化。
2.对象的内存布局
对象内存布局可分为3块区域:对象头,实例数据,对齐填充
对象头分成两部分:第一部分存放运行时的数据,官方称为“Mark Word”,这部分的大小和虚拟机的位数有关,虚拟机32位,这部分是32bit,64位同理。
第二部分是类型指针,指针确定这个对象是哪个类的实例。
如果是数组,对象头还包含一块用于记录数组长度的空间
实例数据:对象真正存储的有效信息
对齐填充:类似于占位符,为了让对象为8字节的整数倍。
3.对象的访问定位
两种方式:第一种句柄访问,第二种直接指针访问。HotSpot采用第二种,第二种优点是访问速度更快。
第一种:

第二种:

浅谈Java虚拟机内存中的对象创建,内存布局,访问定位的更多相关文章
- 【Java虚拟机】浅谈Java虚拟机
跨平台 Java的一大特性是跨平台,而Java是如何做到跨平台的呢? 主要依赖Java虚拟机,具体来说,是Java虚拟机在各平台上的实现. Java虚拟机在不同的平台有不同的实现.同一份字节码,通过运 ...
- [原创]浅谈JAVA在ACM中的应用
由于java里面有一些东西比c/c++方便(尤其是大数据高精度问题,备受广大ACMer欢迎),所以就可以灵活运用这三种来实现编程,下面是我自己在各种大牛那里总结了一些,同时加上自己平时遇到的一些jav ...
- 浅谈java虚拟机|系列2|JVM运行时
今天我们继续谈谈JVM架构. 今天主要讲讲JVM运行时, 先来一个图: 上篇文章,我们知道,JVM运行时,简单来说就是把class文件翻译成操作系统相关的机器码(或汇编语言),然后通过调用操作系统函数 ...
- 浅谈java虚拟机|系列1|架构简介
今天开了一个专题.谈谈我们java程序员每天面对的java虚拟机(jvm). 本质上来说,jvm分两部分:编译器(compiler)和运行时(runtime). 所谓的编译器,简单来说,他就是个翻译机 ...
- 浅谈Java和JavaScript中变量和数据类型的区别
对于一门编程语言的学习,如果第一步是安装环境,那么第二步一定是学习这门语言的基本规则,变量和数据类型则首当其冲 JavaScipt作为一个蹭Java热度而命名的语言,在很多方面和Java也有一定的相似 ...
- 浅谈JAVA继承关系中的构造函数
话不多说直接上例子,我的例子中定义了两个类,TheSon和TheFather,TheSon继承了TheFather,如图: TheSon类的定义: TheFather类的定义: 当我们初始化The ...
- 深入理解Java虚拟机之读书笔记一 自动内存管理机制
一.运行时数据区域 1.程序计数器是线程的私有空间,每个线程都有.针对线程执行的是Java代码还是Native代码有两种取值,Java代码时:虚拟机字节码指令的地址:Native代码时:计数值为Und ...
- 浅谈Java中的对象和引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
- 浅谈Java中的对象和对象引用
浅谈Java中的对象和对象引用 在Java中,有一组名词经常一起出现,它们就是“对象和对象引用”,很多朋友在初学Java的时候可能经常会混淆这2个概念,觉得它们是一回事,事实上则不然.今天我们就来一起 ...
随机推荐
- 【RL-TCPnet网络教程】第20章 RL-TCPnet之BSD Socket客户端
第20章 RL-TCPnet之BSD Socket客户端 本章节为大家讲解RL-TCPnet的BSD Socket,学习本章节前,务必要优先学习第18章的Socket基础知识.有了这些基础知 ...
- MYSQL数据库数据拆分之分库分表总结
数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 数据存储演进思路二:单库多表 随着用户数量的 ...
- CSS怎么在项目里引入自定义字体(@font-face)
前言: 以前我一直用内置的默认字体给文字设置字体,直到一天UI妹纸给了我下面的字体 当时我是蒙蔽的,这个字体的效果如下 默认字体并无该字体,直接设置是没有效果的,这时就需要用到自定义字体了 下面 ...
- PHP算法之二分查找
二分查找: 数组必须有序,且不重复. 一般实际工作中,很少有这样的数组,所以应用的很少,但是思想很好. 1 // 二分查找 2 $array = [10,14,23,33,45,56,65,77,89 ...
- Linux 下源码编译FFMEG
目录 1. 安装依赖关系 2. 源码安装 yasm 3. 源码安装 NASM 4. 源码安装libx264 5. 源码安装x265 6. 源码安装 libmp3lame 7. 源码安装 libopus ...
- Docker 搭建pxc集群 + haproxy + keepalived 高可用(二)
上一节我们有了两个分片的pxc集群,这一节我们接着安装haproxy和keepalived的实现集群的高可用 一.先下载haproxy的镜像 [root@localhost ~]# docker pu ...
- 好用的函数,assert,random.sample,seaborn tsplot, tensorflow.python.platform flags 等,持续更新
python 中好用的函数,random.sample等,持续更新 random.sample random.sample的函数原型为:random.sample(sequence, k),从指定序列 ...
- MyBatis 处理关系运算符
MyBatis mapper文件是xml文件,使用关系运算符需要进行转义. 关系运算符 转义后字符 < < <= <= > > > >=
- js闭包vs Java内部类
前言: 昨天写了一个关于Java内部的博客,在内部类的最后一点中谈到了Java闭包的概念,他是这样定义闭包的:闭包是一个可调用的对象,它记录了一些信息,这些信息来自创建它的作用域.结合Java的内部类 ...
- Config ConnectionStrings
<connectionStrings> <add name ="MyschoolConnectionString" connectionString =" ...