jvm简介与内存架构
JVM更多信息查看官网 简介JVM,全称是 Java Virtual Machine,Java运行环境(Java二进制字节码的运行环境) 优点: 是Java一次编写,到处运行的基石。 自动内存管理,垃圾回收功能 数组下标越界检查 多态 JVM有很多,常见的JVM有:HotSpot Opent JDK edition(平时使用的)、Eclipse OpenJ9等 内存架构程序计数器Program Counter Register,程序计数器(寄存器):作用是记住下一条jvm指令的执行地址,在物理上,是通过cpu中的寄存器来实现的。他是线程私有,且是唯一一个不会存在内存溢出的区域。 工作流程:java源码编译为二进制字节码,字节码中包含jvm指令,这些指令交给解释器->机器码->CPU执行。 1234567891011121314151617181920// 二进制字节码 java 源代码// 其中iconst_x 就是程序计数器0: getstatic #20 | PrintSt...
Spring Bean
Spring Bean在 Spring 中,构成应用程序主体由 Spring IoC 容器管理的对象称为 Bean。Bean 是由 Spring IoC 容器实例化、装配和管理的对象。 Bean 以及它们之间的依赖关系反映在容器使用的配置元数据中。 Spring Bean 定义BeanDefinitionSpring IoC 容器本身,并不能识别配置的元数据。为此,要将这些配置信息转为 Spring 能识别的格式——BeanDefinition 对象。 BeanDefinition 是 Spring 中定义 Bean 的配置元信息接口,它包含: Bean 类名 Bean 行为配置元素,如:作用域、自动绑定的模式、生命周期回调等 其他 Bean 引用,也可称为合作者(Collaborators)或依赖(Dependencies) 配置设置,如 Bean 属性(Properties) BeanDefinition 元信息BeanDefinition 元信息如下: 属性(Property) 说明 Class 全类名,必须是具体类,不能用抽象类或接口 Name Bea...
理解 Java 类加载器
深度理解 Java SPISPI 简介SPI 全称 Service Provider Interface,是 Java 提供的,旨在由第三方实现或扩展的 API,它是一种用于动态加载服务的机制。它的作用是让程序能够自动发现、加载和使用第三方提供的实现,从而实现基于接口的解耦和可插拔的扩展架构。 Java SPI 有四个要素: SPI 接口:为服务提供者实现类约定的接口或抽象类。 SPI 实现类:实际提供服务的实现类。 SPI 配置:Java SPI 机制约定的配置文件,提供查找服务实现类的逻辑。配置文件必须置于 META-INF/services 目录中,并且,文件名应与服务提供者接口的完全限定名保持一致。文件中的每一行都有一个实现服务类的详细信息,同样是服务提供者类的完全限定名称。 ServiceLoader:Java SPI 的核心类,用于加载 SPI 实现类。 ServiceLoader 中有各种实用方法来获取特定实现、迭代它们或重新加载服务。 SPI 示例 定义接口需要定义一个 SPI 接口,和普通接口并没有什么差别。 123public interface Dat...
Spring Framework 综述
Spring Framework 综述更多教程可以查看:官方教程文档 Spring Framework 简介Spring Framework 是最受欢迎的企业级 Java 应用程序开发框架。用于构建企业级应用的轻量级、一站式解决方案。 核心思想Spring 最核心的两个技术思想是:IoC 和 Aop IoCIoC 即 Inversion of Control ,意为控制反转。 Spring 最认同的技术是控制反转的 依赖注入(DI) 模式。控制反转(IoC)是一个通用的概念,它可以用许多不同的方式去表达,依赖注入仅仅是控制反转的一个具体的例子。 当编写一个复杂的 Java 应用程序时,应用程序类应该尽可能的独立于其他的 Java 类来增加这些类可重用可能性,当进行单元测试时,可以使它们独立于其他类进行测试。依赖注入(或者有时被称为配线)有助于将这些类粘合在一起,并且在同一时间让它们保持独立。 到底什么是依赖注入?让我们将这两个词分开来看一看。这里将依赖关系部分转化为两个类之间的关联。例如,类 A 依赖于类 B。现在,让我们看一看第二部分,注入。所有这一切都意味着类 B 将通过 I...
Java 编码和加密
Java 编码和加密Base64 编码Base64 原理Base64 内容传送编码是一种以任意 8 位字节序列组合的描述形式,这种形式不易被人直接识别。 Base64 是一种很常见的编码规范,其作用是将二进制序列转换为人类可读的 ASCII 字符序列,常用在需用通过文本协议(比如 HTTP 和 SMTP)来传输二进制数据的情况下。Base64 并不是加密解密算法,尽管我们有时也听到使用 Base64 来加密解密的说法,但这里所说的加密与解密实际是指编码(encode) 和 解码(decode)的过程,其变换是非常简单的,仅仅能够避免信息被直接识别。 Base64 算法主要是将给定的字符以字符编码(如 ASCII 码,UTF-8 码)对应的十进制数为基准,做编码操作: 将给定的字符串以字符为单位,转换为对应的字符编码。 将获得字符编码转换为二进制 对二进制码做分组转换,每 3 个字节为一组,转换为每 4 个 6 位二进制位一组(不足 6 位时低位补 0)。这是一个分组变化的过程,3 个 8 位二进制码和 4 个 6 位二进制码的长度都是 24 位(3*8 = 4*6 = 24)。...
SpringBoot 知识清单
SpringBoot 知识图谱 预警:本文非常长,建议先 mark 后看,也许是最后一次写这么长的文章 说明:前面有 4 个小节关于 Spring 的基础知识,分别是:IOC 容器、JavaConfig、事件监听、SpringFactoriesLoader 详解,它们占据了本文的大部分内容,虽然它们之间可能没有太多的联系,但这些知识对于理解 Spring Boot 的核心原理至关重要,如果你对 Spring 框架烂熟于心,完全可以跳过这 4 个小节。正是因为这个系列的文章是由这些看似不相关的知识点组成,因此取名知识清单。 在过去两三年的 Spring 生态圈,最让人兴奋的莫过于 Spring Boot 框架。或许从命名上就能看出这个框架的设计初衷:快速的启动 Spring 应用。因而 Spring Boot 应用本质上就是一个基于 Spring 框架的应用,它是 Spring 对“约定优先于配置”理念的最佳实践产物,它能够帮助开发者更快速高效地构建基于 Spring 生态圈的应用。 那 Spring Boot 有何魔法?自动配置、起步依赖、Actuator、命令行界面(CL...
commons-io 框架
IO框架commons-io 框架jar官网下载地址:https://commons.apache.org/proper/commons-io/download_io.cgi其中doc的jar解压之后,就是api文档。这是maven方式: 12345<dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.16.1</version></dependency> 该框架提供了相关工具类: FileUtils 方法签名 说明 public static void copyFile(File srcFile, File destFile) 复制文件 public static void copyDirectory(File srcDir, File destDir) 复制文件夹 public static void deleteDi...
java 高级
Java 高级数据结构数组、列表、集合、映射、栈、队列、堆、树。 Java 集合框架 点击查看UML图 类型 描述 特点 常用实现类 Collection 单列数据集合的根接口 存储一组对象的容器 (它下面有List和Set) List 有序、可重复的集合 有索引,允许重复,元素有顺序 ArrayList, LinkedList, Vector Set 唯一、无序的集合 无索引,不允许重复元素,不保证顺序 HashSet(无序), LinkedHashSet(有序), TreeSet(升序) Map 双列数据的集合 存储键值对(Key-Value),Key唯一,排序由key决定 HashMap(无序), LinkedHashMap(有序), TreeMap(升序), Hashtable Collections 操作集合的工具类 提供了一系列静态方法,用于对集合进行排序、搜索、线程安全化等操作 (这是一个工具类,不是接口) 单列集合遍历 iterator 12345678List<Integer> list = new ArrayLis...
java 面向对象
面向对象 五大基本原则:单一职责原则(Single-Responsibility Principle)、开放封闭原则(Open-Closedprinciple)、Liskov替换原则(Liskov-Substituion Principle)、依较倒置原则(Dependency-lnversionPrinciple)和接口隔离原则(Interface-Segregation Principle)。 单一职责原则: 一个类最好只做一件事开放封闭原则: 对扩展开放、对修改封闭里氏替换原则: 子类必须能够替换其基类依赖倒置原则: 程序要依赖于抽象接口,而不是具体的实现接口隔离原则: 使用多个小的专门的接口,而不要使用一个大的总接口 Java继承继承的概念继承就是子类继承父类的特征和行为,使得子类对象(实例)具有父类的实例域和方法,或子类从父类继承方法,使得子类具有父类相同的行为。 继承的特性 子类拥有父类非 private 的属性、方法 子类可以拥有自己的属性和方法,即子类可以对父类进行扩展。 子类可以用自己的方式实现父类的方法。 Java 的继承是单继承,但是可以多重继承,单继承就...
js 问题记录
时区问题处理问题描述:程序时间全局使用的 new Date(),在国内一切正常,但是在国外,就出问题了。最后追踪其根本原因为 new Date(‘xxxx/x/x’).getTime() 在不同时区返回的时间戳不一致,导致查询数据失败。 如:new Date("2025/8/1").getTime() 的解析依赖于客户端时区 北京 (UTC+8):解析为 2025-08-01 00:00:00 GMT+0800 纽约 (UTC-4):解析为 2025-08-01 00:00:00 GMT-0400。 结论:相同字符串在不同时区返回不同时间戳(相差时区偏移) 解决方法: 123456function toUTCTimestamp(dateString) { const [year, month, day] = dateString.split('/').map(Number); // 使用 Date.UTC 创建 UTC 时间戳,month - 1是因为 UTC 方法是从 0 开始计算。 减去 8 小...