自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

吉他程序员的博客

我们有一支程序员的乐队,欢迎加入

原创 CountDownLatch 源码详解

CountDownLatch共享锁,多个线程可以同时拿到锁。本文不讲AQS原理。看下面一段客户端代码 public static void main(String[] args) throws InterruptedException { final CountDownLatch latch = new CountDownLatch(2); new Thread() { public void run() { Sys

2020-07-30 18:37:21 22

原创 ab 压测工具教程

1.安装yum -y install httpd-tools2.参数-n 测试的总请求数。默认时,仅执行一个请求。-c 一次并发请求个数。默认是一次一个。-H 添加请求头,例如 ‘Accept-Encoding: gzip’,以gzip方式请求。-t 测试所进行的最大秒数。其内部隐含值是-n 50000。它可以使对服务器的测试限制在一个固定的总时间以内。默认时,没有时间限制。-p 包含了需要POST的数据的文件。-T POST数据所使用的Content-type头信息。3.操作实例p

2020-07-30 14:27:14 49

原创 java 面试 大全

1.并行和并发的区别?并发是指同时执行通常不相关的各种任务,并发程序并不需要多核处理器。比如:windows系统边听歌边玩游戏,在单核cu系统中是靠cpu来回切换执行。并行是依靠多核的优势,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。简单理解: 一个人同时做多件事情就是并发,多个人同时做多件事情就是并行。2.sleep和wait的区别?sleep是Thread里面的方法,wait是Object里

2020-07-24 19:33:46 53

原创 JVM 详解之 CMS收集器

1.CMS触发GC的条件CMS GC 在实现上分成 foreground collector 和 background collector。foreground collector 相对比较简单,background collector 比较复杂,情况比较多。foreground collectorforeground collector 触发条件比较简单,一般是如下:老年代没有足够的连续空间分配给晋升的对象(即使总可用内存足够大)。新生代没有足够的空间分配对象。老年代没有足够的剩余空间来容纳

2020-07-24 10:42:44 50

原创 MySql原理(二)InnoDB索引原理

1.聚簇索引(主键索引)结构图InnoDB将主键的值组织成一颗B+树,行的具体数据存在叶子节点中,叶子节点形成一个链表。每个节点存储一页的数据(16K)。InnoDB的数据文件本身就是索引文件,B+Tree的叶子节点上的data就是数据本身,key为主键,这是聚簇索引。索引数据和叶子节点存储到一起,这样它们是一起被载入内存的,找到叶子节点也就直接返回数据,不需要另外寻址。page页页是InnoDB存储引擎管理数据库的最小磁盘单位。InnoDB中的页大小为16KB,所以一个B+树的节点并不止存储

2020-07-18 12:23:36 30

原创 MySql原理(一)SQL语句执行过程

1.当向mysql发送一个请求时,到底做了什么?客户端发送一条sql给服务器,涉及到建立连接判断权限等。服务器先检查缓存,如果命中了查询缓存,则立即返回命中结果,否则进入下一阶段。服务器经过解析器,进行sql解析,生成解析树,然后通过预处理器处理解析树,再由查询优化器生成对应的执行计划。然后在调用存储引擎AOI来执行查询。将结果存入查询缓存,并返回给客户端。2.建立连接mysql客户端和服务器之间的通讯协议是“半双工”的,这意味着,在任何一个时刻,要么由服务器向客户端发送数据,要么由客户

2020-07-16 15:36:43 18

原创 Redis原理(五)集群

1.集群的作用数据分区: 集群将数据分散到多个节点,一方面突破了Redis单机内存大小的限制,存储容量大大增加;另一方面每个主节点都可以对外提供读服务和写服务,大大提高了集群的响应能力。高可用: 集群支持主从复制和主节点的自动故障转移(与哨兵类似);当任一节点发生故障时,集群仍然可以对外提供服务。2.集群的搭建请参见:redis集群实践3.集群的设计方案根据故障转移的原理,至少需要3个主节点才能完成故障转移,且3个主节点不应在同一台物理机上;每个主节点至少需要1个从节点,且主从节点不应在一

2020-07-16 10:48:42 20

原创 Redis原理(四)哨兵 sentinel

1.哨兵的作用哨兵会不断地检测主从节点是否正常,当主节点不能正常工作时,哨兵会开始自动故障转移操作,它会将失效主节点的其中一个从节点升级为新的主节点,并让其他从节点改为复制新的主节点。2.哨兵的部署(1) 建立三个哨兵配置文件,分别为sentinel-26370.conf,sentinel-26371.conf,sentinel-26372.confport 26370daemonize yeslogfile "26370.log"## 指定4个要监控的主节点地址sentinel monit

2020-07-15 10:31:32 35

原创 Redis原理(三)主从复制

1.主从复制的作用数据冗余:解决了持久化的单点故障问题,将数据备份到了其他机器。故障恢复: 当主节点出问题时,从节点能及时提供服务。负载均衡: 主节点复制写,从节点负责读。2.主从复制的开启主从复制的开启都是从从节点开始的,主节点无需修改。有下面三种方式来开启从节点的主从复制:在从节点配置文件中加入:slaveof [masterip] [masterport]redis-server 启动命令后面加入:slaveof [masterip] [masterport]redi

2020-07-14 15:30:41 17

原创 Redis原理(二)持久化

一.持久化的意义redis是内存数据库,进程退出之后为保证数据能恢复就有了持久化。redis持久化分为下面两种:RDB :将当前的数据压缩保存到硬盘。AOF: 将每次执行的写命令保存到硬盘(类似mysql的binlog)。二.RDB持久化1.触发条件(1)手动执行命令触发save和bgsave命令都可以生成RDB文件。save命令会阻塞redis主进程,知道RDB完毕,线上应该杜绝。bgsave会创建一个子进程来执行,只有fork子进程时会阻塞redis主进程,其余都是不影响redis主

2020-07-08 11:13:58 38

原创 Redis原理(一) 内存

1.Redis数据存储模型当我们执行redis以下命令时:set hello world对应的redis内存存储模型图dictEntry:每个键值对都会包装成dictEntry对象,存储了指向Key和Value的指针;next指向下一个dictEntry。Key:Key(”hello”)并不是直接以字符串存储,而是存储在SDS结构中。redisObject:值的存储,包装成了redisObject对象,里面的type是表示redis值的类型(string,set,list等),ptr是存

2020-07-01 11:34:55 51

原创 偏向锁、轻量级锁和重量级锁 最易懂解释

重量级锁1.每个对象都有一个对象头,对象头里有一个Mark Word结构,里面存储了锁相关信息(锁类型,偏向线程id等)。2.Mark Word中有一个指针指向monitor,当线程试图获取对象锁时(进入synchronized)自动生成,处于锁定状态。3.monitor由ObjectMonitor c++类实现,里面有: _owner(哪个线程持有锁),_count(线程持有锁的次数),_WaitSet(waiting状态的线程) 等字段。4.当线程1,2依次进入synchronized代码块时

2020-06-24 12:24:45 109

原创 java线程堆栈 详解

比如有如下堆栈实例:"resin-22129" daemon prio=10 tid=0x00007fbe5c34e000 nid=0x4cb1 waiting on condition [0x00007fbe4ff7c000] java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) at java.util.concurrent.locks.LockSupport.park(L

2020-06-23 22:47:22 66

原创 springcloud 微服务(六) 调用链追踪 zipkin

1.下载zipkin服务端(1)下载jar包curl -sSL https://zipkin.io/quickstart.sh | bash -s(2)启动jarjava -jar zipkin.jar访问: http://127.0.0.1:9411/zipkin2.微服务端埋点

2020-06-18 20:19:45 87

原创 nginx线上配置

1.集成upstream_check_module模块模块点的作用nginx自带的针对后端节点健康检查的功能比较简单,无法主动识别后端节点状态,后端即使有不健康节点, 负载均衡器依然会把该请求转发给该不健康节点,只能等待超时时间后转发到其他节点,这样就会造成响应延迟性能降低的问题。安装使用(1)下载最新的稳定版本nginx-1.16.1源码包并解压[root@nginx ~]# wget https://nginx.org/download/nginx-1.16.1.tar.gz[root@ng

2020-06-17 11:59:25 90

原创 pidstat 详解

1.安装yum install pidstat1.监控CPU (-u)pidstat -u -p 243855 2 1000: 每隔2s输出进程id为243855的cpu信息,总共输出1000次。-p:执行进程pid。-u:监控cpu。%system - 这个任务在系统层使用时的cpu使用率。%guest - 任务花费在虚拟机上的cpu使用率(运行在虚拟处理器)。%CPU - 任务总的cpu使用率。在SMP环境(多处理器)中,如果在命令行中输入-I参数的话,cpu使用率会除以你的cpu

2020-06-16 16:00:56 55

原创 springcloud 微服务(五) 接口超时,熔断 实例

场景介绍有三个微服务eureka:注册中心。paper:服务提供者。question:服务消费者。(1)外界访问question服务的test方法。(2)question调用paper的test方法(里面睡10s)。(3)设置question服务的读其它服务超时为1s, 则 question此时会读超时异常,指定fallback友好返回给前端。代码实现1.eureka服务搭建不介绍,见:springcloud demo2.paper服务提供者搭建(集成feign)springcl

2020-06-12 11:54:44 131

原创 SpringCloud原理 (一) eureka

1.在某网站拿个多机房eureka部署图Eureka Server(北京,天津,青岛)集群部署,多个节点进行(异步)数据同步,保证最终一致性。通过appName和instanceInfoId(微服务信息)来唯一区分一个服务实例,服务实例信息保存在Map中:// 第一层的key是appName,第二层的key是instanceInfoIdprivate final ConcurrentHashMap<String, Map<String, Lease<InstanceInfo&

2020-06-10 10:18:07 58

原创 springcloud 微服务(四) 集成Ribbon实现负载均衡

其实euraka已经默认集成了ribbon实现的是轮训方式的负载均衡,我们可以测试下。接上篇博客的代码:springcloud 微服务(二) 集成Feign组件 跨服务调用实例一.启动多个user提供者微服务实例1.将user 打成jar包,此时端口是8881 , 然后 :java -jar 启动2.将user在打成另一个jar,此时端口是8882 ,然后 :java -jar 启动3.观察注册中心,user有2个实例:二.改造服务消费者item微服务,打印请求服务端口1.在我们消费者it

2020-05-20 17:47:56 48

原创 springcloud 微服务(三) Eureka Server 开启Spring Security Basic认证

今天我们要让注册中心eureka加上权限,让指定账号才能访问。eureka项目搭建见:微服务demo1.pom文件添加依赖:<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>2.yml文件添加配置:spring:

2020-05-19 17:28:23 68

原创 springcloud 微服务(二) 集成Feign组件 跨服务调用实例

今天我们要搭建正式跨服务调用的实例并集成feign,有设计到下面三个服务:eureka-server: 注册中心。user: 提供者微服务。item: 消费者微服务。一.base父工程搭建(统一包版本管理)1.新建hadluo-base pom类型maven工程2.maven配置<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

2020-05-19 11:16:40 110

原创 springcloud 微服务(一) 生产者 消费者demo

一.注册中心eureka的项目搭建1.新建eureka-server maven工程 , pom文件<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.2.2.RELEASE</version> <relativePath

2020-05-16 18:11:20 140

原创 jvm 局部变量表 详解

1.概念局部变量表(Local Variable Table)是一组变量值存储空间,用于存放方法参数和方法内部定义的局部变量。在 Java 程序编译为 Class 文件时,就在方法的 Code 属性的 max_locals 数据项中确定了该方法所需要分配的局部变量表的最大容量。2.实操验证请看下面一段代码public class TestStack { private Strin...

2020-04-23 11:42:15 248

原创 自己手动实现 Mybatis

最近参照mybatis3的源码,copy写了一个简易mybatis,搞清了里面的框架结构和实现原理,想分享出来给大家。项目代码跟mybatis3源码高度重合,含有以下组件:SqlSession : 管理整个数据库操作,和获取mapper接口。SimpleExecutor :执行数据库sql。JdbcTransaction: 打开,关闭数据库连接。PooledDataSource:连...

2020-04-22 15:05:41 84

原创 CountDownLatch、CyclicBarrier和Semaphore用法

1.CountDownLatch用到的场景: 等待所有子任务都完成在返回。重要方法:public void await() throws InterruptedException { }; //调用await()方法的线程会被挂起,它会等待直到count值为0才继续执行public boolean await(long timeout, TimeUnit unit) throws In...

2020-03-23 16:37:41 41

原创 invokespecial和invokevirtual指令

1.JVM提供了5种方法调用指令,其作用列举如下:invokestatic:该指令用于调用静态方法,即使用 static 关键字修饰的方法;invokespecial:该指令用于三种场景:调用实例构造方法,调用私有方法(即private关键字修饰的方法)和父类方法(即super关键字调用的方法);invokeinterface:该指令用于调用接口方法,在运行时再确定一个实现此接口的对象;...

2020-03-19 18:05:45 161

原创 sentinal 限流详解

1.使用sentinal 对资源(一个java方法或者http接口)进行限流,下面代码每一秒2个请求,但是经过sentinal的qps限流设置1,所以一半请求进来,一半被拦截了。public class Test1 { public static void main(String[] args) throws InterruptedException { // 限流 规...

2020-03-19 16:05:14 77

原创 rocketmq 面试

rocketmq topic图解:1.Rocketmq怎么保证消息的有序性?生产者端处理: Producer端发送时,指定MessageSelector,算出将消息放到哪个queue消费端处理: 如何保证消费端 顺序消费? 如果是使用MessageListenerOrderly(**顺序消费)**则自带顺序消费实现,如果是使用MessageListenerConcurrently(并发消...

2020-03-18 16:35:43 904

原创 java 获取代码注释

1.今天来介绍工具获取java代码的注释,以此来编写自动生成文档工具。代码:先导入jdk的tools.jar包public class Doclet { public static class Entry { /**参数名*/ public String fName; /**类型*/ public String fTy...

2020-03-17 16:55:00 80

转载 线上问题HashMap死循环

线程问题HashMap死循环:https://crossoverjie.top/2018/11/08/java-senior/JVM-concurrent-HashSet-problem/

2020-03-17 16:19:51 31

原创 jstack 分析cpu过高的场景

1.场景一: HashMap并发导致死循环public class Test { public static class HashMapThread extends Thread { private static AtomicInteger ai = new AtomicInteger(0); private static Map<Integer, ...

2020-03-05 15:22:18 58

原创 IO概念

1. 内核缓冲区用户程序进行IO的读写,会用到read&write两大系统调用。read系统调用,是把数据从内核缓冲区复制到进程缓冲区;而write系统调用,是把数据从进程缓冲区复制到内核缓冲区。2. 同步IO与异步IO同步IO 同步IO是指用户空间线程是主动发起IO请求的一方,内核空间是被动接受方。异步IO: 是指内核kernel是主动发起IO请求的一方,用户线程是被动接受方。...

2020-03-04 17:00:38 52

原创 高并发-JVM优化-设置JVM参数

下面是我们生产环境的JVM启动参数:-Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dcache_enable=true -Xmx4g -Xms2g -Xmn256m -XX:PermSize=128m -Xss256k -XX:+DisableExplicitGC -XX:+UseConcMarkSweepG...

2020-03-04 11:08:18 162

原创 TransmittableThreadLocal 详解

1.先看一个父线程开启子线程,ThreadLocal获取不到父线程的值的问题。public class Test { public static void main(String[] args) { ExecutorService service = Executors.newSingleThreadExecutor(); final ThreadLoca...

2020-03-04 11:05:38 136

原创 单例模式的线程不安全问题

1.单例模式懒汉模式 :线程不安全,多线程下可能new多个Test类。public class Test { private Test() { } private static Test instance = null; public static Test getInstance() { if (instance == null) { ...

2020-03-02 17:19:59 86

原创 redis 高级

一,缓存雪崩1.缓存击穿我们使用缓存一般的思路是:先查缓存,没有就查数据库,然后数据库结果放入缓存,如果查不到就返回。当有人恶心大量查询不存在数据时,就会导致每次都查数据库。解决:查不到数据时,构建一个空对象放入redis,后台设置定时删除策略。这样就不会导致数据库崩溃。2.缓存失效对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库。解决:在缓存的时候给过期时间加上...

2020-02-21 16:35:15 76

原创 java线程池 源码调试 解惑面试

1.线程池的用法不作介绍,本文直接调试jdk7线程池源码,来介绍执行具体流程。客户端代码 public static void main(String[] args) throws InterruptedException { ExecutorService executorService = Executors.newFixedThreadPool(1); ...

2020-02-19 18:16:32 113

原创 YAML格式详解

1.基本语法区分大小写。"#"到行尾都是注释部分。使用空格表示层级关系(多少空格无所谓对齐就行)。内容格式 key: value,注意 冒号后面必须一个空格才能写值。字符串默认不用加单引号和双引号。双引号:不会转义里面的特殊字符,单引号会转移里面的字符。2.数据结构的表示实例1.Map数据结构java表示public class Application { pr...

2020-02-18 10:14:01 168

原创 FutureTask 源码解析

1.FutureTask 用于获取线程run方法的返回值。下面看个实例代码 static class MyTask implements Callable<String> { @Override public String call() throws Exception { return "xxx"; } ...

2020-02-04 17:25:26 51

原创 JVM 面试 详解

1.ClassLoader相关1. 什么是类加载器?读取 Java 字节代码,并转换成java.lang.Class类的一个实例。2. 类相同的判断?被相同的类加载加载的类才是相同的类,这里指的“相同”,包括类的Class对象的equals()方法、isAssignableFrom()方法、isInstance()方法、instanceof关键字等判断出来的结果。3. 类加载器种类?...

2020-02-02 15:09:22 190

提示
确定要删除当前文章?
取消 删除