Java虚拟机(JVM)的生命周期
Java虚拟机(JVM)的生命周期涵盖了从启动到退出的整个过程,包括以下几个主要阶段: 启动 (Startup) JVM的启动通常是由用户执行一个Java应用程序开始的,例如通过命令行输入java [类名]或调用API启动。 启动过程中,操作系统创建一个新的进程,并加载特定实现的JVM实例。引导类加载器(Bootstrap Class Loader)首先加载核心Java类库(如rt.jar),然后根据指定的主类(包含main()方法的类)找到并加载这个类。 JVM初始化内存区域和子系统,如堆、栈、方法区等。 类加载与初始化 (Class Loading and Initialization) 当JVM需要使用某个类时,类加载机制会启动,按照双亲委派模型加载对应的字节码文件(.class文件)到方法区中。 类的生命周期包括:加载(查找并读取类的二进制数据)、验证(确保类信息符合JVM规范且不危害虚拟机安全)、准备(为静态变量分配内存并初始化默认值)、解析(将符号引用转换为直接引用)、初始化(执行类初始化代码,即static块和静态字段赋值)。 程序执行...
字节码与执行引擎
Java虚拟机(JVM)字节码与执行引擎是Java平台实现“一次编写,到处运行(Write Once, Run...
类加载机制
JVM(Java虚拟机)内存加载流程主要指的是类加载机制,即Java类从磁盘上的.class文件或其他来源被加载到JVM内存中并成为可执行类的过程。以下是JVM类加载的详细步骤: 加载(Loading): 当程序首次主动使用某个类时(如调用new操作符创建实例、访问静态成员或调用类的静态方法等),JVM的类加载器子系统开始工作。 类加载器根据类的全限定名查找对应的.class文件或其他类定义资源。 将找到的.class文件字节流读入内存,并在内存的方法区内存空间内创建一个代表该类的Class对象。 在Java...
IOC容器
IOC容器(Inversion of Control Container)是Spring框架的核心部分,它体现了控制反转(Inversion of Control,...
spring框架
Spring框架是一个开源的Java平台,由Rod Johnson创建并在2003年首次发布。它是一个全面的Java应用程序框架,旨在简化企业级应用的开发,尤其是对于Java EE应用程序。Spring框架通过提供一系列非侵入式的基础设施支持,包括依赖注入(Dependency Injection, DI)、面向切面编程(Aspect Oriented Programming,...
spring简介
spring 名词解释 Bean Bean最初是为定义可重用的组件而生. Bean 传统Java Bean EJB Enterprise Java Beans 企业javabeans POJO (Plain Old Java Object) 易用的老的Java类,简单洁净Java对象 DI (Dependency injection) 依赖注入 使用对象或者类时,需要其他对象或者类的协助.一般做法为对象内部直接创建所需对象的实例. 这样使得对象和对象之间耦合紧密. 在对象内部获取一个依赖对象的接口,在使用此对象时,使用其他方式将此对象依赖的对象注入到此对象中. 这样此对象就不知道它依赖的具体实现,降低耦合. AOP 面向切面编程 将业务逻辑从应用服务(监控,事务管理,日志等)中分离出来,实现高内聚. Spring Spring容器,包含并管理应用对象的生命周期和配置 Application Context 上下文 ORM (Object Relational Mapping) JMX 管理扩展 JCA 连接器API MVC (Model View Controller) JMS...
事务管理
Spring框架为Java应用程序提供了强大的事务管理能力,允许开发人员轻松地管理数据库事务,确保数据的一致性和完整性。Spring事务管理支持两种主要模式:编程式事务管理和声明式事务管理。 编程式事务管理(Programmatic Transaction Management) 在编程式事务管理中,开发人员在代码层面显式地管理事务的开启、提交和回滚。Spring提供了PlatformTransactionManager接口来实现这一功能,开发人员通过获取事务管理器的实例,手动调用begin、commit、rollback等方法来控制事务边界。 12345678910111213141516171819@Autowiredprivate PlatformTransactionManager transactionManager;public void someTransactionalMethod() { TransactionDefinition def = new DefaultTransactionDefinition(); ...
面向切面编程AOP
面向切面编程(Aspect-Oriented Programming,AOP)是一种编程范式,它允许程序员对横切关注点(cross-cutting concern)进行模块化的管理。所谓横切关注点,是指那些跨越多个对象或类,与业务逻辑本身无关,但却影响整个系统的行为或性能的共同需求,例如日志记录、权限控制、事务管理、性能监控等。 在传统的面向对象编程(Object-Oriented Programming,OOP)中,这些横切关注点通常分散在各个业务逻辑类的方法中,导致代码重复和耦合度增加。而AOP通过引入“切面”(Aspect)的概念,将这些横切关注点从主业务逻辑中分离出来,单独编写并编织(weave)到主业务流程中,从而实现模块化和解耦。 AOP的核心概念包括: 切面(Aspect): 切面是关注点的模块化表示,它包含通知(advice)、连接点(join point)和切入点(pointcut)的定义。 连接点(Join Point): 连接点是程序执行过程中明确的点,比如方法调用、异常抛出、字段修改等。在Spring...
ArrayList中为什么子列表和原始列表会互相影响,如何避免这种影响
在 Java 中,ArrayList.subList()方法返回的子列表并不是一个独立的副本,而是一个视图(view),它指向原始列表中的某个范围。这意味着对子列表的操作实际上会直接反映到原始列表上,因为它们共享相同的底层数据结构。 例如,在给出的代码片段中: 1234List<Integer> integerList = new ArrayList<>();// ... 添加元素 ...List<Integer> subList = integerList.subList(0, 2);subList.set(0, 10); // 这将改变integerList的第一个元素 当调用subList.set(0, 10)时,虽然操作的是子列表,但实际上是更改了原始列表integerList在对应索引位置上的值。 为了避免这种影响,如果你需要对列表的部分内容进行修改而不影响原始列表,可以创建子列表的一个深拷贝(deep copy)而不是使用视图。例如,你可以使用ArrayList的构造函数来复制子列表: 12List<Integer>...
ArrayList扩容原理
Java 中ArrayList的扩容原理是在其内部数组无法容纳更多元素时,会创建一个新的更大的数组,并将原有数组中的所有元素复制到新数组中。具体过程如下: 初始容量与默认容量: ArrayList在初始化时不指定大小的情况下,默认容量为 10(即DEFAULT_CAPACITY = 10)。 当使用无参构造函数创建一个空ArrayList时,它会初始化一个空数组引用。 添加元素与自动扩容: 当通过add()方法添加元素,且当前存储元素的实际数量(size)等于当前数组的容量时,需要进行扩容操作。 扩容机制通常是将现有容量翻倍,也就是新的容量为原来的两倍加上一定的增长量(通常就是原容量)。扩容计算公式可以是:newCapacity = oldCapacity + (oldCapacity >> 1) 或者 newCapacity = oldCapacity * 1.5 + 1(取决于不同的 Java...