当前位置:首页 > 科技  > 软件

面试官问:Java中的new关键字做了什么事情?

来源: 责编: 时间:2024-03-28 17:51:14 262观看
导读各位小伙伴,当我们new一个对象的时候,对象到底是怎么生产出来的呢,我们这篇说一说对象生成的过程和内存的分配机制,面试的时候可以扯一扯,绝对是加分项。
图片1.加载类时检查
虚拟机在执行的过程中,执行到new关键字(new关键

各位小伙伴,当我们new一个对象的时候,对象到底是怎么生产出来的呢,我们这篇说一说对象生成的过程和内存的分配机制,面试的时候可以扯一扯,绝对是加分项。
vIX28资讯网——每日最新资讯28at.com

图片图片vIX28资讯网——每日最新资讯28at.com

1.加载类时检查
虚拟机在执行的过程中,执行到new关键字(new关键词、对象克隆、对象序列化等)的时候,第一步是先去检查这个指令的参数对应的符号引用是否在常量池中,其对应的类是否已经被加载解析和初始化,如果已经有,就代表此类已经被加载过了,如果吗,没有就说明类还没有被加载,那就要执行类记载的整个过程。vIX28资讯网——每日最新资讯28at.com

2.内存的分配
在类加载过程完成后,就要对新创建的对象进行分配内存的操作,那么对应所需要的内存具体大小是如何确定的呢,其实对象所需内存的大小在类加载完成后就可以完全确定了,虚拟机只需要在java堆中划分出相应大小的固定的一块内存空间即可。
但是在分配内存这个过程中有两个问题:
1.如何划分内存。
2.在并发情况下, 可能出现正在给对象A分配内存,指针还没来得及修改,对象B又同时使用了原来的指针来分配内存的情况。vIX28资讯网——每日最新资讯28at.com

虚拟机有两种内存分配方法,一种是“指针碰撞”,一种是“空闲列表”,java默认采用的是指针碰撞,指针碰撞针对于规整的java堆,被使用的内存全都集中在堆的一边,而另一边都是空闲的内存,当需要分配固定大小的内存时候,只需要将内存的指针(分界点的指示器)从当前使用的位置向后挪动相应大小即可。当堆内存分配不是规整的时候,被使用的内存和没有被使用的内存交错相间,虚拟机很难找到一块固定大小且连续的内存空间,这时候指针碰撞就很难发挥出作用,这个时候虚拟机采用的是空闲列表,空闲列表是用来维护哪些内存块是空闲的,在进行分配内存的时候,只需要去空闲列表中找到一块大小合适且连续的内存块就可以了,然后再把这块内存空间在空闲列表上更新其记录。vIX28资讯网——每日最新资讯28at.com

解决并发问题的方法:
CAS(compare and swap): 虚拟机采用CAS配上失败重试的方式保证更新操作的原子性来对分配内存空间的动作进行同步处理。vIX28资讯网——每日最新资讯28at.com

本地线程分配缓冲(Thread Local Allocation Buffer,TLAB): 把内存分配的动作按照线程划分在不同的空间之中进行,即每个线程在Java堆中预先分配一小块内存。通过-XX:+/-UseTLAB参数来设定虚拟机是否使用TLAB(JVM会默认开启-XX:+UseTLAB),-XX:TLABSize 指定TLAB大小。vIX28资讯网——每日最新资讯28at.com

3.初始化零值
内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头), 如果使用TLAB,这一工作过程也可以提前至TLAB分配时进行。这一步操作保证了对象的实例字段在Java代码中可以不赋初始值就直接使用,程序能访问到这些字段的数据类型所对应的零值。vIX28资讯网——每日最新资讯28at.com

4.设置对象头
初始化零值之后,虚拟机要对对象进行必要的设置,例如这个对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的GC分代年龄等信息。这些信息存放在对象的对象头Object Header之中。vIX28资讯网——每日最新资讯28at.com

