HashMap的底层实现 HashMap基于Map接口实现,继承AbstractMap,它存储的内容是键值对(key:value),它的key是唯一的,且key和value都可以为null。此外,HashMap中的映射不是有序的。 HashMap 的实现不是同步的,这意味着它不是线程安全的。如果想要线程安全的HashMap,可以通过Collections类的静态方法synchronized...
7种 JVM 垃圾回收器概览
堆内存详解 上面这个图大家应该已经很明白了吧。大家就可以理解成一个房子被分成了几个房间,每个房间的作用不同而已,有的是婴儿住的,有的是父母住的,有的是爷爷奶奶住的 堆内存被划分为两块,一块的年轻代,另一块是老年代。 年轻代又分为Eden和survivor。他俩空间大小比例默认为8:2, 幸存区又分为s0和s1。这两个空间大小是一模一样的,就是一对双胞胎,他俩是1:1的比...
JVM 的垃圾回收机制
哪些内存需要回收 猿们都知道JVM的内存结构包括五大区域:程序计数器、虚拟机栈、本地方法栈、堆区、方法区。其中程序计数器、虚拟机栈、本地方法栈3个区域随线程而生、随线程而灭,因此这几个区域的内存分配和回收都具备确定性,就不需要过多考虑回收的问题,因为方法结束或者线程结束时,内存自然就跟随着回收了。而Java堆区和方法区则不一样、不一样!(怎么不一样说的朗朗上口),这部分内存的分配和回收是动态...
Spring Bean 循环依赖为什么需要三级缓存
这里指的是单例的、非构造依赖的循环引用。很多人都知道Spring用了三层缓存来解决循环依赖,但是不知道其原因,为什么是三级缓存?二级缓存不行吗?一级缓存不可以 ? 三级缓存 Spring 解决循环依赖的核心就是提前暴露对象,而提前暴露的对象就是放置于第二级缓存中。缓存的底层都是Map,至于它们属于第几层是由Spring获取数据顺序以及其作用来表现的。 三级缓存的说明: ...
JVM类加载机制
类的加载机制 Java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验、转换解析和初始化,最终形成可以被虚拟机直接使用的Java类型,这个过程被称作虚拟机的类加载机制。 类的生命周期 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载,验证,准备,解析,初始化,使用,卸载这7个阶段.其中其中验证、准备、解析3个部分统称为连接. 加载、验证、准备...
Spring Bean 的生命周期
生命周期的概要流程 Spring Bean 的整个生命周期 Google Spring Bean 的生命周期,大多以下图给出的流程作为答案 但是当我第一次看到这个图时,人麻了,“Aware,BeanPostProcessor……这些都是什么啊?而且这么多步骤,太多了,该怎么记啊?”。 其实要记忆该过程,还是需要我们先去理解,本文将从以下两方面去帮助理解 Bean 的生命周期 ...
Java 动态代理实现方法
动态代理作用 静态代理 要说动态代理,必须先聊聊静态代理。 假设现在项目经理有一个需求:在项目现有所有类的方法前后打印日志。 你如何在不修改已有代码的前提下,完成这个需求? 我首先想到的是静态代理。具体做法是: 1.为现有的每一个类都编写一个对应的代理类,并且让它实现和目标类相同的接口(假设都有) 2.在创建代理对象时,通过构造器塞入一个目标对象,然后在代理对象的方法内部调用目...
Ubuntu 安装 Redis 流程
Redis 是一个开源的在内存存储键值对数据的存储程序。它可以被用作数据库,缓存,信息暂存,并且支持各种数据结构,例如:字符串,哈希值,列表,集合等等。 Redis 通过 Redis Sentinel 和 Redis 集群中多个 Redis 节点的自动分块处理,提供了高可用性。 这篇文章描述了如何在 Ubuntu 20.04 上安装和配置 Redis。 安装 Redis 在 Ubuntu...
Ubuntu 安装 JDK 流程
在篇文章,将会描述如何在 Ubuntu 20.04 上安装 Java。 开始之前 有很多不同的 Java 实现。OpenJDK 和 Oracle Java 是最主要的两个 Java 实现,除了 Oracle Java 拥有极少的一些额外特性之外,它们两个基本没有什么不同。 Oracle Java 授权仅仅允许作为非商业软件的使用,例如:个人用途和开发用途。 默认的 Ubuntu 20.0...
使用 SpringBoot 发送邮件
依赖 Java 发送邮件依赖 jakarta 项目(原 javaEE)提供的 jakarta.mail 组件, Maven 坐标: <dependency> <groupId>com.sun.mail</groupId> <artifactId>jakarta.mail</artifactId> ...