Java对象创建的过程and类加载的过程

学会本篇,还怕没对象吗?

对象创建的流程

1、检查

类加载检查,主要是此对象是否被加载过,检查对象是否有符号引用

2、分配内存

在堆中给对象分配内存。分配内存有两种方式:指针碰撞和空闲列表。使用哪种方式主要取决于Java内存是否规整。指针碰撞适用于内存规整,空闲列表适用于内存不规整。

出个问题考考你:Java内存是否规整和什么有关

答案:垃圾回收算法,不清楚的可以去回顾一下jvm垃圾回收相关知识。

3、设置零值

保证对象实例字段在不初始化时就可以直接使用可以得到字段的类型。

4、设置对象头

详细可以查看对象头的作用。如:对象是哪个类的实例、如何才能找到类的元数据信息、对象的哈希码、对象的 GC 分代年龄等信息。我们都知道在锁升级时,对象头的状态也都是不一样的,这就很关键。

5、初始化

从虚拟机的视角来看,一个新的对象已经产生了,但从 Java 程序的视角来看,对象创建才刚开始。对象根据我们写的程序进行init

类加载的流程

加载

类加载时主要完成这三件事

  • 通过全类名获取定义此类的二进制字节流
  • 将字节流所代表的静态存储结构转换为方法区的运行时数据结构
  • 在内存中生成一个代表该类的 Class 对象,作为方法区这些数据的访问入口

类加载器

  • 启动类加载器(bootstrap class loader)加载Java核心类
  • 扩展类加载器(extensions class loader)加载JRE的扩展目录
  • 系统类加载器(system class loader)加载当前应用 classpath下的类

双亲委派机制

原理:首先会把该请求委派给父类加载器处理,因此所有的请求最终都应该传送到顶层的启动类加载器 BootstrapClassLoader 中。当父类加载器无法处理时,才由自己来处理。

简单来说,比如我们新建Object这个类,但我们在加载的时候只用到启动类加载器加载的Object,而不是系统类加载器加载的Object。

好处:防止核心API库被随意篡改;避免类的重复加载

链接

验证

验证阶段示意图

 以上图片引用自javaGuide

准备

在方法区准备类变量(被static修饰)的内存以及设置变量的初始值。

解析

虚拟机将常量池内的符号引用替换为直接引用的过程

初始化

执行clinit方法

类被GC的条件

需同时满足:

  • 无此类的实例
  • 无此类的引用
  • 此类的类加载器实例被回收
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java中,要加载数据库需要使用JDBC(Java Database Connectivity)驱动程序。以下是加载MySQL数据库的示例代码: 1. 首先,需要下载并安装MySQL JDBC驱动程序。 2. 在Java中,使用以下代码加载驱动程序: ```java Class.forName("com.mysql.jdbc.Driver"); ``` 3. 创建数据库连接对象: ```java Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); ``` 其中,"jdbc:mysql://localhost:3306/mydatabase" 是连接字符串,其中"mydatabase"是数据库名称,"username"是数据库用户名,"password"是数据库密码。 4. 创建Statement对象并执行SQL查询: ```java Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); ``` 其中,"mytable"是数据库表名。 5. 遍历结果集并获取结果: ```java while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); // do something with the data } ``` 6. 关闭数据库连接: ```java rs.close(); stmt.close(); conn.close(); ``` 完整的示例代码如下: ```java import java.sql.*; public class Main { public static void main(String[] args) { try { // Load the MySQL JDBC driver Class.forName("com.mysql.jdbc.Driver"); // Connect to the database Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password"); // Create a statement and execute a query Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM mytable"); // Process the results while (rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); System.out.println(name + " is " + age + " years old."); } // Close the database connection rs.close(); stmt.close(); conn.close(); } catch (Exception e) { e.printStackTrace(); } } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值