IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 《JVM系列(1),绝了 -> 正文阅读

[Java知识库]《JVM系列(1),绝了

  • 加载类元信息,判断类元信息(加载、链接、初始化)是否存在

  • 为对象分配内存

  • 处理并发问题

  • 初始化分配到的空间,属性的默认初始化(零值初始化)

  • 设置对象头信息

  • 执行init方法初始化(属性显示初始化、代码块中的初始化、构造器初始化)

加载类元信息:

虚拟机遇到一条new指令,首先去检查这个指令的参数能否在Metaspace的常量池中定位到一个类的符号引用,并且检查这个符号引用代表的类是否已经被加载,解析和初始化。 如果没有,那么在双亲委派模式下,使用当前类加载器以ClassLoader + 包名 + 类名为key进行查找对应的 .class文件,如果没有找到文件,则抛出ClassNotFoundException异常;如果找到,则进行类加载,并生成对应的Class对象。

为对象分配内存:

首先计算对象占用空间的大小,接着在堆中划分一块内存给新对象。如果实例成员变量是引用变量,仅分配引用变量空间即可,即4个字节大小。分配方式由Java堆是否规整所决定,而Java堆是否规整又由所采用的垃圾收集器是否带有压缩整理功能决定。

  • 如果内存规整:虚拟机将采用的是指针碰撞法(Bump The Point) 来为对象分配内存。

  • 如果内存不规整:虚拟表需要维护一个列表,进行空闲列表分配

指针碰撞法:

所有用过的内存在一边,空闲的内存放另外一边, 中间放着一个指针作为分界点的指示器,分配内存就仅仅是把指针指向空闲那边挪动一段与对象大小相等的距离罢了。如果垃圾收集器选择的是Serial ,ParNew这种基于压缩算法的,虚拟机采用这种分配方式。一般使用带Compact(整理)过程的收集器时,使用指针碰撞。

空闲列表分配:

如果内存不是规整的,已使用的内存和未使用的内存相互交错,那么虚拟机将采用的是空闲列表来为对象分配内存。意思是虚拟机维护了一个列表,记录上那些内存块是可用的,再分配的时候从列表中找到一块足够大的空间划分给对象实例, 并更新列表上的内容。这种分配方式成为了 “空闲列表(Free List)”

处理并发问题:

  • 采用CAS配上失败重试保证更新的原子性

  • 在Eden区给每个线程分配一块区域TLAB - 通过设置 -XX:+UseTLAB参数来设置(区域加锁机制),

初始化分配到的内存:

给对象属性赋值的操作:属性的默认初始化、所有属性设置默认值,保证对象实例字段在不赋值可以直接使用。

设置对象的对象头信息:

将对象的所属类(即类的元数据信息)、对象的HashCode和对象的GC信息、锁信息等数据存储在对象的对象头中。这个过程的具体设置方式取决于JVM实现。

执行init方法进行初始化:

在Java程序的视角看来,初始化才正式开始。初始化成员变量,执行实例化代码块,调用类的构造方法,并把堆内对象的首地址赋值给引用变量。

一般来说(由字节码中跟随invokespecial指令所决定),new指令之后会接着就是执行方法,把对象按照程序员的意愿进行初始化,这样一个真正可用的对象才算完成创建出来。

对象内存布局


在这里插入图片描述

对象头:

对象头包含了两部分,分别是 运行时元数据(Mark Word)类型指针,如果是数组,还需要记录数组的长度。

  • 运行时元数据: 哈希值(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、翩向时间戳。

  • 类型指针: 指向类元数据InstanceKlass,确定该对象所属的类型。指向的其实是方法区中存放的类元信息

实例数据(Instance Data): 对象真正存储的有效信息,包括程序代码中定义的各种类型的字段(包括从父类继承下来的本身拥有的字段)。

规则:相同的字段总是被分配在一起、父类中定义的变量总是会出现在子类之前、如果CompactFields参数为默认值true,子类的窄变量可能插入到父类变量的空隙。

最后

这份《“java高分面试指南”-25分类227页1000+题50w+字解析》同样可分享给有需要的朋友,感兴趣的伙伴们可挑战一下自我,在不看答案解析的情况,测试测试自己的解题水平,这样也能达到事半功倍的效果!(好东西要大家一起看才香,下载请点击这里

image

image

0_60958482/java-p7)**)

[外链图片转存中…(img-UaAbIOE1-1630076346595)]

[外链图片转存中…(img-dUskONh8-1630076346597)]

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-28 21:57:04  更:2021-08-28 21:57:19 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 12:50:32-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码