Java基础——线程池

Java支持多线程,虽然启动一个新线程很容易,但是创建线程需要向操作系统申请资源,消耗大量时间,因此便有了线程池。线程池是池化技术的一种使用,池化技术指的是提前准备一定的资源,只要池中有足够的资源,在需要时可以随时从池中取出资源使用,使用完后将资源归还到池中。池化技术带来了显著的优点:主要是可重复使用资源,避免动态创建资源、释放资源带来的额外开销和等待时间。在服务器资源有限的情况下,使用池化技术可以提高资源的利用率,从而提升性能。池化技术比较典型的用途有:连接池、线程池、内存池、对象池。

Read More

Java基础——线程

进程和线程是操作系统中的两个基本概念,进程是操作系统中资源分配的基本单位,拥有独立的内存空间、资源和进程控制块;线程则是进程内的执行单元,是处理器调度的基本单位,不拥有系统资源,可以访问隶属于进程的资源。线程是进程的基本组成单位,一个程序至少有一个进程,一个进程至少有一个线程;线程之间可以共享内存和资源,从而提高程序的并发性和执行效率;在多核处理器系统中,多个线程可以在不同的核心上并行执行,充分利用计算机的资源。

Read More

ID 生成方案

通常情况下,一个应用可以直接使用数据库的自增主键 ID 作为生成方案,这种做法既方便又通过数据库唯一约束避免了 ID 冲突的问题。但这种具有连续性的ID会暴露平台的数据量,并且在数据量过大进行分库分表后,就无法依赖数据库的自增 ID 作为生成方案了。如何在这种情况下生成一个全局唯一的ID呢?

Read More

Java类加载

一个 Java 应用在主动使用某个类时,如果该类还未加载到内存中,那么会由类加载器读取指定的 class 文件加载该类、链接、然后由 JVM 对该类进行初始化。

Read More

Java基础——JVM

Java 是高级语言的其中一种,要把高级语言转换为计算机可以识别的机器码需要经过解释或者编译处理。编译的过程就是通过编译器把高级语言代码翻译成可以被机器执行的机器码(如C语言),解释的过程就是通过解释器直接解释执行(如PHP、Javascript),不需要编译成机器语言。但是现代高级语言很难简单的用“编译型”、“解释型”来区分,代码执行过程中并不是只有其中一种行为。

在 Java 中,为了实现跨平台以及提升运行速度,需要先将源代码使用 javac 编译成 Java 字节码,这个字节码并不能被计算机直接识别,需要使用 Java 虚拟机 JVM 来解释执行。JVM 在解释执行代码的过程中,如果发现某个方法或代码块运行频繁,会认为这是热点代码(Hot Spot Code),被标记为热点代码的部分在运行时被动态地编译程序(JIT)转换为本地机器码,以便直接在CPU上执行,而无需再次解释执行。除了 JIT 之外, JDK17 支持的 AOT 编译也可以直接将 Java 代码编译为计算机可以直接识别执行的机器码。

Read More

ElasticSearch分页查询

Elasticsearch 是一个分布式的搜索与分析引擎,它的部分使用经典场景与关系型数据库(在本篇文章中以 MySQL 举例)非常相似,比如分页、遍历等。

在分页场景下,数据库需要遍历全表读取,然后根据参数跳过舍弃指定条数的记录,最终返回数据,在页码较大的深度分页场景时,数据库的响应时间较长,且会占用较多的服务器资源。Elasticsearch 中也同样如此,Elasticsearch 会聚合、遍历整个索引读取文档,然后舍弃指定条数的文档,最终返回数据,此过程也将占用较多的服务器资源。因此不管是在关系型数据库中还是 ElasticSearch ,在分页场景下应该尽量避免使用普通的分页查询进行深度分页读取较后的数据。

Read More

ElasticSearch数据类型与映射

不同版本的 ElasticSearch API 可能有所区别,本文基于 7.17 版本。ElasticSearch 有三个重要的概念,索引、映射、文档,本文介绍 ElasticSearch 的映射。映射是用来用来定义文档及其字段的存储方式、索引方式的手段,与关系型数据库中的表结构类似,可以从映射信息中得知索引下有哪些字段,字段的数据类型以及有哪些约束信息。

Read More