深入了解java虚拟机(JVM) 第四章 对象的创建

一、对象的创建过程

    对象的创建过程大致可以分为六步,其中对象的分配尤为重要:

         

二、对象分配内存

       一般来说对象分配内存有两种方式:

        第一种是指针碰撞,这是一种比较理想的方式:如果Java堆是绝对规整的:一边是用过的内存,一边是空闲的内存,中间一个指针作为边界指示器;分配内存只需向空闲那边移动指针,这种分配方式称为"指针碰撞"(Bump the Pointer);

       第二中方式是空闲列表,这中方式没有指针碰撞那么理想,但是也有他自身的优势:如果Java堆不是规整的:用过的和空闲的内存相互交错; 需要维护一个列表,记录哪些内存可用;分配内存时查表找到一个足够大的内存,并更新列表,这种分配方式称为"空闲列表"(Free List);

      这两种方式各有各的优势,具体选用方式,需要根据垃圾收集器来进行选择,主要是根据垃圾回收器有无压缩来选择。

三、线程安全问题

      在进行并发操作时,上面两种方式分配内存的操作都不是线程安全的,所以考虑到解决这种线程安全问题:

      第一种:加锁,这种方式是开发过程中最容易使用的方式,也是最简单的方式,但是这种方式的缺点就是执行效率太低。

      第二种:本地线程分配缓冲区(TLAB):把分配内存的动作按照线程划分在不同的空间中进行:在每个线程在Java堆预先分配一小块内存,称为本地线程分配缓冲区(Thread Local Allocation Buffer,TLAB);哪个线程需要分配内存就从哪个线程的TLAB上分配。

四、对象的结构

     对象的结构分为三部分:

      第一部分:Header(对象头),对象头又有两给部块组成

       1.自身运行时数据(Mark word),这部分数据是对象主要存储的数据,主要有:

                a.哈希值:这个值是通过一个native方法获取

                  b.GC分代年龄:这个是垃圾回收算法使用

           以上介绍两种作用是太相同的,至于剩下的:c.锁状态标志、d.线程持有的锁、e.偏向线程ID、f.偏向时间戳都是作用于线程优化的

       2.类型指针:对象指向类对象本身数据的指针

      第二部分:实例数据(InstanceData):

         实例数据部分是对象真正存储的有效信息,也既是我们在程序代码里面所定义的各种类型的字段内容,无论是从父类继承下来的,还是在子类中定义的都需要记录下来。 这部分的存储顺序会受到虚拟机分配策略参数(FieldsAllocationStyle)和字段在Java源码中定义顺序的影响。HotSpot虚拟机 默认的分配策略为longs/doubles、ints、shorts/chars、bytes/booleans、oops(Ordinary Object Pointers),从分配策略中可以看出,相同宽度的字段总是被分配到一起。在满足这个前提条件的情况下,在父类中定义的变量会出现在子类之前。如果 CompactFields参数值为true(默认为true),那子类之中较窄的变量也可能会插入到父类变量的空隙之中。

    第三部分:对齐填充(Padding)

       第三部分对齐填充并不是必然存在的,也没有特别的含义,它仅仅起着占位符的作用。由于HotSpot VM的自动内存管理系统要求对象起始地址必须是8字节的整数倍,换句话说就是对象的大小必须是8字节的整数倍。对象头正好是8字节的倍数(1倍或者2倍),因此当对象实例数据部分没有对齐的话,就需要通过对齐填充来补全。

五、对象的访问定位

     对立对象是为了使用对象.Java程序需要通过在栈上的reference数据操作堆上的具体对象. 由于reference类型在Java虚拟机规范中只规定了一个指向对象的引用,并没有定义这个引用应该通过何种方式去定位,访问堆中的对象的具体位置,所以对象的访问方式取决于虚拟机的实现而定的.。简单来说 栈指向堆中只会指向地址,至于地址存储的是否对象,我们是无法知道的,

    解决这一问题目前有两种方式:

      第一种:句柄指针:栈指向堆中的句柄池,句柄池中有实例对象的地址,通过句柄池指向对象

      优点:栈地址永远不会改变,或者说引用地址不会改变

      第二张:直接指针:reference中存储直接对象的地址,但是必须考虑放置访问类型数据的相关信息

     优点:效率快,节省了一次指针定位的时间开销

 

转载于:https://www.cnblogs.com/daijiting/p/9960783.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/570159.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[UWP]使用Picker实现一个简单的ColorPicker弹窗

[UWP]使用Picker实现一个简单的ColorPicker弹窗 原文:[UWP]使用Picker实现一个简单的ColorPicker弹窗在上一篇博文《[UWP]使用Popup构建UWP Picker》中我们简单讲述了一下使用Popup构建适用于MVVM框架下的弹窗层组件Picker的过程。但是没有应用实例的话可能体现不出Picker相对于…

C# WebRequest.Create 锚点“#”字符问题

背景 在与后台API接口对接时,如将网页Url作为参数请求数据时,如果是锚点参数,则会丢失。 锚点参数 请求通过WebRequest.Create创建一个WebRequest: 1 var uri "https://id.test.xxx.com/api/v1/auth/sso/url?redirectUrlht…

免费的编程中文书籍索引(2018第三版)

