发表于: 2025-04-17 20:53:00
0 80
今天完成的事情
JVM运行以及内存分配
JVM(Java虚拟机)是运行Java程序的核心组件
JVM运行原理:
类加载器子系统):负责加载、链接和初始化类或接口。
方法区:存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。
堆:所有对象实例和数组都要在堆上分配,是垃圾收集器管理的主要区域。
Java栈:每个线程都有一个私有的栈,其生命周期与线程相同。栈中的数据以栈帧为单位,每个方法对应一个栈帧,用于存储局部变量表、操作数栈、动态链接、方法出口等信息。
程序计数器:每个线程也有自己的程序计数器,指示当前线程所处的字节码指令位置。
本地方法栈:类似于Java栈,但它是为本地方法(用C语言等编写的方法)服务的。
执行引擎:执行编译后的字节码或者直接解释执行字节码,包括即时编译器(Just-In-Time Compiler)、解释器(Interpreter)等组件。
内存分配
堆内存:主要用于存放对象实例和数组,是GC(垃圾回收)的主要区域。
栈内存:每个线程启动时都会创建一个独立的栈,主要用来存储栈帧,栈帧中包含了局部变量表、操作数栈等信息。栈内存的空间相对较小,但访问速度较快。
jdbc连接池原理及分析
初始化连接池:当应用程序启动时,连接池会根据配置预先创建一定数量的数据库连接,并将这些连接保存在池中。这些连接是空闲的,等待被应用程序使用。
获取连接:当应用程序需要访问数据库时,从连接池中请求一个可用的连接。如果池中有可用的连接,则立即返回给应用程序;如果没有可用的连接,且连接数未达到最大限制,可能会创建新的连接;否则,请求可能需要等待直到有连接被释放回池中。
使用连接:应用程序使用获得的连接执行SQL查询或更新操作。完成数据库操作后,连接不会被关闭,而是被归还到连接池中以供后续重用。
释放连接:当应用程序完成数据库操作后,它调用相应的API(通常是close()方法)来“关闭”连接。实际上,这里的关闭并不意味着物理上的断开连接,而是将连接标记为可重用,并返回到连接池中等待下一次请求。
连接回收与清理:连接池通常会定期检查并清理那些长时间未使用的连接(即空闲连接),或者在连接出现故障时进行处理,确保连接的有效性。
什么叫反射?反射的坏处是什么?有哪些反射的应用场景?
什么是反射?
反射(Reflection)是程序在运行时检查或修改其结构和行为的能力。在Java中,反射允许程序在运行时动态地获取类的信息(如类名、方法、字段等),并且可以在运行时调用对象的方法或者访问对象的字段,即使这些信息在编译时期是未知的。
通过反射,你可以:
- 在运行时获取类的信息,包括类的名字、父类、接口等。
- 获取类中的构造器、方法、字段等,并能够创建对象、调用方法或访问字段。
- 动态地调用方法或访问属性,即便它们是私有的。
反射的坏处
尽管反射功能强大,但它也有一些缺点:
- 性能问题:使用反射会比直接代码执行慢,因为它需要额外的时间来处理类型信息。特别是查找方法和字段的过程较为耗时。
- 安全限制:反射可以绕过封装(Encapsulation),例如访问和修改私有成员变量或方法,这可能会破坏类的内部逻辑和设计意图。
- 复杂性增加:使用反射会使代码更加复杂难懂,增加了维护成本。此外,错误可能更难以调试。
- 破坏了面向对象编程的封装原则:通过反射可以直接访问甚至修改一个类的私有成员,这违背了面向对象编程的原则之一——封装。
反射的应用场景
尽管存在上述缺点,反射依然有许多重要的应用场景:
- 框架开发:许多框架利用反射来实现依赖注入(如Spring)、ORM映射(如Hibernate)等功能。这些框架需要在运行时动态加载类并调用方法。
- 工具和库:一些开发工具和库需要使用反射来提供通用的功能,比如序列化/反序列化、测试框架(JUnit)等。
- 动态代理:Java中的动态代理机制允许在运行时创建一个实现了一组给定接口的新类,这对于AOP(面向切面编程)非常有用。
- 调试和日志记录:在某些情况下,为了调试或记录日志的目的,可能需要使用反射来访问对象的状态。
- 插件系统:在支持插件扩展的应用程序中,反射可以用来加载和实例化插件,而不需要硬编码插件的具体类名。
Mybatis有哪些常用标签?怎么使用标签来完成动态查询?
基础标签:<select>, <insert>, <update>, <delete>
结果映射:<resultMap>, <result>, <association>, <collection>
动态SQL:<if>, <choose>/<when>/<otherwise>, <where>, <set>, <foreach>
什么是AOP,适用于哪些场景,AOP的实现方案有哪些?
什么是AOP?
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,旨在通过分离横切关注点(cross-cutting concerns)来提高模块化程度。横切关注点指的是影响多个模块的功能,比如日志记录、事务管理、安全性检查等。在传统的OOP中,这些功能往往需要在多个类或方法中重复实现,而AOP允许开发者将这些通用的功能集中定义,并以声明的方式应用到需要的地方。
AOP适用于哪些场景?
AOP特别适合处理那些散布于应用程序多处的通用功能,主要包括:
- 日志记录:记录系统的行为以便于调试和监控。
- 事务管理:确保一组操作要么全部成功,要么全部回滚,保持数据一致性。
- 安全性检查:验证用户权限,防止未授权访问。
- 性能监控:收集系统的运行时性能数据,用于分析和优化。
- 缓存控制:根据特定规则自动管理数据缓存,减少数据库访问次数。
- 异常处理:统一处理异常,避免代码中充斥着try-catch块。
明天计划的事情:(一定要写非常细致的内容)继续学习深度思考
遇到的问题:(遇到什么困难,怎么解决的)
收获:(通过今天的学习,学到了什么知识)更加了解Java相关知识
评论