在HotSpot虚拟机中,对象在内存中存储的布局可以分为3块区域:对象头(Header)、 实例数据(Instance Data)和对齐填充(Padding)。HotSpot虚拟机的对象头包括两部分信息,第一部分用于存储对象自身的运行时数据, 如哈希码(HashCode)、GC分代年龄、锁状态标志、线程持有的锁、偏向线程ID、偏向时 间戳等。对象头的另外一部分是类型指针,即对象指向它的类元数据的指针,虚拟机通过这个指针来确定这个对象是哪个类的实例。vIX28资讯网——每日最新资讯28at.com

32位对象头:vIX28资讯网——每日最新资讯28at.com

图片图片vIX28资讯网——每日最新资讯28at.com


vIX28资讯网——每日最新资讯28at.com

64位对象头:vIX28资讯网——每日最新资讯28at.com

图片图片vIX28资讯网——每日最新资讯28at.com


vIX28资讯网——每日最新资讯28at.com

5.执行方法
执行方法,即对象按照程序员的意愿进行初始化。对应到语言层面上讲,就是为属性赋值(注意,这与上面的赋零值不同,这是由程序员赋的值),和执行构造方法。vIX28资讯网——每日最新资讯28at.com

对象大小与指针压缩
对象大小可以用jol-core包查看,引入依赖vIX28资讯网——每日最新资讯28at.com

