- 博客(44)
- 收藏
- 关注
原创 JVM笔记
在编译期间根据逃逸分析的结果,来决定是否可以将对象的内存分配从堆转化为栈。如果经过逃逸分析后发现,一个对象并没有逃逸出方法的话,那么就可能被优化成栈上分配。逃逸分析:分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所引用,例如作为调用参数传递到其他地方中,称为方法逃逸。岁,可以通过参数 -XX:MaxTenuringThreshold 来设定 ),这些对象就会成为老年代。设置为1,以后对象在 Survivor 区每熬过一次 Minor GC,就将对象的。新生代:老年代=1:2。
2023-05-22 19:11:46 580
原创 Elastic-Job原理
3)设置作业的基本信息,在JobCoreConfiguration 中设置作业的名称(jobName),作业执行的时间表达式(cron),总的分片数(shardingTotalCount);当多个节点运行时,先选择一个主节点,当到达执行时间后,每个实例开始执行任务,主节点负责分片的划分,其它节点等待划分完成,主节点将划分后的结果存放到zookeeper中,然后每个节点再从zookeeper中获取划分好的分片项,将分片信息作为参数,传入到本地的任务函数中,从而执行任务。只会标记分片状态,不会重新分片。
2023-05-21 21:55:36 543
原创 spring笔记
可以在 spring 容器加载了 bean 的定义文件并实例化 bean 之后,在执行 bean 的初始化方法前后,添加一些自己的处理逻辑。是在 Spring 容器加载了定义 bean 的 XML 文件之后,在 bean 实例化之前执行的。Isolation.READ_COMMITTED:读已提交,只能读取到已经提交的事务,解决了脏读,存在不可重复读。在spring的bean的初始化过程中,就需要对实例化的bean进行代理,并且生成代理对象。@Transactional注解的切面逻辑类似于@Around,
2023-05-21 18:30:03 565
原创 锁 笔记
获取同步状态失败,将当前线程构造为节点加入同步队列,并阻塞当前线程。一个线程请求锁时,只要获取同步状态则成功获取锁,在该前提下,刚释放的锁再次获取同步状态概率很大,导致线程切换次数少,非公平锁开销小。后继节点判断自己的前驱节点是否为首节点,是则获取同步状态,不是则等待。首节点获取同步状态成功,释放同步状态时,唤醒后继节点。获取同步状态失败,重新计算超时间隔等待xx纳秒,如果仍未获得同步状态则返回。优先级反转,饥饿现象,吞吐量大。int记录状态,fifo双向队列存储线程管理同步状态。功能:独占,共享,查询。
2023-05-21 17:57:49 647
原创 redis笔记
给key设置了ttl,如果线程1获取锁后长时间阻塞,导致key过期被删除,之后其他线程正常获取锁,线程1唤醒后执行完,del lock(此时的lock是别的线程的锁)。并发时,为响应速度提高,将部分数据在redis中缓存,在redis中更新数据,将更新的数据存在jvm阻塞队列中,再异步的将数据更新到数据库。查询不存在的数据(redis和数据库都没有),redis没有,请求会打到数据库。大量并发,数据库承受大量请求。get和del是两步操作,不是原子的,del时线程长时间阻塞,key过期被删除,同上。
2023-04-27 16:55:39 552
原创 mysql笔记
⑩Extra(Using index:表明相应的select操作中使用了覆盖索引,避免访问表的额外数据行,索引用来读取数据而非执行查找动作,Using where,表明索引被用来执行索引键值的查找)(对应id,id的值表示select子句或表的执行顺序,id相同,执行顺序从上到下,id不同,值越大的执行优先级越高)在a相同的情况下b是有序的,在b相同的情况下c是有序的,但是在a相同的情况下c不是有序的。:读到别人未提交的数据。A事务修改数据未提交,B事务读取数据,A撤销修改数据,则B读到的数据无效。
2023-04-27 16:43:11 1242
原创 mysql——命令
结果集的列数相同(字段类型不要求)即可。union 后字段的名称以第一条 SQL 为准。合并两个或多个select语句的结果集,并消去联合后表中的重复行。union只能作用于select结果集,不能直接作用于数据表,join只能作用于数据表,不能直接作用于select结果集。去重,只能放在所选列的开头,其他列用GROUP BY。
2023-04-22 17:28:19 339
原创 redis——优化
现:拆为100各hash 每个1万条数据,每个之前加不同前缀。如果节点过多,携带数据会很大,使用带宽变大,导致网络堵塞。内存不足 key频繁被删,qps不稳定,响应时间增长。多个节点之间互相ping ,同时携带集群和插槽信息。拆分成多个小的hash每个hash一部分数据。info memory 查看内存情况。有个别插槽不可用则认为整个集群不可用。redis做集群,客户端需要选择节点。集群需要使用代码完成,增加复杂度。部分命令不支持集群,只能单机。eg:原数据1-100万。
2023-04-12 21:12:06 897
原创 redis——分布式
tomcat的性能不如redis,如果放在redis之前,限制了系统并发量。redis未命中的情况下,请求不会直接达到数据库,保护数据库。客观下线:一半以上(可变)的sentinel认为实例故障。key的有效部分({}中包含的部分)hash 计算插槽。tomcat内部实现进程缓存(jvm进程缓存)将多个插槽(16384)分给多个master。redis备份文件(快照)将redis全部命令存储。添加/删除节点,插槽重分配。主观下线:一段时间未响应。
2023-04-12 19:47:40 650
原创 redis——使用
给key设置了ttl,如果线程1获取锁后长时间阻塞,导致key过期被删除,之后其他线程正常获取锁,线程1唤醒后执行完,del lock(此时的lock是别的线程的锁)。并发时,为响应速度提高,将部分数据在redis中缓存,在redis中更新数据,将更新的数据存在jvm阻塞队列中,再异步的将数据更新到数据库。:如果每次只读一条最新消息(设定Id为$),如果一次加入多个消息,则只读到了第一个,其他消息漏掉。get和del是两步操作,不是原子的,del时线程长时间阻塞,key过期被删除,同上。
2023-04-12 16:04:21 947
原创 redis内存回收——过期、淘汰
volatile-lfu:基于LFU算法,从设置了过期时间的key中,删除掉最不经常使用(使用次数最少)的key。allkeys-lru:基于LRU算法,从所有key中,删除掉最近最少使用的key。allkeys-lfu:基于LFU算法,从所有key中,删除掉最不经常使用(使用次数最少)的key。volatile-lru:基于LRU算法,从设置了过期时间的key中,删除掉最近最少使用的key。volatile-ttl:将设置了过期时间的key中即将过期(剩余存活时间最短)的key删除掉。
2023-04-10 20:03:23 1484 1
原创 redis网络模型
核心业务部分(命令处理):单线程核心网络模型:多线程,提高cpu利用率redis,纯内存操作,快性能瓶颈为网络延迟,多线程没有帮助多线程上下文切换有开销多线程存在线程安全问题,需要引入锁,复杂度提高,性能降低。
2023-04-10 12:55:04 619
原创 redis——数据结构
多个zipList,双端访问,内存占用低,存储上限高。数据量小(128),且每个元素大小较小(64B),则使用zipList。ziplist,相邻两个节点,一个存key,一个存value。根据score(value)排序,member(key)唯一。zipList:压缩列表,双端访问,内存占用低,存储上限低。大量string数据每一个都需要一个对象头,占大量空间。linkedList:双端链表,内存占用高,内存碎片多。dict:key存值,value为null,内存占用大。数据存两份,耗费内存。
2023-04-04 12:17:29 506
原创 redis源码解析(四)——ziplist
版本:redis - 5.0.4参考资料:redis设计与实现文件:src下的ziplist.c ziplist.h一、基础知识压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序性数据结构。一个压缩列表可以包含任意多个节点,每个节点可以保存一个字节数组或者一个整数值(短字符串或小的整数)。1、压缩列表的各个组成部分及详细说明zlbyteszlt...
2023-04-03 18:40:48 633
原创 redis源码解析(三)——dict
版本:redis - 5.0.4参考资料:redis设计与实现文件:src下的dict.c dict.h一、dict.hdict(字典),又称为符号表,关联数组或映射。用于保存键值对。字典使用哈希表作为底层实现。1、注释/*Hash Tables Implementation. * This file implements in-memory hash tables with ...
2023-04-03 18:17:58 971
原创 redis源码解析(二)——SDS(简单动态字符串)
版本:redis - 5.0.4参考资料:redis设计与实现文件:src下的sds.c sds.h一、基础知识c语言中,字符串最后需要加一个空字符‘\0’,作为结束标志。sds延续了这种做法,兼容部分c字符串函数。二进制安全:由于以空字符作结束标志,所以C语言中,字符串里不能包含空字符。为了解决这个问题,sds以处理二进制的方式处理数据。sds同样用字符数组存储字符串。字符串修改...
2023-04-03 17:26:27 1057 1
原创 kafka笔记
分区应答,回复成功,则清除sender发送的数据以及分区器队列中的数据,失败则重试(次数不限)。原因说明:因为在kafka1.x以后,启用幂等后,kafka服务端会缓存producer发来的最近5个request的元数据,故无论如何,都可以保证最近5个request的数据都是有序的。有指定分区,按指定分区,没有制定分区按key,没有制定分区没有key,随机一个一直使用直到已满或已完成,再随机一个(必须和上一个随机的不同)①②有序,正常落盘,应到③,实际收到④,则内存中缓存④,直到收到③。
2023-03-26 20:59:27 1826
原创 TCP、UDP
4B,32bit无符号数,范围0~2^32 -1,TCP源向目的发送数据字节流,用顺序号对每个字节计数,表示该报文段中第一个数据字节的顺序。MSS=MTU(以太网最大传输单元,一般为1500B)-IP头(20B)-TCP头(20固定+12可选)=1448B(1460B)源ip(4B)+目的ip(4B)+0(1bit)+17(1bit)+UDP长度(2bit)源ip(4B)+目的ip(4B)+0(1bit)+6(1bit)+TCP长度(2bit):2B,0~2^16 -1,从确认号开始源端可以接收的字节。
2023-03-10 22:41:07 420
原创 计算机网络模型、协议
网络地址转换,属于接入广域网技术,是一种将私有(保留)地址转为合法ip地址的技术。无盘工作站将RARP数据包广播给RARP服务器,服务器收到后将ip返回。因为以广播方式请求报文,所以rarp只能用于广播。用于无盘工作站(不能存储配置的ip地址)主机建立自己的ARP缓冲区存ARP列表。单文件传输,提供不复杂开销小的文件传输。简单,快速,适用于分布式超媒体信息系统。广播ARP请求,单播ARP响应。RARP服务器存储ip-mac。动态主机配置DHCP。
2023-03-05 15:24:01 372
原创 ThreadLocal
由于value 是强引用,不会被清理,依然存在,就会出现 key 为 null 的 value,value无法访问。然而由于threadLocalMap的生命周期=线程,线程池通常采取线程复用的方法,所以线程池中的线程很难结束。解决方式:用完threadLocal,调用remove清除无用的entry,由于Entry继承了弱引用类,会在下次GC时被JVM回收。方式二:ThreadLocal在每个线程中都创建了一个变量的副本,线程各自访问自己的副本变量,则不存在变量共享问题。关联线程和线程上下文。
2023-03-01 21:12:03 930
原创 JDK1.8 ConcurrentHashMap
将table分成n份 ,每份长度为stride,table大小除以CPU数量,平分给各个线程,每个线程对当前旧table中[transferIndex-stride, transferIndex-1]位置的结点进行迁移。迁移时不需要rehash,同hashmap一样计算新下标即可。JDK1.8 中采用CAS + synchronized,锁首节点,粒度更小。hash定位到node,复制节点前的链与节点后的链相连,跳过节点,即为删除。∵使用volatile修饰next,所以next值具有不变性,需要头插。
2023-03-01 17:17:20 658
原创 k8s学习笔记
pod生命周期:init c(初始化容器,0个或多个 eg:某pod需要xx文件才可以运行,此时则在创建文件,上一个initc成功结束,才能开启下一个initc,正常退出结果为0,如果异常退出,结果非0,则根据策略进行重新运行或结束。eg:一个pod中有两个容器 ab,a先启动,b再启动,顺序是 initcA -》initcB + maincA -》maincA +maincB或maincB,可能b容器启动好的时候a容器还未启动完成,则出错-》退出,重启,若容器不存在就绪探测,默认状态为success。
2023-02-26 19:56:08 355
原创 java基础
String是final的,所以其成员方法都是final的,不允许继承。具有唯一性、不变性,可做map的key。不同的字符串变量都指向字符串池的同一个字符串。创建时hashcode就被缓存。
2023-02-26 19:44:58 529
原创 synchronized
JVM检查该标识符是否被设置,如果设置,则先获取monitor再执行方法体,执行完毕释放monitor。用逃逸技术判断一段代码中,堆上的数据不会逃逸出当前线程,则认为代码线程安全,不必加锁。设置自旋次数,超出次数即阻塞,若自旋成功则下次自旋次数增加,失败则下次自旋次数减少。系统实现线程切换需要在用户态和核心态之间转换,成本高时间长效率低。多个连续加锁加锁合并为一次,减少内核态和用户态的切换。轻量级锁CAS失败,自旋获取锁,cpu消耗大。增加了锁升级,在竞争激烈时,效率降低。monitor&对象 一对一。
2023-02-26 16:45:14 161
原创 CAS操作
当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。:内存地址V,旧的预期值A,即将要更新的目标值B。
2023-02-26 11:38:51 97
原创 volatile
∴补足64字节(高速缓存行的长度)独占一个高速缓存行。原子性:与CAS结合保证原子性,volatile本身不保证操作原子性。线程安全:volatile不能保证操作的原子性,所以并不是线程安全的。volatile:线程访问共享变量,通过排它锁单独获得该变量。共享变量不足64字节,则与其他数据共同存在于一个高速缓存行。共享变量频繁写,则频繁锁定当前缓存行,其他处理器数据失效。一般高速缓存行64字节宽(有的32),不支持部分填充。∴volatile直接存于主存,易变,不稳定。顺序性:禁止指令重排序,效率↓。
2023-02-21 18:04:16 111
原创 2021-09-28
Unable to get an update from the "local" chart repository (http://127.0.0.1:8879/charts): Get "http://127.0.0.1:8879/charts/index.yaml": dial tcp 127.0.0.1:8879: connect: connection refused修改repo即可 helm install excited-squid stable/mysqlError:
2021-09-28 15:18:09 416
原创 docker镜像:exec user process caused “no such file or directory“
在k8s上 运行docker镜像,报错:standard_init_linux.go:207: exec user process caused “no such file or directory”原因:windows下文件默认编码格式为dos,linux下默认为unix。因此在解析文件时出错,报错no such file or directory。验证方式:将Dockerfile 文件放在linux下查看。运行 cat -v Dockerfile 结果RUN chmod +x /app
2020-10-01 19:17:47 2300
原创 http笔记
HTTP和HTTPSHTTP:B/S 应用层通信协议。Web服务器上存放超文本信息,客户端通过HTTP协议传输所要访问的超文本信息。HTTPS = HTTP + SSL(加密),HTTPS不是一个新的协议。http问题https解决方案通信内容为明文通信加密报文可能被篡改完整性保护通信双方的身份未验证证书认证注:http有报文完整性检测(MD5,SHA-1),但MD5本身可能被篡改加密方式共享密钥加密(对称密钥)双方使用同一密钥对传输报文进行加密解密
2020-07-25 13:41:03 586
原创 java中instanceof的实现原理
(secondary super):所有其它超类型(接口、数组相关以及超过深度7的超类),存于一个数组(在初始化数组时分情况按顺序填好)。(T) obj 不引发ClassCastException,返回true,否则为false;(primary super):类继承深度从0到7的超类,存于长度为8的缓存数组。类所继承的超类和所实现的接口不会在运行时改变。可以将这些信息存储起来。在字节码使用特殊指令对常量池中的相关符号引用进行判断。总结:obj==null,返回false;不用遍历继承链等(性能差)
2019-07-18 19:01:35 4727 4
原创 JDK1.8 Hashmap源码解析
hashmap这样做是为了之后运算(位运算)方便,同时在hash时选择更好的hash函数,以抵消2的n次方带来的不便。index = (n - 1) & hash,如果这一位是0,则index = index,否则,index = index + oldCap。线程2唤醒开始执行扩容,此时线程2指向node1,且next节点为node2,但node2的next节点又为node1,出现死循环。扩容,就是给原来的容量乘2,也就是把原来容量oldCap左移一位,这时2^n的好处就表现出来了。
2019-05-14 22:16:52 589 1
原创 java中的锁——对象锁、类锁
对象锁(方法锁)针对一个对象实例,只锁住当前的对象。在该对象的某个内存位置声明一个标识,说明该对象是否拥有锁。synchronized修饰普通方法,即为对象锁synchronized修饰的代码块传入this也属于对象锁//对象锁的两种形式public synchronized void fun() {}synchronized (obj) { ... }...
2019-04-29 16:03:21 690 1
转载 inline,static inline
本文摘自网络各处,具体出处已不可考inline函数被调用时,需要出栈入栈。当函数频繁被调用时,则不断地有函数出栈入栈,会造成栈空间或栈内存的大量消耗。所以引入了inline。inline:在函数声明或定义中函数返回类型前加上关键字inline,即可以把函数指定为内联函数。内联函数:建议编译器对一些特殊函数进行内联扩展(有时称作在线扩展)。也就是说建议编译器将指定的函数体插入并取代每一处调用...
2019-04-24 09:14:16 3255 2
原创 java中的锁——偏向锁,轻量级锁,重量级锁
否则测试Mark Word中偏向锁的标识符是否为1(当前是否为偏向锁,1是0否),如果不是偏向锁则使用CAS竞争锁(使用CAS将对象头的偏向锁指向当前线程),如果是则尝试使用CAS将对象头的偏向锁指向当前线程。偏向锁的撤销,需要等待全局安全点(在这个时间点上没有字节码正在执行),它会首先暂停拥有偏向锁的线程,检查持有偏向锁的线程是否处于活动状态(同步代码块是否执行完),不处于活动状态则将对象头设置为无锁状态,线程可以使用CAS竞争锁。),那么该线程会自动获取锁,降低获取锁的代价。
2019-04-21 18:20:33 1816 2
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人