热门标签 | 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版 周志明著


推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • Python处理Word文档的高效技巧
    本文详细介绍了如何使用Python处理Word文档,涵盖从基础操作到高级功能的各种技巧。我们将探讨如何生成文档、定义样式、提取表格数据以及处理超链接和图片等内容。 ... [详细]
  • 最近团队在部署DLP,作为一个技术人员对于黑盒看不到的地方还是充满了好奇心。多次咨询乙方人员DLP的算法原理是什么,他们都以商业秘密为由避而不谈,不得已只能自己查资料学习,于是有了下面的浅见。身为甲方,虽然不需要开发DLP产品,但是也有必要弄明白DLP基本的原理。俗话说工欲善其事必先利其器,只有在懂这个工具的原理之后才能更加灵活地使用这个工具,即使出现意外情况也能快速排错,越接近底层,越接近真相。根据DLP的实际用途,本文将DLP检测分为2部分,泄露关键字检测和近似重复文档检测。 ... [详细]
  • 深入解析 Apache Shiro 安全框架架构
    本文详细介绍了 Apache Shiro,一个强大且灵活的开源安全框架。Shiro 专注于简化身份验证、授权、会话管理和加密等复杂的安全操作,使开发者能够更轻松地保护应用程序。其核心目标是提供易于使用和理解的API,同时确保高度的安全性和灵活性。 ... [详细]
  • 本文探讨了在Java多线程环境下,如何确保具有相同key值的线程能够互斥执行并按顺序输出结果。通过优化代码结构和使用线程安全的数据结构,我们解决了线程同步问题,并实现了预期的并发行为。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • 本文详细介绍了C语言中的指针,包括其基本概念、应用场景以及使用时的优缺点。同时,通过实例解析了指针在内存管理、数组操作、函数调用等方面的具体应用,并探讨了指针的安全性问题。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文探讨了如何使用自增和自减运算符遍历二维数组中的元素。通过实例详细解释了指针与二维数组结合使用的正确方法,并解答了常见的错误用法。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 本文详细介绍了C语言的起源、发展及其标准化过程,涵盖了从早期的BCPL和B语言到现代C语言的演变,并探讨了其在操作系统和跨平台编程中的重要地位。 ... [详细]
  • 本文介绍如何利用栈数据结构在C++中判断字符串中的括号是否匹配。通过顺序栈和链栈两种方式实现,并详细解释了算法的核心思想和具体实现步骤。 ... [详细]
  • 本文详细介绍了Grand Central Dispatch (GCD) 的核心概念和使用方法,探讨了任务队列、同步与异步执行以及常见的死锁问题。通过具体示例和代码片段,帮助开发者更好地理解和应用GCD进行多线程开发。 ... [详细]
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社区 版权所有