热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2、深入理解JVM中Java对象的创建、对象结构、以及对象访问定位

2、JVM-Java对象的创建、对象结构、对象访问定位,Go语言社区,Golang程序员人脉社

目录

给对象分配内存(两种)

对象结构

对象的访问定位


 


记录下来方便个人学习复习

  • 注:根据new的参数在常量池中定位一个类的符号引用 --这句话的意思是:常量池相当于c语言中的指针地址集合,所以就是在常量池中保存new对象的地址,通过地址定位对象在堆中的位置

  • 给对象分配内存(两种)

    • 指针碰撞的方式(内存比较规整的情况下)

  • 空闲列表的方式(内存不规整的情况下)

内存是否规整取决于垃圾回收器的策略,当垃圾回收时压缩整理了内存,在内存分配时就是使用内存碰撞的方式

  • 线程安全性问题

    • 线程同步

    • 本地线程分配缓冲

      • 多线程的情况下对象在分配内存的过程中会出现线程安全的问题,所以当每个一线程进来的时候虚拟机都会为每一个线程分配一块独立的内存空间,称之为本地线程分配缓冲


对象结构

  • Header(对象头)

    • 自身运行时数据(Mark Word)

      • 哈希值、GC分代年龄、锁状态标志、线程持有的锁、偏向线程id、偏向时间戳

    • 类型指针

  • InstanceData(实例数据)

  • Padding(队形填充)

    • 对象的创建有指定的大小,比如int类型4个字节,如果数据没有4个字节,现在就需要使用padding填充对象到4个字节


对象的访问定位

  • 句柄

    • 堆中的句柄池保存着堆中对象的实例指针(和对象类型数据的指针,这个指针指向方法区),栈中的对象引用指向这个句柄池,句柄池中的对象指针指向对象实例。所有句柄也叫指针的指针

  • 直接指针

    • 栈中对象的引用直接指向堆中的对象实例(直接指针也保存着对象实例指针和对象数据类型指针)

句柄需要先指向句柄池找到对象实例的地址,再找到对象的实例,需要2步,直接指针直接指向对象的实例,需要1步即可。那么为什么还会有句柄的方式,因为如果对象发生改变(为什么会改变?因为gc算法,当复制或者整理的时候对象实例会移动在堆中的地址)栈中指向句柄池的地址不需要改变,改变的都是句柄池中的地址(句柄池和对象实例都是在堆中,所以在改变句柄池的实例指针就比改变栈中的应用指针方便)。使用直接指针的方式比句柄的方式快,Hotspot使用的是直接指针的方式

                                                                                      注:博文内容来自书本《深入理解Java虚拟机》第2版 周志明著


推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • Java和JavaScript是什么关系?java跟javaScript都是编程语言,只是java跟javaScript没有什么太大关系,一个是脚本语言(前端语言),一个是面向对象 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 利用空间换时间减少时间复杂度以及以C语言字符串处理为例减少空间复杂度
    在处理字符串的过程当中,通常情况下都会逐个遍历整个字符串数组,在多个字符串的处理中,处理不同,时间复杂度不同,这里通过利用空间换时间等不同方法,以字符串处理为例来讨论几种情况:1: ... [详细]
  • 初探PLC 的ST 语言转换成C++ 的方法
    自动控制软件绕不开ST(StructureText)语言。它是IEC61131-3标准中唯一的一个高级语言。目前,大多数PLC产品支持ST ... [详细]
author-avatar
黑白
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有