- 博客(275)
- 收藏
- 关注
原创 Java线程池
1.2. 线程池组件线程池测试代码2.2 超时等待上面线程池中的worker线程获取blockingqueue的时候,即使阻塞队列中没有任务,也会一直死等,并不会结束阻塞队列线程池测试代码2.3 生产者-超时设置当阻塞队列中已满,并且核心线程都在工作的时候,生产者线程提供的任务就会进行等待让任务生产者自己决定该如何执行阻塞队列线程池测试代码JDK线程池1. 类图3.2 核心线程和救急线程3.3 JDK拒绝策略如果线程达到最大线程数,救急
2022-11-20 10:10:03
710
原创 Java锁对象
1.2 Mark Word3.3 锁膨胀在尝试轻量级加锁时,cas无法成功可能因为:其他线程为此对象加上了轻量级锁(有竞争),这时进行锁膨胀,锁变为重量级锁轻量级锁没有阻塞机制,重量级锁有阻塞机制3.4 自旋优化-重量级锁4. 锁消除4.1 消除4.2 逃逸分析如果锁对象可能逃逸,那么就不会进行锁优化5. 锁粒度细化5.1 单锁一间屋子两个功能:睡觉,学习,互不影响(不同的方法不会访问同一个资源)如果用一个屋子(一个对象锁)的话,并发度很低5.2
2022-11-20 10:05:07
2095
原创 多线程入门
终止正常执行的线程的优雅的模式:留下料理后事的机会# 1. 错误思路一: stop() 已经被废弃stop会真正kill线程,如果这时线程锁住了共享资源,那么当该线程被杀死后,再也没有机会去释放锁,其他线程将永远无法获取锁 # 2. 错误思路二: System.exit() 目的仅仅是停止一个线程,但这种做法会将当前线程所在的整个java程序终止。
2022-11-20 10:02:26
486
原创 MYSQL优化
一、慢查询日志MYSQL的满查询日志,用来记录在MYSQL中响应时间超过阈值的语句,具体指运行时间超过long_query_time值的SQL,则会被记录到慢查询日志中long_query_time默认值是10s帮助定位执行时间较长的SQL查询,再通过EXPLAIN来分析,从而定位问题默认MYSQL没有开启慢查询日志,需要手动开启。如果不是调优需要,一般不建议启动该参数,因为开启慢查询日志会对性能带来一定影响1. 开启慢查询# 默认是OFFSHOW VARIABLES LIKE '%slo
2022-05-29 23:46:08
248
原创 MYSQL-索引
一、索引1. 创建1.1 创建表时# 普通索引CREATE TABLE cnip( id int, name varchar(20), INDEX idx_name (name) # 索引名/作用列);# 唯一索引CREATE TABLE cnip( id int, name varchar(20), UNIQUE INDEX idx_name (name) # 索引名/作用列);# 主键索引# 通过定义主键约束的方式CR
2022-05-29 16:33:25
479
原创 三、存储引擎
一、基本介绍1. 基本存储引擎(表处理器)就是不同的表结构接收上层传来的指令,对表中的数据进行读写操作创建表时,每个表都会有不同的表文件结构,每个表都会对应自己的存储引擎SHOW ENGINES;# Support: 当前mysql是否支持# Transactions: 是否支持事务 MYISAM不支持事务# XA: 是否支持分布式事务 MYISAM不支持分布式事务-- 查看系统默认的
2022-05-25 14:57:43
104
原创 二、MYSQL逻辑架构
一、 Server端/Client端# Server端- mysqld,一般安装在Linux主机服务器上- 存储具体的数据- 监听网络客户端的请求,并根据请求去读写数据库数据,将结果返回给客户端# Client端- 链接数据库,发送sql请求到服务端,将服务端拿到的结果显示在页面上- 如Navicat是Client端的GUI界面,本身不存储数据,去访问Server端数据- 安装mysql后,自带命令行,其实就是进入了mysql的客户端界面- 或者java application通过c
2022-05-24 22:59:41
263
原创 一、字符集编码/权限处理
一、字符集1. 默认设置MYSQL 5.7默认字符集为latin, MYSQL 8.0默认为utf8mb4utf8(utf8mb3): 阉割过的utf8字符集,使用1-3个字节表示字符utfmb4: 正宗的utf8字符集,使用1-4个字节表示字符(比如emoji表情)-- 1. 查看SHOW VARIABLES LIKE 'character%';character_set_client,utf8mb4 # 客户端发送请求时候用的数据编码character_
2022-05-22 20:49:01
266
原创 垃圾回收器性能指标
一、分类1. 线程数2. 工作模式并发式垃圾回收器: 垃圾回收器和应用线程交替工作,尽可能减少应用程序的停顿时间独占式垃圾回收器: STW,一旦运行,就停止应用程序中的所有的用户线程,直到垃圾回收过程完全结束3. 碎片整理压缩式垃圾回收器: 会在回收完成后,对存活对象惊醒压缩整理,消除回收后的碎片。指针碰撞来分配新的对象非压缩式垃圾回收器:不会进行这个步骤,按照空闲列表来进行分配4. 工作区域年轻代回收器和老年代回收器二、性能指标以下三者组成一个不可能三角1. 吞
2022-05-08 20:15:27
650
原创 JVM垃圾回收概念
一、System.gc()- 默认,通过System.gc() 或 Runtime.getRuntime().gc(), 会触发 Full GC Full GC 会同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存- 无法保证堆垃圾收集器的调用, 可以通过 重写finalize()来判断- 一般情况下,垃圾回收自动进行,无须手动触发 特殊情况下,可以显示调用来做基准测试二、内存泄漏/内存溢出1. 内存溢出(OOM)1. 应用程序占用的内存增长速度快,快速占用了JVM的所有内
2022-05-08 17:30:23
356
原创 JVM垃圾回收
哪些内存需要回收?什么时候回收?如何回收?一、基本概念1. 垃圾在运行程序中,没有任何指针指向的对象,就是需要被回收的垃圾如果不及时对内存中的垃圾进行清理,那么就会一直占用内存空间,被保留的空间无法被其他对象使用,就会导致内存溢出2. 垃圾回收的意义如果不进行垃圾回收,内存迟早都会被消耗完毕除了释放没用的对象,垃圾回收也可以清理内存中的记录碎片。碎片整理将所占用的堆内存移到堆的另一端,以便JVM将整理出的内存分配给新的对象业务的逐渐复杂,没有GC就不能保证应用程序的正常进行。同.
2022-05-04 00:47:12
745
原创 JVM-String
一、基本特性1. 不可变性String 类: - 类被final修饰,不能被继承 - 类中所有的属性被final修饰,不能去修改1. 当对字符串重新赋值时,需要重写制定内存区域赋值,不能使用原有的value进行赋值2. 当对现有的字符串进行连接操作时,需要重新制定内存区域赋值,不能使用原有的value进行赋值3. 当调用String 的replace方法修改制定字符或字符串时,需要重新制定内存区域赋值,不能使用原有的value进行赋值- 通过字面量的方式(区别于new)给一个
2022-05-01 18:49:20
380
原创 JVM执行引擎
一、编译过程1. 后端编译解释器(Interpreter): - Java虚拟机启动后,根据预定义的规范,对字节码采用逐行解释的方式执行 - 将每条字节码文件中的内容翻译为对应平台的本地机器指令执行JIT(Just In Time Compiler)编译器: - 虚拟机将源代码直接编译成和本地机器相关的机器语言2. 机器码1. 采用二进制编码方式表示的指令,叫做机器指令码。一开始就是直接用这种方式来编程2. 机器语言被计算机理解接受,但和人类语言差别太大,编程容易出错3. 编写的
2022-05-01 15:47:47
1949
原创 JVM创建对象
一、创建对象1. 方式1. new - 直接使用 - xxx的静态方法 - Builder和 Factory2. 反射 - Class的newInstance: 只能空参构造器,public,已经逐渐被丢弃 - Constructor的newInstance: 空参,带参,权限不做限定3. clone - 不调用任何构造器 - 该类实现Cloneable接口,实现clone 4. 实现反序列化: 从文件中,网络中获取一个对象的二进制流 2. 创建
2022-04-30 15:33:47
532
原创 JVM运行时数据区(方法区/元空间 )
一、基本介绍JDK8以前叫做方法区,JDK8以后叫元空间1. 堆,栈,元空间关系2. 位置JVM规范: 所有的方法区在逻辑上是属于堆的一部分,但一些JVM 的实现,可能不去选择进行垃圾收集或压缩HotSpotVM: 方法区/元空间/metaspace/非堆/Non-Heap: 目的就是和堆分开方法区可以看作是一块独立于Java堆的内存空间3. 基本概念- 各个线程共享的内存区域- JVM启动时,方法区创建,物理内存可以不连续,逻辑内存必须连续- 方法区大小可以选择固定大
2022-04-29 23:37:02
725
原创 JVM运行时数据区(堆内存)
一、基本介绍栈管运行,堆管存储一一对应1. 一个java进程对应一个jvm实例2. 一个jvm实例对应一个Runtime类3. 一个Runtime类对应一个堆空间1. 基本概念1. Java堆区在Jvm启动后就会被创建,其空间大小就确定了2. JVM管理的最大的一块内存空间, 空间大小可以调节3. 堆可以出于物理上不连续的内存空间,但在逻辑上它应该视为连续的4. 所有的线程共享java堆 细分:(线程私有的缓冲区(Thread Local Allocaation Buffe
2022-04-26 23:10:16
782
原创 JVM运行时数据区(栈)
一、栈栈: 1. 是运行时的单位 2.解决程序的运行问题,程序如何执行,如何处理数据堆: 1. 存储的单位 2. 堆解决的问题是数据存储的问题, 存在哪儿?如何存?1. 基本介绍JAVA虚拟机栈(JAVA栈) 每个线程在创建的时候,都会创建一个虚拟机栈, 栈内部保存一个个的栈帧(Stack Frame), 对应着一次次的java方法调用 是线程私有的 - 生命周期和线程一致- 主管java程序的运行,保存方法的局部变量,部分结果,参与方法的调用和返回
2022-04-24 10:04:44
285
原创 JVM运行时数据区(一)
一、基本红色部分:会随着虚拟机的启动而创建,随着虚拟机的退出而销毁灰色部分:与线程一一对应,随着线程的启动和结束,随之产生而结束一个Runtime, 对应一个JVM虚拟机二、概念1. 线程1. 线程是一个程序里的运行单元, JVM允许一个一个应用有多个线程并行执行2. 每个线程都与操作系统的本地线程直接映射 2.1 当一个java线程准备好后,此时一个操作系统的本地线程也会创建 2.2 java线程执行终止后,本地线程也会回收3. 操作系统负责将线程的安排调度到任何一
2022-04-23 00:16:27
1141
原创 JVM类加载器
一、JVM内存结构1. 简图2. 详图二、类加载器简介1. 基本介绍类加载器子系统: 只负责从文件系统或网络中加载Class文件,class文件在开头有特定的文件标识1. ClassLoader只负责class文件的加载,至于是否可以运行,交给Execution Engine决定2. 加载的类信息,存放在一块称为方法区的内存空间 2.1 类信息 2.2 存放运行时常量的信息(字符串字面量和数字常量)2. 角色1. class file 存在于本地硬盘上,可以
2022-04-20 22:57:22
418
原创 Java8-新特性
一、Lambda1. 基本使用package com.nike.erick.d01;/*1. 假如一个接口中只包含一个方法 1.1 在接口上添加@FunctionalInterface, 提醒这个接口可以使用Lambda 1.2 创建继承这个接口的时候,()->{} 2.1 忽略方法名字,因为只包含一个方法 2.2 ()括号中表示具体的参数 2.3 {}表示具体的逻辑 2.4 如果
2022-04-01 00:56:24
398
原创 Redis-应用实战
一、短信登录1. 基于Session1.1 实现方案- 基于springmvc的拦截器- 基于ThreadLocal保存数据:讲数据保存在当前线程内1.2 集群session共享问题多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务器时,登陆状态的丢失session的替代方案应该满足:1. 数据共享2. 内存存储3. key,value数据结构2. 基于Redis二、列表查询1. 缓存使用优点:1. 降低后段负载2. 提高读写
2022-03-26 18:10:29
1418
原创 Redis缓存一致性
一、 缓存一致性Redis中数据和数和库数据不一致1. 更新策略内存淘汰超时剔除主动更新说明不用自己维护,利用Redis的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存利用缓存数据TTL, 到期后自动删除缓存,下次查询时更新缓存修改数据库时,更新缓存一致性差一般好维护成本无低高2. 主动更新方案一:企业更常用方案方案二:外部集成服务,不可控方案三:如果Redis宕机,则可能出现数据丢失3. 主动更新方法更新
2022-03-26 17:49:46
1175
原创 Redis分布式锁--Redisson
一、Redisson一个用来进行分布式锁的工具类 <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.16.8</version> </dependency>1. 基本Demopackage com.erick.redis;import
2022-03-24 18:46:59
1602
原创 Map源码解读
一、Mapkey不允许重复,和HashSet一样。 可以为null,但是只能包含一个nullvalue允许重复,可以包含多个null二、HashMap具体结构在前面HashSet已经介绍完毕是线程不安全的1. 数据结构 private static void method01() { HashMap<String, String> map = new HashMap<>(); map.put("name", "erick"); /*
2022-03-21 21:29:13
438
原创 List源码解读
一、ArrayList- 可以添加多个null元素- 底层用数组来实现- 非线程安全,但是效率高1. 扩容机制1. 底层维护了一个Object类型的数组 elementData transient Object[] elementData; # 表示该属性不会被序列化2. 当创建新的ArrayList时, 如果使用的无参构造器, 则elementData初始容量为0 第一次添加,则扩容为10, 如果需要再次扩容,则扩容elementData 为1.5倍 #0--10--1
2022-03-21 09:54:18
985
原创 Set源码解读
一、Set1. Set 接口和 Colleection 接口一样2. 元素无序,不可重复, 可以包含但只能包含一个null, 2.1 虽然添加和取出的顺序不一致,但是取出的顺序是恒定不变的 3. 遍历: 不能用普通for循环,因为无序 1. Iterator 2. 增强for二、HashSet1. 重复元素是通过元素的hashcode和equals方法共同决定的package com.erick.feature.collection.d02;import
2022-03-20 19:13:15
861
原创 分布式事务二-- Seata
一、简介1. 基本介绍# 1 + 3 组件Transaction ID: XID 全局唯一的事务ID,用来将本次事务所涉及 的数据库连接起来TC (Transaction Coordinator) - 事务协调者维护全局和分支事务的状态,驱动全局事务提交或回滚- Seata ServerTM (Transaction Manager) - 事务管理器定义全局事务的范围:开始全局事务、提交或回滚全局事务。- 开启@GlobalTransacti
2022-03-18 19:18:22
388
原创 分布式事务一
一、事务一个大的事务,包含多个小的活动,要么都成功,要么都失败1. 本地事务通过关系型数据库来控制事务事务四大特性: ACIDA(Atomic): 原子性,构成事务的所有操作,要么都执行完成,要么都不执行C(Consistency): 一致性,事务执行前后,数据库的一致约束没有遭到破坏I(Isolation): 隔离性。数据库的事务一般都是并发的,并发的两个事务的执行 互不干扰,一个事务不能看到其他事务运行过程的中间状态 可以
2022-03-17 00:03:08
1317
原创 Redis多级缓存
一、多级缓存1. 传统缓存方案请求到达tomcat后,先去redis中获取缓存,不命中则去mysql中获取2. 多级缓存方案tomcat的请求并发数,是远小于redis的,因此tomcat会成为瓶颈利用请求处理每个环节,分别添加缓存,减轻tomcat压力,提升服务性能.........
2022-03-16 13:40:24
2690
原创 Redis分布式锁
一、Redis分布式锁满足分布式系统或集群模式下,多进程可见并互斥的锁多线程可见互斥高可用高并发安全1. Redis锁基础版本获取锁: # 1. 获取锁,单线程保证一定只有一个线程来执行 SETNX key value 释放锁 redis.del(LOCK_NAME)# 2. 如果加锁后,还没来的及释放锁, redis挂了,就可能永远不能释放锁# 因此,对于锁的k-v,要加上过期时间# 3. 如果在加锁和释放锁期间redis挂了,依然没办法,因
2022-03-14 19:28:51
29824
6
原创 Java知识点
一、浅拷贝与深拷贝1. 浅拷贝新对象只是拷贝了原对象的地址值,原对象的任何属性发生变化,新对象的值的属性就会变化package com.erick.copy;import lombok.AllArgsConstructor;import lombok.Getter;import lombok.Setter;public class Demo01 { public static void main(String[] args) { User firstUser =
2022-03-14 14:33:11
476
原创 组合模式-Composite Pattern
如树形菜单,文件、文件夹的管理package com.nike.erick.combine;import lombok.ToString;import java.util.ArrayList;import java.util.List;public class Test { public static void main(String[] args) { Employee ceo = new Employee("lucy", "A", 10000); .
2022-03-13 17:22:37
242
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人