什么时候类就被加载完?

首先,"java的类在第一次需要创建类的实例(对象)时被加载"这个说的不对
java中类被使用就就会时就会被加载到内存(比如反射等)

首先要介绍下相关知识(基础知识纯属拷贝):
首先来了解一下jvm(java虚拟机)中的几个比较重要的内存区域
方法区:在java的虚拟机中有一块专门用来存放已经加载的类信息、常量、静态变量以及方法代码的内存区域,叫做方法区。
常量池:常量池是方法区的一部分,主要用来存放常量和类中的符号引用等信息。
堆区:用于存放类的对象实例。
栈区:也叫java虚拟机栈,是由一个一个的栈帧组成的后进先出的栈式结构,栈桢中存放方法运行时产生的局部变量、方法出口等信息。当调用一个方法时,虚拟机栈中就会创建一个栈帧存放这些数据,当方法调用完成时,栈帧消失,如果方法中调用了其他方法,则继续在栈顶创建新的栈桢。
除了以上四个内存区域之外,jvm中的运行时内存区域还包括本地方法栈和程序计数器,这两个区域与java类的生命周期关系不是很大,在这里就不说了,感兴趣可以自己百度一下。

其实类在JVM里面有以下几个阶段:
加载 – 连接 – 初始化 – 使用 – 卸载
主要给你说明卸载:
在类使用完之后可能会被卸载,可能性如下:
如果有下面的情况,类就会被卸载:
1.该类所有的实例都已经被回收,也就是java堆中不存在该类的任何实例。
2.加载该类的ClassLoader已经被回收。
3.该类对应的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问该类的方法。

如果以上三个条件全部满足,jvm就会在方法区垃圾回收的时候对类进行卸载,类的卸载过程其实就是在方法区中清空类信息,java类的整个生命周期就结束了。(转自https://zhidao.baidu.com/question/981904151505254899.html)

SqlSession 是 MyBatis 中的一个核心对象,每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不能被共享,也是线程不安全的,不能将其引用放在的静态字段、实例字段,或者 Servlet 的 HttpSession 对象等管理范围中。它的主要作用是与数据库进行交互,执行 SQL 语句,控制数据库事务等操作 [^1]。 SqlSession 的关闭情况如下: - **手动关闭**:在没有使用 Spring 整合 MyBatis 的情况下,需要手动确保在使用 SqlSession 之后关闭它,一般会使用 `finally` 块来保证这一点。示例代码如下: ```java import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; public class MyBatisExample { public static void main(String[] args) { // 加载 MyBatis 配置文件 String resource = "mybatis-config.xml"; InputStream inputStream = MyBatisExample.class.getClassLoader().getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = null; try { // 打开 SqlSession 会话 sqlSession = sqlSessionFactory.openSession(); // 执行一些增删查改的代码 sqlSession.commit(); // 提交事务 } catch (Exception e) { if (sqlSession != null) { sqlSession.rollback(); // 回滚事务 } e.printStackTrace(); } finally { // 在 finally 语句中确保资源被顺利关闭 if (sqlSession != null) { sqlSession.close(); } } } } ``` - **Spring 整合自动关闭**:当 Spring 整合 MyBatis 时,Spring 一般生成 `SqlSessionTemplate` 用来实现 `SqlSession` 接口,它里面有一个 `sqlSessionProxy`。每次 `SqlSessionTemplate` 执行操作,都是调用的代理对象,进入 `invoke` 方法,会根据是否是事务,获取新的 `SqlSession` 然后执行真正的目标方法,最后执行,会调用 `SqlSession.close` 关闭这个获取的 `SqlSession`。相当于执行一个 `@Transactional` 注解的方法,`invoke` 方法里面新创建的 `SqlSession` 会通过动态代理方式自动执行关闭操作 [^2]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值