自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 jvm垃圾回收机制原理读书笔记

可达性分析主要是用来解决哪些对象是不可用的,可以被回收。以一系列称为GC Roots的对象为起点,若对象到GC Roots之间没有任何引用关系,则认为该对象是不可用的,可以被回收.具体可作为GC Roots的对象如下(不是全部):**所有Java线程中当前栈帧的引用(例如局部变量),也就是活着的线程,**这个就是我们通常意义上Java代码new一个对象引用,这个对象引用所在的地方.所有ClassLoader所有全局变量对于classloader和全局变量,因为其一定伴随着应用的整个生命

2021-05-11 23:02:02 144

原创 jvm内存区域划分介绍

Java内存划分主要分为以下几块:程序计数器线程私有,可以看做是当前线程所执行的字节码的行号,用于下一次线程切换的时候虚拟机定位到上一次执行的位置。虚拟机栈线程私有,生命周期与线程相同。描述的是方法执行的内存模型。进入方法时对应入栈,方法结束的时候对应出栈。该区域存储着局部变量,操作数,方法出口等信息。方法区线程共享。主要用来存储类的元信息。 在1.7和1.8之后的实现逻辑有所不同。由于该区域大小一般较小,一般不会对该区域进行垃圾回收。所以在1.7之前的版本,有可能会因为字

2021-05-09 17:18:11 197

原创 队列同步器AQS原理分析及具体实现

Java中的并发编程很多都是以队列同步器AbstractQueuedSynchronizer为基础的, 例如ReentrantLock,CountDownLatch等。下面介绍其构成以及相应的实现。构成private volatile int state;AbstractQueuedSynchronizer中通过一个int类型的成员变量state来表示同步状态,该变量使用volatile来修饰,保证多线程之间的可见性。以及一个内置的队列来完成资源排队。其中对于state有如下几个操作方法:g

2021-04-08 23:16:46 215

原创 Java线程状态流转及部分函数说明

