热门标签 | 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岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 一面自我介绍对象相等的判断,equals方法实现。可以简单描述挫折,并说明自己如何克服,最终有哪些收获。职业规划表明自己决心,首先自己不准备继续求学了,必须招工作了。希望去哪 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • 生产环境下JVM调优参数的设置实例
     正文前先来一波福利推荐: 福利一:百万年薪架构师视频,该视频可以学到很多东西,是本人花钱买的VIP课程,学习消化了一年,为了支持一下女朋友公众号也方便大家学习,共享给大家。福利二 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 本文介绍了Java虚拟机中的垃圾收集器,包括年轻代收集器Serial收集器、ParNew收集器、Parallel Scavenge收集器,以及老年代收集器Serial Old收集器、Parallel Old收集器和CMS收集器。对每种收集器的算法和特点进行了详细解析,希望对读者有参考价值。 ... [详细]
  • Spring Batch中多线程配置及实现例子
    本文介绍了在Spring Batch中开启多线程的配置方法,包括设置线程数目和使用线程池。通过一个示例演示了如何实现多线程从数据库读取数据并输出。同时提到了在多线程情况下需要考虑Reader的线程安全问题,并提供了解决方法。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
  • c语言基础编写,c语言 基础
    本文目录一览:1、C语言如何编写?2、如何编写 ... [详细]
  • 初探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社区 版权所有