之前我在 github 上整理了来一份:free-programming-books-zh_CN(免费的计算机编程类中文书籍)。 截至目前为止,已经在 GitHub 收获了 40000 多的 stars,有 90 多人发了 600 多个 Pull Requests 和 issues。 在收集的过…

分类与监督学习,朴素贝叶斯分类算法

1.理解分类与监督学习、聚类与无监督学习。 (1)简述分类与聚类的联系与区别。 分类就是按照某种标准给对象贴标签,再根据标签来区分归类。聚类是指事先没有“标签”而通过某种成团分析找出事物之间存在聚集性原因的过程。 区别是&#xff0c…

一张图搞定OAuth2.0

转发:https://www.cnblogs.com/flashsun/p/7424071.html 目录 1、引言2、OAuth2.0是什么3、OAuth2.0怎么写1、引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让…

linux部署redis详细步骤

公司一直在使用redis集群,寻思着自己也部署一套练练手。 打开redis的官网下载页:https://redis.io/download 按照官网的步骤进行操作: 你会发现输入src/redis-cli命令之后,一直连接不上。 提示信息:Could not connect …

四则运算 结对项目

github 地址:https://github.com/wangshicheng0213/HomeWork02 一、基本要求 1) 实现一个带有用户界面的四则运算。 2) 生成的题目不能重复。 3) 支持负数,例如-1,-1/2,-3‘4/5等。 4) 题目的数量(个人项目的要求) 5) …

大型数据库

over(order by salary) 按照salary排序进行累计,order by是个默认的开窗函数 over(partition by deptno)按照部门分区 如何使用Oracle Round 函数 (四舍五入)描述 : 传回一个数值,该数值是按照指定的小数位…

thinkPHP 数据库操作和分页类

转载于:https://www.cnblogs.com/finddata/p/10013962.html

RHCE基础环境系统的搭建

RHCE基础环境系统的搭建 安装前提: 安装的时候对系统和硬件的要求: 红帽系统安装队系统的要求:Windows操作系统选择64位的内存至少6GCPU需要支持虚拟化技术在做红帽系统实验的时候,把360类似这样的杀毒或是管家软件退出了&#xf…

Chrome Extension Dark Theme

Chrome Extension & Dark Theme https://chrome.google.com/webstore/detail/eimadpbcbfnmbkopoojfekhnkhdbieeh https://github.com/darkreader/darkreader https://github.com/xyz-data/darkreader 转载于:https://www.cnblogs.com/xgqfrms/p/10017780.html

mybatis 控制台打印执行的SQL语句

1. Spring boot 集成 mybatis 【转载】SpringBoot中Mybatis打印sql 1.1 如果使用的是application.properties文件,加入如下配置: 1 logging.level.com.example.demo.daodebug 红色部分指的是mybatis对应的方法接口所在的包路径。 1.2 如果使用的是appli…

轻知 | 为什么全球只有13组根域名服务器?

欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 本文由9527发表 根域名服务器是域名解析系统(DNS)中最为顶级的域名服务器,它们负责管理顶级域的权威域名服务器地址。作为互联网基础设施的重要部分,所有域名…

check_http语法和选项

check_http H hostname (or) -I ip-address {optional options} 常用的几个例子 1. 检测http协议 $ check_http -H 192.168.1.50 HTTP OK HTTP/1.1 200 OK - 332 bytes in 0.004 seconds |time0.004144s;;;0.000000 size332B;;;0 2.检测https协议 $ check_http -H 192.168.1.50…

CentOs如何挂载硬盘

远程SSH登录上Centos服务器后,进行如下操作提醒:挂载操作会清空数据,请确认挂载盘无数据或者未使用第一步:列出所有磁盘 命令: ll /dev/disk/by-path 提示:如果无法确认数据盘设备名称,请使…

挂载

df -Th 查看磁盘挂载情况 ls /dev/sdx* fdisk -l 查看分区情况 fdisk /dev/sdb 分区mnpw uuid:设备的唯一号 blkidUUID"0a59654a-6f2c-4bc1-bbaf-df844e60e2e3" UUID"fe8c9dd4-571c-40a4-837a-a4ab6e4ae7e转载于:https://www.cnblogs.com/finddata/p/10041496.h…

AWS EC2实例Ubuntu系统设置root用户密码并使用root/ubuntu用户登录

参考链接:http://www.wangchao.info/1137.html 注意:链接中写的简化了,其中重启服务的命令似乎不太适用,可能是不通用,我下面描述的方式亲测可行,如有其他疑问请留言; https://blog.csdn.net/p…

坑题

题目描述 小姐姐想要配 n 把钥匙,她走过开锁铺问老板价钱,老板是这么说的: 小姐姐想知道完成配n把钥匙的任务最少需要花费多少钱 输入描述: 题目有多组测试数据。第一行输入一个整数T(组数少于100组),表示测…

最简单的nginx教程 - 如何把一个web应用部署到nginx上

Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务。Nginx是由伊戈尔赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日…

Median(二分+二分)

Median http://poj.org/problem?id3579 Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 11225 Accepted: 4016Description Given N numbers, X1, X2, ... , XN, let us calculate the difference of every pair of numbers: ∣Xi - Xj∣ (1 ≤ i < j …