下面这张是Java线程状态改变的图例。下面就其中几点和函数进行说明运行态Java将操作系统中的"运行中running"和"就绪ready"两种状态统称为运行态runnable。runing和ready的切换由操作系统进行调度。join让当前线程等待join线程执行完毕。如果join()方法在一个线程实例上调用,则当前运行着的线程将阻塞直到这个线程实例执行完毕。该方法可以实现一个线程在另一个线程结束后再执行。public class JoinTest { public static

2021-04-01 21:52:42 231 1

原创 synchronized锁介绍

本文主要介绍synchronized的锁实现。锁的存储Java中的每一个对象都可以作为锁。synchronized关键字分为如下三种场景:修饰普通方法时,锁住的是调用该方法的对象实例修饰静态方法时,锁住的死当前类的Class对象修饰代码块时,锁住的是括号里的配置的对象Java对象头内部有一个Mark Word,存储着对象的hashcode、分代年龄、持有偏向锁的线程ID,锁标志位等信息。锁信息就存储在对象头。锁的分类锁按照级别从低到高依次是: 无锁 -> 偏向锁 -> 轻量级

2021-03-28 15:50:36 126

原创 HashMap源码分析

基本原理HashMap的数据结构是由数组和链表(或者树)组成。当进行元素的增删改查时,首先要定位到元素所在桶的位置,也就是table数组的下标,之后再从链表或树中定位该元素。定位下标使用 (n - 1) & hash 算法,其中n为数组长度,hash为key的哈希值hashmap是通过一个数组Node<K,V>[] table(该变量是一个类变量)存储所有的数据,每个元素存放元素的下标为putVal()函数中对应的局部变量p,其计算方法为:p = tab[i = (n - 1)

2021-03-24 18:19:20 78

原创 HashMap源码分析

基本原理HashMap的数据结构是由数组和链表(或者树)组成。当进行元素的增删改查时,首先要定位到元素所在桶的位置,也就是table数组的下标,之后再从链表或树中定位该元素。定位下标使用 (n - 1) & hash 算法,其中n为数组长度,hash为key的哈希值hashmap是通过一个数组Node<K,V>[] table(该变量是一个类变量)存储所有的数据,每个元素存放元素的下标为putVal()函数中对应的局部变量p,其计算方法为:p = tab[i = (n - 1)

2021-03-24 14:59:00 64

原创 ElasticSearch存储介绍

基本概念介绍node节点。一个运行中的 Elasticsearch 实例称为一个节点,而集群是由一个或者多个拥有相同 cluster.name 配置的节点组成, 它们共同承担数据和负载的压力。当有节点加入集群中或者从集群中移除节点时,集群将会重新平均分布所有的数据。作为用户,我们可以将请求发送到 集群中的任何节点 ,包括主节点。 每个节点都知道任意文档所处的位置,并且能够将我们的请求直接转发到存储我们所需文档的节点。 无论我们将请求发送到哪个节点,它都能负责从各个包含我们所需文档的节点收集回数据,并将

2021-03-17 18:44:26 599

原创 缓存相关

缓存雪崩怎么解决?如果缓存因为某个原因不可用,导致大量请求涌向数据库,可能会导致数据库崩溃。缓存雪崩目前主要有两种方案:1. 使用集群集群部署缓存,当一台宕机时,其他机器仍能提供缓存服务2. Hystrix熔断器,起到熔断,降级,限流三个作用。通过熔断器可以保证当缓存服务不可用时,服务仍能使用,但返回的数据是特定的(此处返回结果与集群的不一样,集群的结果仍然是正确的,而此时则是一个预定的值)熔断:hystrix是一个Java类库,采用命令模式.每一项服务的请求都有各自的处理器.所有的请求

2021-03-14 21:50:06 100 1

原创 分布式系统session处理

分布式系统中同一个用户的请求可能会被分发到不同的服务器上,而session是存储在单个服务器上,所以有可能会导致session失效,对于前端用户最明显的感觉就是需要重新登录。主要有如下几种解决方案1. session sticky 方式由负载均衡来负责标记每次的请求,将同一个会话请求发送到同一个服务器上。nginx实现sticky的方式是利用cookie来实现的。nginx在第一次客户端请求来之后,会生成一个cookie发送到客户端,以后客户端每次发送请求的时候都带上这个cookie,nginx

2021-03-14 20:42:10 280

原创 字典树的简单实现

字典树的简单实现此处假设只有26个英文字母, 且不区分大小写public class TireTree { private Node root; public TireTree() { this.root = new Node(); } void add(String s){ Node p = root; for (char c : s.toCharArray()){ if (p.childre

2021-03-13 16:23:48 62

原创 ElasticSearch索引查询原理浅析

倒排索引创建倒排索引的过程如下:对原始数据文档进行编号(doc_id), 形成一个文档列表。假设现有数据如下:文档编号(doc_id)文档数据0dog have fly1dog have eat2cat and dog friend3cat have fly对文档数据按照一定算法进行分词, 得到很多的词条,并且以这些词条为索引,保存包含这些词条的所有doc_id。假设上述数据按照普通英文单词进行分词,则会得到如下的倒排索引列表:单词

2021-03-12 16:12:22 664

原创 clickhouse索引原理介绍

clickhouse本身支持很多表引擎,这里只介绍其中最常用的MergeTree引擎。建表语句( name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1], name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2], ... INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1, #

2021-03-05 16:47:27 2716

原创 match和term等查询语法及原理

通过一个例子说明, 数据如下, 总共有5个数据(对应的字段名是name,类型是text):hello worldhello Tom worldhello Tom Rob worldhello kiloworld huterm精确查询,搜索前不会再对搜索词进行分词,所以我们的搜索词必须是文档分词集合中的一个.例如当搜索词是"hello world"时, 由于"hello world"并不是一个文档分词(该单词在插入索引时, 会将hello world拆成hello和world两个单词). 所

2021-02-28 22:34:35 551

原创 一致性哈希算法

先弄懂几个概念哈希函数将任意长度的数据映射到有限长度的域上。就是对一段数据m进行杂糅,然后输出另一段固定长度的数据h,作为这段数据的特征值。其基本原理就是将数据块m分成多段,每一段长度固定(如128位),若某段长度不足,则进行补位(如0或者1),然后对每一块都进行hash运算,再将这些数据进行迭代(比如相邻两段进行异或),最终得到一个数据。JDK中HashMap的hash算法如下:JDK中String的hashCode算法如下:JDK中Integer的hashCode算法如下:JDK中Floa

2021-02-11 23:20:31 118

原创 正则表达式语法和实例

语法字符说明^匹配字符输入的开始$匹配字符输入的结束\d数字字符, 等效于[0-9]\s匹配任何空白字符,包括空格、制表符、换页符等\S匹配任何非空白字符{n}正好匹配n次{n,}至少匹配n次{n, m}n<=m, 匹配至少n次,至多m次()标记一个子表达式的开始和结束位置。子表达式可以供以后使用*零次或多次匹配前面的字符或子表达式, 等效于{0,}+一次或多次匹配前面的字符或子表达式,等效于{1,

2021-02-05 16:29:26 113

原创 kafka存储原理介绍

几个基本概念Topic消息主题。每一条消息都必须要指定主题。kafka集群可以同时进行多个topic的分发。Broker消息处理的节点。可以立即为每个broker是一个单独的kafka进程, 一般部署在不同的机器上, 多个broker共同组成一个集群。Partition分区。是topic在物理上的分组。每个partition实际上就是一个目录。对于同一个topic下的多条消息, 按照一定的规则存储在多个partition上。 对于每个partition而言,消息的存储是有序的,但是对于整个

2021-02-05 16:16:29 585

原创 mysql事务详解

以下的分析和总结都是针对InnoDb引擎.事务的四大特性这四个特性并不是平级的关系. 准确的说, 一致性是最基本的属性, 其他的属性都是为了保证一致性而存在的Atomicity 原子性原子性是指整个事务是一个整体,不可分割的最小工作单位。一个事务中的所有操作要么全部执行成功,要么全部都不执行。其中任何一条语句执行失败,都会导致事务回滚。Consistency 一致性指数据库的记录总是从一个一致性状态转变成另一个一致性状态。这里的一致性是语义上的一致性, 并不是语法上的一致性.比如经典的银行

2021-02-04 09:04:40 626

原创 线程池详解

构造参数线程池ThreadPoolExecutor的部分构造参数说明:corePoolSIze: 核心线程数目runnableTaskQueue: 阻塞队列,保存等待执行的任务。有以下几种类型:ArrayBlockingQuque: 基于数组实现的有界阻塞队列, 队列大小由构造函数指定LinkedBlockingQueue: 基于链表实现的无界阻塞队列,吞吐量通常高于ArrayBlockingQuque(没验证)SynchronousQueue: 不存储元素的阻塞队列。 该队列挺有意思, 有

2021-01-24 22:32:44 969

原创 Linux常用命令与Shell语法总结

几点注意事项字符串变量引用时最好加上"", 如 “$a”一次执行多条命令,可以有如下三种方法, 其区别如下:分号: 顺序地独立执行各条命令, 彼此之间不关心是否失败, 所有命令都会执行&& : 顺序执行各条命令, 只有当前一个执行成功时候, 才执行后面的|| : 顺序执行各条命令, 只有当前面一个执行失败的时候, 才执行后面的设置shell脚本遇到错误时自动退出, 不执行后续命令#!/bin/bash -e 或者 set -e特殊文件/dev/

2021-01-14 15:18:54 372 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

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