<dependency>    <groupId>org.openjdk.jol</groupId>    <artifactId>jol-core</artifactId>    <version>0.9</version></dependency>
import org.openjdk.jol.info.ClassLayout;/** * 计算对象大小 */public class JOLSample {    public static void main(String[] args) {        ClassLayout layout = ClassLayout.parseInstance(new Object());        System.out.println(layout.toPrintable());        System.out.println();        ClassLayout layout1 = ClassLayout.parseInstance(new int[]{});        System.out.println(layout1.toPrintable());        System.out.println();        ClassLayout layout2 = ClassLayout.parseInstance(new A());        System.out.println(layout2.toPrintable());    }    // -XX:+UseCompressedOops           默认开启的压缩所有指针    // -XX:+UseCompressedClassPointers  默认开启的压缩对象头里的类型指针Klass Pointer    // Oops : Ordinary Object Pointers    public static class A {                       //8B mark word                       //4B Klass Pointer   如果关闭压缩-XX:-UseCompressedClassPointers或-XX:-UseCompressedOops,则占用8B        int id;        //4B        String name;   //4B  如果关闭压缩-XX:-UseCompressedOops,则占用8B        byte b;        //1B         Object o;      //4B  如果关闭压缩-XX:-UseCompressedOops,则占用8B    }}运行结果:java.lang.Object object internals: OFFSET  SIZE   TYPE DESCRIPTION                               VALUE      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)    //mark word      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)    //mark word           8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)    //Klass Pointer     12     4        (loss due to the next object alignment)Instance size: 16 bytesSpace losses: 0 bytes internal + 4 bytes external = 4 bytes total[I object internals: OFFSET  SIZE   TYPE DESCRIPTION                               VALUE      0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)      4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)      8     4        (object header)                           6d 01 00 f8 (01101101 00000001 00000000 11111000) (-134217363)     12     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)     16     0    int [I.<elements>                             N/AInstance size: 16 bytesSpace losses: 0 bytes internal + 0 bytes external = 0 bytes totalcom.tuling.jvm.JOLSample$A object internals: OFFSET  SIZE               TYPE DESCRIPTION                               VALUE      0     4                    (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)      4     4                    (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)      8     4                    (object header)                           61 cc 00 f8 (01100001 11001100 00000000 11111000) (-134165407)     12     4                int A.id                                      0     16     1               byte A.b                                       0     17     3                    (alignment/padding gap)                       20     4   java.lang.String A.name                                    null     24     4   java.lang.Object A.o                                       null     28     4                    (loss due to the next object alignment)Instance size: 32 bytesSpace losses: 3 bytes internal + 4 bytes external = 7 bytes total

什么是java对象的指针压缩?
1.jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩
2.jvm配置参数:UseCompressedOops,compressed--压缩、oop(ordinary object pointer)--对象指针
3.启用指针压缩:-XX:+UseCompressedOops(默认开启),禁止指针压缩:-XX:-UseCompressedOopsvIX28资讯网——每日最新资讯28at.com

为什么要进行指针压缩?
1.在64位平台的HotSpot中使用32位指针(实际存储用64位),内存使用会多出1.5倍左右,使用较大指针在主内存和缓存之间移动数据,占用较大宽带,同时GC也会承受较大压力vIX28资讯网——每日最新资讯28at.com

2.为了减少64位平台下内存的消耗,启用指针压缩功能vIX28资讯网——每日最新资讯28at.com

3.在jvm中,32位地址最大支持4G内存(2的32次方),可以通过对对象指针的存入堆内存时压缩编码、取出到cpu寄存器后解码方式进行优化(对象指针在堆中是32位,在寄存器中是35位,2的35次方=32G),使得jvm只用32位地址就可以支持更大的内存配置(小于等于32G)vIX28资讯网——每日最新资讯28at.com

4.堆内存小于4G时,不需要启用指针压缩,jvm会直接去除高32位地址,即使用低虚拟地址空间vIX28资讯网——每日最新资讯28at.com

5.堆内存大于32G时,压缩指针会失效,会强制使用64位(即8字节)来对java对象寻址,这就会出现1的问题,所以堆内存不要大于32G为好vIX28资讯网——每日最新资讯28at.com

对象大小计算vIX28资讯网——每日最新资讯28at.com

  1. 在32位系统下,存放Class指针的空间大小是4字节,MarkWord是4字节,对象头为8字节。
  2. 在64位系统下,存放Class指针的空间大小是8字节,MarkWord是8字节,对象头为16字节。
  3. 64位开启指针压缩的情况下,存放Class指针的空间大小是4字节,MarkWord是8字节,对象头为12字节。数组长度4字节+数组对象头8字节(对象引用4字节(未开启指针压缩的64位为8字节)+数组markword为4字节(64位未开启指针压缩的为8字节))+对齐4=16字节。
  4. 静态属性不算在对象大小内。


vIX28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-80197-0.html面试官问:Java中的new关键字做了什么事情?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 拿下阿里巴巴面试:10分钟了解JVM类加载过程?

下一篇: 面试官:说说Spring中IoC实现原理?

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 6月安卓手机性能榜:vivo/iQOO霸占旗舰排行榜前三

    2023年上半年已经正式过去了,我们也迎来了安兔兔V10版本,在新的骁龙8Gen3和天玑9300发布之前,性能榜的榜单大体会以骁龙8Gen2和天玑9200+为主,至于那颗3.36GHz的骁龙8Gen2领先
  • 容量越大越不坏?24万块硬盘故障率报告公布 这些产品零故障

    8月5日消息,云存储服务商Backblaze发布了最新的硬盘故障率报告,年故障率有所上升。Backblaze发布的硬盘季度统计数据,其中包括故障率等重要方面。这些结
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • 三万字盘点 Spring 九大核心基础功能

    大家好,我是三友~~今天来跟大家聊一聊Spring的9大核心基础功能。话不多说,先上目录:图片友情提示,本文过长,建议收藏,嘿嘿嘿!一、资源管理资源管理是Spring的一个核心的基础功能,不
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 中国家电海外掘金正当时|出海专题

    作者|吴南南编辑|胡展嘉运营|陈佳慧出品|零态LT(ID:LingTai_LT)2023年,出海市场战况空前,中国创业者在海外纷纷摩拳擦掌,以期能够把中国的商业模式、创业理念、战略打法输出海外,他们依
  • 朋友圈可以修改可见范围了 苹果用户可率先体验

    近日,iOS用户迎来微信8.0.27正式版更新,除了可更换二维码背景外,还新增了多项实用功能。在新版微信中,朋友圈终于可以修改可见范围,简单来说就是已发布的朋友圈
  • 2022爆款:ROG魔霸6 冰川散热系统持续护航

    喜逢开学季,各大商家开始推出自己的新产品,进行打折促销活动。对于忠实的端游爱好者来说,能够拥有一款梦寐以求的笔记本电脑是一件十分开心的事。但是现在的
Top