学习笔记
文章平均质量分 64
一只狮
没有最好的路,只有你能走最远的路。
展开
-
【算法】算法基础
基础评估算法重要指标时间复杂度额外空间复杂度课程class 1 简单排序选择排序:每一次拿当前数和所有数比较,最小的放在当前位置冒泡排序:拿当前数与下一个数比较,若当前数大则交换位置插入排序:拿当前数与前一个数比较,若小则交换位置,并进行下一个数判断二分查找:每次找到中间的那个数,进行比较class 2 异或运算异或:无进位相加如果不用额外变量,给两个变量交换位置int a = x, b = y;a = a ^ b;b = a ^ b;a = a ^ b;原创 2021-07-11 23:17:20 · 297 阅读 · 2 评论 -
【消息中间件JMS java message service】RocketMQ
基础内容角色nameserver注册中心。可以部署多个实现高可用。所有broker会向nameserver上报,但nameserver之间不互相通报。所有数据放在内存中(可配置成持久化,但没有必要)broker实例// 启动mq broker(向指定中心注册)./mqbroker -n localhost:9876启动的时候,会向所有的nameser注册,建立长链接,定时上报master(支持读、写消息)slave(只能读)组成queue在rocketMQ中,只存在queue,q原创 2021-07-03 22:42:29 · 345 阅读 · 2 评论 -
【消息中间件JMS java message service】RocketMQ踩坑记录
Exception in thread “main” org.apache.rocketmq.client.exception.MQClientException巨坑问题。特别坑的注意点就是:你用的rocketMQ版本,一定要和你引用的pom文件同一个版本除了看官网的FAQ:This happens when you are trying to send messages to a topic whose routing info is not available to the producer.原创 2021-07-03 19:37:05 · 528 阅读 · 0 评论 -
【消息中间件JMS java message service】ActiveMQ
这里写自定义目录@标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Ma原创 2021-06-26 23:01:13 · 173 阅读 · 2 评论 -
【mysql】调优
监控mysql并查询在mysql5.+到8的版本,都可以用show profile;set profiling=1;-- 执行任何sql,都可以看到sql的分析show profile; -- 查看最近一条Sql的耗时show profiles ; -- 查看全部sqlshow profiles for query 2; --查看query_id为2的sql的执行耗时show profiles [type|all|cup|IPC|MEMORY|SWAPS...] for QUERY n原创 2021-06-15 22:52:23 · 104 阅读 · 0 评论 -
【JVM】CMS、G1
G1基本概念card table:由于在做ygc的时候,需要找到哪些对象需要回收,那就可能需要遍历全部的old区,才能找到需要回收的对象,效率低。所以jvm设置了card table.对eden区和old区,每几个对象分为一个card。如果一个card里面有一个对象的引用指向Y区,则将card设置为dirty。再次扫描只需要扫描dirty的card。在结构上,用bitmap保存。 CSet=collection set。一组可被回收的分区的集合。把需要回收的region,都集合起来,叫做colle原创 2021-06-13 19:06:36 · 128 阅读 · 0 评论 -
【JVM】调优
区分概念:内存泄漏 memory leak。内存被无用对象占用,不一定会移除 内存yi原创 2021-06-10 22:55:45 · 1093 阅读 · 0 评论 -
【jvm】垃圾回收
GC常用算法Mark-Sweep 标记清除算法相对简单 在存活对象比较多的时候效率高 扫描两遍,效率低(第一遍标记,第二遍清除) 容易产生碎片Copying 拷贝把内存一分为二,把a部分的存活对象依次移动到b部分中,再清除a的全部适用于存活对象较少的时候 只扫描一次,效率高 没有碎片 空间浪费 移动复制对象,需要调整对象引用Mark-Compact 标记压缩不会产生碎片,方便对象分配 不会产生内存减半 扫描两次 需要移动对象,效率较低JVM内存分代模型(用于分代原创 2021-06-08 22:56:48 · 387 阅读 · 0 评论 -
【JVM】java runtime data area. 和jvm instructions
java runtime data areapc program counter 程序计数器:存放指令位置(下标)。 虚拟机的运行:取pc中的位置,找到该位置对应的指令,执行指令,pc++ heap堆 jvm stacks ,每一个线程对应的栈,每个方法对应一个栈帧frame native methodstacks direct memory 直接内存,jvm可以直接访问操作系统的内存。nio中 提高效率,实现zero copy method area ,jvm共享,存class结构..原创 2021-06-06 21:59:55 · 170 阅读 · 1 评论 -
【JVM】对象内存布局面试题
对象在内存中的存储布局普通对象8位的对象头 markword classpointer指针指向class文件的地址。 实例数据。 按8的倍数对齐数组对象对象头 markword classpointer 数组长度 4字节 数组数据 按8的倍数对齐对象头的结构32位解释∫对象怎么定位句柄池。对象引用指向句柄池,句柄池包含2个指针,一个指向对象,一个指向.class文件 直接指针。对象引用直接指向new的对象,对象中的classpointer指向.class文原创 2021-06-06 18:08:48 · 114 阅读 · 0 评论 -
【JVM】JMM/ java内存模型
硬件层的并发优化基础知识数据层一致协议每个cpu有内部的高速缓存区,也有外部的高速缓存或者内存。当一个数据在外部高速缓存或者内存中,当cpu要处理数据的时候,会先查内部高速缓存,再查外部高速缓存,再查内存,将数据拿回来处理,那么多个cpu同时处理一个数据,如何保证数据一致性?在老的cpu中,会对总线加锁,这样效率很低。所以在新的cpu中,会使用各种各样的数据层一致协议,因特尔使用的MESI协议,还有各种其他协议MESI协议MESI缓存锁。内存中保存对象的4个状态,通过4个状态来保证数据一原创 2021-06-06 17:11:40 · 131 阅读 · 4 评论 -
【JVM】基础概念点
类加载过程load:把硬盘上的class文件,加载到内存中 link 校验 准备:把静态变量赋默认值 resolution:内存中对象的符号引用转换为直接应用 init:把静态变量赋初始值类加载器lib包中的基础类由classLoader加载 ext包中的类由extClassLoader加载 应用中的类由applicationClassLoader加载 还可以自定义类加载器以上按顺序加载。是属于子加载器与类加载器的关系,注意在语法上不是继承关系。classL...原创 2021-06-03 22:38:19 · 93 阅读 · 0 评论 -
【线程】四、disruptor
背景Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内存队列的延迟问题(在性能测试中发现竟然与I/O操作处于同样的数量级)。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2011年,企业应用软件专家Martin Fowler专门撰写长文介绍。同年它还获得了Oracle官方的Duke大奖。目前,包括Apache Storm、Camel、Log4j 2在内的很多知名项目都应用了Disruptor以获取高性能。在原创 2021-05-30 20:02:52 · 171 阅读 · 0 评论 -
【线程】三、线程池
Callable类似于Runable的接口,但是有返回。FutureTask实现了runable和future。所以即可以当作runable,丢到thread中运行,也可以用get()方法取到运行的返回原创 2021-05-26 23:08:33 · 116 阅读 · 0 评论 -
【线程】初识容器
分类collection list set queue :为多线程准备,可以阻塞的put \take map发展vector、hashtable每一个方法都自带synchronized。 基本不用了coypOnWriteList在读特别多,写特别少的时候使用该容器往List中插入的时候,需要加锁,但是此时会copy一份出来,对新的list进行添加。读的线程可以继续读原来的。等添加完成后,再将list引用修改至新list上Queueadd 添加..原创 2021-05-25 23:23:36 · 116 阅读 · 0 评论 -
java的四种引用:强、软、弱、虚
强引用正常的对象,都是强引用。遇到gc时不会回收软引用创建软引用对象后,当gc时且内存不够的时候,就会回收弱引用遇到gc则直接回收。一般用在ThreadLocal中,threadLocal中,threadLocalMap(每个线程都包含一个threadLocalMap)的Key类型是entry,继承于weakReference。这样当强引用对象释放掉引用,则threadlocalMap中的key也释放掉,否则容易产生内存泄漏(很难释放掉这块内存)!但是注意,key释放掉,可是v.原创 2021-05-24 21:54:34 · 86 阅读 · 0 评论 -
【线程】二、AQS
AQS是Lock的底层。构成AbstractQueuedSynchronizer是个抽象类,包含一个state和一个双向链表其中state是用volatile修饰,保证state的线程可见性 双向链表是线程的等待队列,采用CAS进行加入和取出操作实现不同的锁类型,对AQS中的state和链表有不同的实现。例如在reentrantLock中,state的作用是记录了偏向锁的概念。当有一个线程加锁时,state设置为1,其他线程如果看到state !=0,则加入等待队列。如果当前线原创 2021-05-23 22:44:14 · 151 阅读 · 0 评论 -
【线程】一、线程基础点
线程基础三种启动方式:实现Thread类,然后new 一个对象,调用start方法 实现Runable、接口,然后new Thread(new Runable()).start(),同理可用lambd表达式表示 线程池Executors public class StartThread { static class Thread1 extends Thread{ @Override public void run() { S原创 2021-05-17 21:47:57 · 92 阅读 · 0 评论 -
【redis】七、redis代理cluster
当采用集群模式的时候,每台客户端要访问的时候,都需要连到y轴上的所有redis,相对的,每台redis都与所有的客户端建立了连接!这么多的连接,就会对服务器的造成压力。所以可以采用代理服务器来解决该问题。所有的客户端,与代理服务器建立连接,至于具体访问哪台redis,则由代理服务器负责。代理有很多,这里主要介绍redis自带的Clusterredis-cluster在/opt/redis-6.2.1/utils/create-cluster中,有cluster集群脚本NODE.原创 2021-04-18 21:16:15 · 334 阅读 · 0 评论 -
【redis】六、集群:数据最终一致性、哨兵
集群根据上一篇说的afk理论,则会出现一个问题,那就是CAP原则中的问题。高可用性、高一致性、高容错性只能三选二。在redis中,redis的原则就是“快”!所以需要利用kafka来实现数据的最终一致性。当client保存一条数据到redis中时,主redis将数据存入kafka中,并且直接返回客户端保存成功。从redis会从kafka中读取数据,保存到本地。实现数据的最终一致性。主从可以在客户端中输入REPLICAOF 127.0.0.1 6379作为6379的从red原创 2021-04-18 20:38:24 · 477 阅读 · 0 评论 -
【redis】五、redis持久化、以及afk
redis持久化redis数据是存在于内存中的,但是当redis意外宕机,就需要恢复数据,所以有必要对Redis的数据进行持久化。持久化分为rdb 以二进制的方式保存当前redis中的所有内容。rdb会丢失数据 aof 以追加文件的方式记录所有的set操作。aof文件较大,并且会有无用操作rdb执行bgsave命令,就可以生成dump.rdb文件。注意:当执bgsave时,linux操作系统会采用fork函数,将redis持有的所有内存引用,复制一份。主线程redis仍然在接受和提供原创 2021-04-18 20:11:12 · 399 阅读 · 0 评论 -
【redis】四、发布订阅与事务、管道
发布与订阅发布与订阅,类似于聊天室。在一个频道内,任何人可以在里面说话,然后订阅着都可以接收到。关注推广等等功能,都可以利用该技术 SUBSCRIBE channel 订阅渠道 UNSUBSCRIBE channel 取消订阅 PUNSUBSCRIBE 通配符取消订阅 PUBLISH channel value 发布信息 PSUBSCRIBE pattern,利用通配符订阅渠道 PUBSUB pattern,根据通配符查看渠道 事务.原创 2021-04-18 19:36:38 · 114 阅读 · 0 评论 -
【redis】三、redis的五大类型介绍和使用
redis基本类型string list hash set sorted set在redis中,都是以key-value方式存储数据。在key中,除了保存key的字符串以外,还保存了value的type(是哪种基本类型)、实际值的类型(是数字还是字符串)。这样做的好处是,每次命令,不需要拿到value之后才能判断这个命令是否正确(例如对字符串进行了自增命令)另外在redis中维护了正反索引,所以在选取范围的时候,开始下标设置为0,结束设置为-1,就是取全部数据。结束设置为-2,就是取从开始原创 2021-04-15 17:32:18 · 186 阅读 · 0 评论 -
【redis】二、redis安装
redis安装步骤一、下载并解压下载链接来自于官网$ wget https://download.redis.io/releases/redis-6.2.1.tar.gz$ tar xzf redis-6.2.1.tar.gz$ cd redis-6.2.1二、编译和启动直接MAKE 进入src目录,./redis-server 就可以启动redis了。但是该总情况,比较简陋,并且没有后台运行。所以采用以下方式make make install PREFIX=/opt/r原创 2021-04-15 16:09:20 · 91 阅读 · 0 评论 -
【redis】一.在redis之前的epoll
了解redis必须要了解的epoll作为单线程的redis,为什么这么快,主要原因还是对epoll函数的利用。所以,有必要先了解什么是epoll。为什么redis官网也只提供linux版本的,没有提供windows版本?就是因为只有部分linux系统中有epoll函数。windows版本都是各论坛大神自己改的redis,官网不提供,因为没有了epoll就失去了“快”这个特性!了解epoll那么就要了解BIO、NIO、(AIO)。BIO/ Block IO/ 阻塞IO在socket编程中,原创 2021-04-13 16:20:30 · 206 阅读 · 0 评论