JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

    • 所有

    • 核心

    • 源码

    • 算法

    • 高频

      • 笔试基础题
      • MySQL各个版本区别
      • MySQL自身如何处理死锁
      • 为什么是先添加队列而不是先创建最大线程
      • 数据库常用的锁有哪些
      • 生产者和消费者5种实现方式
      • Redis内存管理的基石zmalloc
      • 如何动态修改线程池参数
      • 流量高峰时的性能瓶颈有哪些以及如何来解决
      • Java SPI与Dubbo SPI有什么区别
      • JVM运行时数据区(堆、栈、方法区)指向关系
      • Java new对象过程
        • 解答
      • 池化技术(线程池、连接池、内存池)
      • Spring的三级缓存解决循环依赖
      • K8S面试题大全
      • 服务治理、微服务与Service Mesh
      • SpringBoot自定义starter
      • 限流原理解析
      • Redis部署的三种模式(主从复制、哨兵、集群)
      • 敏感词过滤(DFA算法_Trie前缀树)
      • Java线程间通信方式
      • CPU占用过高排查
      • 线程死锁及解决方案
      • 分布式事务
      • 分布式锁
      • JVM调优
      • Synchronized锁升级(锁膨胀)
      • Paxos、Raft、ZAB协议
  • 算法

  • interview
  • hf
JavaInterview.cn
2022-10-16
目录

Java new对象过程Java

文章发布较早,内容可能过时,阅读注意甄别。

# 解答

由new关键字调用构造方法,返回类实例,达到创建对象目的。先实例化对象,再把对象初始化。

例如 : Person person = new Person();

这句话到底做了什么事情呢?其实就是讲对象的初始化过程。

1、new 用到了Person.class,所以会先找到Person.class文件,并加载到内存中(用到类中的内容类就会被加载)。
2、执行该对象的static代码块(静态初始块)。(如果有的话,给Person.class类进行初始化)
3、在堆内存中分配空间,分配内存地址(指针碰撞和空闲列表)
4、在堆内存中建立对象特有属性,并进行默认初始化
5、对属性进行显示初始化(声明成员属性并赋值)
6、执行普通初始块
7、执行构造函数
8、将内存地址赋值给栈内存中的person变量

在JVM创建一个对象的时候,首先判断当前类是否已经加载,如果类没有加载,需要先执行类加载机制,当加载完成后再为对象分配空间、初始化等等。

类加载过程如下:

加载:读取某个类的class文件到方法区内,并在堆中为这个类创建对应的Class对象,在加载时候可以通过类文件、jar、war包的形式读取;

验证:验证class文件是否符合当前虚拟机的规范;

准备:为类的静态变量(无final修饰)和常量(final修饰)赋默认初始值,放入到方法区中,

值得注意的是,常量直接赋予初始值,设置为多少就赋予多少,比如:private static final int a = 10,那么赋值的时候就是10,而类静态变量在准备阶段要赋值为0,比如private static int a = 10,在准备阶段是把a赋值为0的,在初始化阶段才把a赋值为10;

解析:将类文件中的符号引用替换为直接引用,比如类、方法的信息、文本字符串、声明为final的常量值等等;

初始化:通过类的构造器进行初始化,自动收集静态块的操作和对类静态变量赋予正确的值,比如private static int a= 10,在准备阶段赋值a=0,而在初始化阶段把a改成10。

类加载完成后,就开始创建对象了。

指针碰撞: 假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为指针碰撞。

空闲列表: 如果Java堆中的内存并不是规整的,已被使用的内存和空闲的内存相互交错在一起,那就没有办法简单地进行指针碰撞了,虚拟机就必须维护一个列表,记录上哪些内存块是可用的,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为空闲列表。

微信 支付宝
JVM运行时数据区(堆、栈、方法区)指向关系
池化技术(线程池、连接池、内存池)

← JVM运行时数据区(堆、栈、方法区)指向关系 池化技术(线程池、连接池、内存池)→

最近更新
01
1637. 两点之间不包含任何点的最宽垂直区域 Java
06-26
02
1636. 按照频率将数组升序排序 Java
06-26
03
1638. 统计只差一个字符的子串数目 Java
06-26
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式