- 博客(52)
- 资源 (1)
- 收藏
- 关注
原创 synchronized锁升级概述
在动态编译同步块的时候,JIT编译器可以借助一种被称为逃逸分析(Escape Analysis)的技术来判断同步块所使用的锁对象是否只能够被一个线程访问而没有被发布到其他线程。如果同步块所使用的锁对象通过这种分析被证实只能够被一个线程访问,那么JIT编译器在编译这个同步块的时候就会取消对这部分代码的同步。
2023-03-19 23:09:25
150
原创 Spring Cloud Alibaba常用组件-Nacos简介以及下载和安装
Spring Cloud Alibaba常用组件-Nacos简介以及下载和安装
2022-12-23 19:06:25
233
原创 git将指定分支上的commit合并至其他分支
场景需要将某些分支上的一部分代码抽离出来到另外一个分支上单独提测以及上线解决方案git cherry-pick $commit_idcommit_id可以使用 git log进行查看如下图可以使用git cherry-pick --abort 命令放弃本次合并的需求...
2022-05-31 14:40:42
203
原创 zookeeper源码安装过程(简要)个人记录
1.安装jdk8以上版本(安装oracle的)2.wget 下载网址:tar.gz3.tar xf zookeeper4.在opt下定义一个安装目录,并且将解压的文件mv移动过去5.cp conf文件为 zoo.confgtickTime=XXX 心跳毫秒值(主从之间的心跳,以及客户端和整个集群服务的心跳时间)initLimit=10 主允许和从节点建立链接tickTimeinitLimit 的延迟时间syncLimit=5 主下发操作给从initLimitsyncLimit 这个时间没有给响
2022-02-12 10:39:33
1338
原创 redis为什么使用单线程
为什么使用单线程1.多线程会增加线程上下文切换开销2.多线程需要精细的设计,使得代码的不好维护3.数据是存在于内存中的,采用多线程会导致资源竞争,此时就要引入锁机制,随着线程的增加吞吐量会下降为什么如此之快1.数据是纯内存操作,寻址速度快是磁盘寻址的10W倍2.数据结构简单,对数据操作简单3.单线程没有线程切换开销4.使用的IO模型为,io多路复用epoll...
2022-02-05 18:54:09
910
原创 redis源码安装过程(简要)
基本步骤1.找到想要安装目录2.wget redis源码3.cd redis源码目录4.查看README.md,根据步骤来5.make 安装gcc(6.0需要升级GCC)6.make7.cd src 中有可执行程序8.源码目录执行 make install PREFIX=/opt/zyc/redis69.vi /etc/prodileexport REDIS_HOME =/opt/zyc/redis6export PATH=$REDIS_HOME/binsource
2022-02-05 17:39:13
3304
原创 java四种引用基本介绍
强引用开发种使用最多的,new对象都是强引用,只有没有指针指向的时候才会被GC回收软引用内存不够的时候,当发生GC的时候就会被回收,多被用于缓存(有了redis基本也不会使用这个了)弱引用只要产生GC就会被回收掉,ThreadLocal中存储在线程map中的this是一个弱引用虚引用虚引用被回收的时候会将虚引用放在一个队列中,如果队列中有值,则认为发生了垃圾回收,可以根据这个信号做其他操作。...
2021-10-26 22:49:43
77
原创 java线程关键字说明
sleep 睡眠指定时间,线程变为TIMED WAITING状态,注意不会释放锁。wait 等待线程等待,线程变为WAITING状态,需要在synchronized中使用。notify唤醒队列中线程,线程变为RUNNABLE状态,和wait配合使用。notifyAll 唤醒所有等待的线程,线程变为RUNNABLE状态。yeild 退出cpu占用,变为就绪状态join 一个线程执行另一个线程的join方法,在执行的那一行直接去执行另一个线程,另一个线程方法执行完了才返回调用join的位置再向下执行。
2021-10-26 22:37:32
310
原创 线程结束的方式
结束线程的几种方式总结1.stop 二话不说直接停止,不建议使用会导致数据不一致(比如此线程正在持有锁,停止会释放掉锁导致结果出乎意料)2.suspend 暂停 不建议使用,与1相同3.resume 恢复执行 不建议使用,与1相同4.volatile 定一个变脸被其修饰,可以通过判断这个变量来决定是否结束,不建议使用,如果在循环中使用,不一定循环多少次才停止5.inerrupt 设置中断标记位,检测到中断标记了,就停止,相对于4更好的原因是 不需要一直等,如果在代码中使用sleep,wait,j
2021-10-26 22:25:51
205
原创 精简synchronized和Lock的区别
话不多说直接来1.synchronized是jvm的关键字,Lock是java的接口2.synchronized不可中端,Lock可以被中断3.synchronized是非公平锁,Lock可以是公平锁也可以是非公平锁4.synchronized可以锁定代码块或者对象,Lock只能锁定代码块5.synchronized不需要手动解锁,Lock必须要手动解锁6.synchronized不能知道是否获取到了锁,Lock可以知道是否获取到了锁7.Lock可以使用读锁提高效率,synchronized没
2021-10-26 22:14:46
76
原创 插入排序算法
什么是选择算法选择算法是说保持0-N范围内有序,依次是0-1,0-2,0-3,0-4 ~~ 直到0-N,每次要进行顺序操作的数都要与之前的所有数进行比较并按要求换位置。为什么使用选择算法当然还是为了数组排序啦如何实现 /** * 0 ~ n 保证顺序,每次都是一直往前看直到不比前面小,或者最左边。 * 外层循环从1开始的原因是因为0-0位置天然有序 * @param arr */ public static void insertSort(int
2021-10-26 22:02:39
64
原创 冒泡排序算法
什么是冒泡排序?冒泡排序就是将数组从0位置开始没两个位置互相比较,并按照排序要求互换。举例:例如[1,5,3,8,9],1-5比较,不换,5-3比较换位置以此类推直到最后一个。为什么使用冒泡排序?当然是为了数组排序如何实现 /** * 冒泡排序:0 1 1 2 2 3 4 5 5 6 按照此下标挨个对比大小将小的交换到前面 * 这样一次循环之后最大的值肯定是在数组的最末尾,此时最末尾就不需要加入比较了,所以外层循环每次--,放过最大数 * 因为每次都是
2021-10-26 21:55:46
63
原创 选择排序算法
什么是选择排序?个人理解:乱序的数组中,第一次循环找到最小的和0位置交换,第二次循环找到最小的和1交换,直到数组循环完毕。为什么使用选择排序?顾名思义:为了排序此处直接贴出main方法如何实现main方法如下 public static void main(String[] args) { // 首先定义无序数组 int[] arr = {5,3,2,6,9,77,88,42,12,31}; // 打印排序前数组 print(ar
2021-10-22 18:03:00
102
原创 jdk自带监控分析指令之-jhat
什么是jhat?jdk自带的可以对jmap导出的dump进行分析的命令行。可在安装的jdk->bin目录下找到,如下为什么使用jhat?既然jdk提供了jmap生成dump文件,那理所当然会有一个对此类文件进行分析的命令,也就是jhat啦,不过从jdk9开始jhat就被删除掉了,因为jdk不仅提供了jhat还提供了另一个可视化的分析工具jvisualvm(推荐使用)如何使用jhat?使用jmap生成dump文件(jmap使用详解),此时我将生成的文件命名为cccc.hprof。1.执行
2021-09-22 17:04:35
2699
1
原创 mysql-按照指定字段排序
select * from order ORDER BY FIELD(status, ‘UNPAID’, ‘DELIVERED’, ‘PAID’, ‘WAIT_DELIVER’) desc/asc
2021-09-17 16:48:14
1057
原创 jdk自带监控分析指令之-jmap
什么是jmap?jmap是jdk自带的命令,主要用于导出堆转储文件,也可以进行jvm分代空间内存检测,以及对象大小个数排序,可在安装的jdk->bin目录下找到,如下为什么使用jmap?当发生程序响应时间变长,cpu load过高,GC频繁,OOM,内存泄漏,死锁就意味着应用出现了问题,就可以使用jmap来导出dump文件,然后对文件进行分析,从而找到问题所在。怎么使用?命令行输入jmap1.jmap -heap 25536 展示堆中的配置参数以及堆中各区域的使用情况。2.jm
2021-09-17 15:56:07
940
原创 jdk自带监控分析指令之-jstat
什么是jstat?jstat是jdk的命令(查看jvm的统计信息),可以监控类似类加载信息,GC信息等,可在安装的jdk->bin目录下找到,如下为什么使用jstat?当程序进行执行之后会产生类加载信息以及GC的信息,可以使用此命令对GC信息进行监控,可以对监控的信息进行分析,然后调优。怎么使用?在命令行页面输入jstat,使用信息如下。参数介绍1.option-> 不同的参数(后面介绍)2.vmid -> 进程id3.t -> 程序运行时间(秒)4.lin
2021-09-16 14:57:31
457
原创 jdk自带监控分析指令之-jinfo
什么是jinfo?jinfo是jdk提供的可以查询jvm所有配置以及指定配置和修改的命令。为什么使用jinfo?我们虽然可以手动设置jvm的相关配置参数,但是有些参数是jvm初始化的默认值,有时我们想知道初始化的这些值,由此jinfo应运而生。怎么使用?打开命令行输入jinfo,命令的书写规范如下。1.jinfo -flags 24352(pid),查找指定pid中的所有配置信息,包含命令行变量以及vm变量。2.jinfo -flag MaxHeapFreeRatio(jvm的变量) 24
2021-09-16 12:32:49
254
原创 jdk自带监控分析指令之-jps
什么是jps?jsp是jdk自带的查看java进程的指令,可在安装的jdk->bin目录下找到,如下图:如果忘记了自己jdk的安装目录可以使用java -verbose为什么使用jps?使用jps可以很清晰的查看当前正在运行的java进程,方便之后的其他指令的使用。怎么使用?使用jsp -h 查看jps的书写格式如下图jsp后面可以跟的参数包括,q m l v,下面我们分别尝试一下1.执行jps,展示的为进程id以及对应的名称描述,此处Test为我启动的main函数。2.执
2021-09-16 10:06:58
318
原创 java intern看这一篇就够了
intern的概念?官方解释就不说了,说说个人理解,简单点就是一个字符串使用intern方法后就会发生如下逻辑:如果此字符串不在字符串常量池中则将此字符串放置在字符串常量池中,否则不动。为什么使用intern方法?个人理解:使用intern可以将字符串放置到字符串常量池中,方便字符串的重复利用。intern解析看如下代码:大家都知道==操作是判断对象的地址是否相同,那么这段代码的结果是什么呢?答案:false为什么是false?原因:第一行new String(“ab”)创建了两个对象
2021-08-01 16:05:54
680
原创 new String()到底创建了几个对象?看这一篇就够了
经典面试题String s = new String(“ab”)会创建几个对象?相信大家肯定都被问到过这个问题,相信大家也都知道答案,对是两个,是哪两个呢? 为什么是两个呢?哪两个?1.new关键字在堆空间分配一块空间存放new的对象2.在常量池中放置"ab"(前提是字符串常量池中不存在"ab")为什么是两个?(证明)要想了解为什么最直接的就是字节码,下面我们看一下一目了然,第一行一个new关键字创建了一个,第三行ldc是将"ab"放置在字符常量池中,所以是两个。如果代码携程这样再看一
2021-08-01 14:10:17
3627
4
原创 java对象实例化,内存布局以及访问定位
创建对象的几种方式 1.new对象,相信大家最常用的就是这个 存在两种变形 1.类的静态方法,例如单例模式 2.builder以及factory方法 2.Class的newInstance():反射的方式,但是只能使用空参构造器,权限也必须是pubilc 3.Constructor的newInstance(XXX):依然是反射的方式,可以调用有参的构造器,权限没有限制 4.使用反序列化:从文件或者网络中获取对象的二进制流 5.clo
2021-07-24 16:03:11
98
原创 jdk1.6,1.7,1.8方法区的变化
什么是方法区jvm中存储对象类型信息的地方,是jvm重要的组成部分之一。方法区中存储什么 1.类型信息(域信息,方法信息) 2.运行时常量池 4.静态变量 5.JIT代码缓存版本更迭变化对比版本内容JDK1.6及以前方法区的具体实现为永久代,静态变量存储在永久代上,永久代为虚拟机内的一块内存JDK1.7依然存在永久代,但是已经开始去除永久代,将字符创常量池以及静态变量存储在堆中JDK1.8及以后方法区的具体实现变为元空间,元空间使用的是本地内存,存储
2021-07-24 15:22:22
656
2
原创 mysql查询默认存储引擎及简单对比
查看数据库默认存储引擎show variables like ‘table_type’;查看当前数据库支持的存储引擎1.show engines;2.show variables like ‘have%’;常用存储引擎对比可在建表语句后加ENGINE=存储引擎名,来指定表的存储引擎;**alter table table_name engine = innodb;**可使用此语句更改表的存储引擎...
2020-11-13 19:42:02
155
1
原创 EXPLAIN各个参数详解
select_type:表示 SELECT 的类型。常见的取值有 SIMPLE(简单表,即不使用表连接或者子查询)PRIMARY(主查询,即外层的查询)UNION(UNION 中的第二个或者后面的查询语句)SUBQUERY(子查询中的第一个 SELECT)等。table:输出结果集的表。type:表示表的连接类型,性能由好到差的连接类型如下1.system(表中仅有一行,即常量表)2.const(单表中最多有一个匹配行,例如 primary key 或者 unique index)3.eq
2020-11-13 17:48:06
4083
原创 mysql查看数据库状态及定位慢sql
查看数据库状态show [session|global] status 可以根据需要加上参数“session”或者“global”来显示 session 级(当前连接)的统计结果和 global 级(自数据库上次启动至今)的统计结果。如果不写,默认使用参数是“session”mysql> show status like ‘Com_%’;Com_xxx 表示每个 xxx 语句执行的次数,我们通常比较关心的是以下几个统计参数。Com_select:执行 select 操作的次数,一次查询只累
2020-11-13 17:30:45
208
原创 全网最简单粘贴即用redisson分布式锁实现
导入redissonmaven<!--redisson客户端--> <dependency> <groupId>org.redisson</groupId> <artifactId>redisson</artifactId> <version>3.10.2</version> </dependency
2020-07-31 19:02:32
87
原创 spring如何条件化加载bean
问题spring 在启动的时候会自动加载被spring相应注解注解的可以实例化的bean,有时候会有在开发环境下不实例化,在生产实例化的需求,这时候要怎么解决呢?Conditional注解接口全路径:org.springframework.context.annotation.Condition通过将次注解放置到想要条件化加载的bean上,参数是一个实现类,实现类中要实现Condition方法,全路径为:org.springframework.context.annotation.Condition
2020-07-23 19:12:54
698
原创 git撤销已修改的提交
未使用add时1.使用git checkout – 文件名 可以撤销此文件修改的提交。2.使用git checkout . 可以撤销所有文件修改的提交。3.如果是新增的文件,那么上述两种方法是不可以的,可以直接删除掉使用了add已经进入了缓存1.使用git reset HEAD 文件名2.使用git reset HEAD .需要注意的是上述操作并不是直接撤销了修改的提交而是撤销到了未使用add时的一个情况,可以再参照未使用add的情况进行操作已经commit1.使用git reset -
2020-07-20 19:14:28
254
原创 jvm垃圾回收器G1介绍
G1是什么1.G1是jvm的一个垃圾回收器,其和以往的垃圾回收器有很大的不同,已经不采取物理分代了,只是在逻辑上存在分代的概念,之前的垃圾回收器都是一大块的内存,G1则是一个个的Region。一个Region可以是任何代。2.G1是一种服务端应用垃圾收集器,目标是用在多核,大内存的机器上,它在大多数情况下可以实现指定的GC暂停时间,同事还能保持较高的吞吐量。3.吞吐量相较于ps降低了百分之十-百分之十五,响应时间可以达到200ms。G1的停顿时间很短。G1运行原理采用了分而治之的思想,分为若干个R
2020-05-30 16:17:28
549
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人