- 博客(71)
- 收藏
- 关注
原创 java http上传接收文件
commons-httpclient commons-httpclient 3.1 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4...
2022-04-20 22:58:56
2127
2
转载 HashMap的hash方法简述
来源:蔚来一面:HashMap 的 hash 方法原理是什么?看完这篇还不懂HashMap的hash原理,那我要哭了~ static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }将它右移16位h >>> 16的原因:hashCode是int32位,右移16位,即取高位。
2021-09-23 10:21:46
472
转载 LockSupport.park和unpark,wait和notify
LockSupport.park方法使当前线程阻塞,unpark可以恢复其运行。LockSupport和每个使用它的线程都与一个许可(permit)关联。permit相当于1,0的开关,默认是0,调用一次unpark就加1变成1,调用一次park会消费permit, 也就是将1变成0,同时park立即返回。再次调用park会变成block(因为permit为0了,会阻塞在这里,直到permit变为1), 这时调用unpark会把permit置为1。每个线程都有一个相关的permit, permit最多只有
2021-09-22 15:50:08
396
原创 ThreadLocal.ThreadLocalMap分析
参考文章:ThreadLocal源码分析_02 内核(ThreadLocalMap)循环获取下标,形成一个环。getEntry方法:先根据key计算出索引下标,获取到entry。如果没有获取到对应的entry,调用getEntryAfterMiss继续获取没有获取到对应的entry,可能有2种情况:1,不存在该线程对应的value;2,hash冲突,该entry被放到了后面(解决hash冲突不是在该slot上使用链表,而是放到后续的slot中)getEntryAfterMiss方法:
2021-09-17 17:36:35
199
转载 IDEA debug高级操作
转载自https://blog.youkuaiyun.com/skylibiao/article/details/116136304回退断点方法调用栈区域,在idea里测试无法一行一行地回退或回到到上一个断点处,而是回到上一个方法。选择要回退的方法,右键选择Drop Frame,回退到该方法的上一个方法调用处,此时再按F9(Resume Program),可以看到程序进入到该方法的断点处了(之前的某些参数/数据的状态已经改变了的是无法回退到之前的状态的,如对象、集合、更新了数据库数据等等)。中断debu
2021-09-11 11:19:02
191
原创 事件监听器
最近在项目中听同事讲起事件监听这个功能,总是感觉模糊,于是想要研究一下。事件监听里面有三个角色:事件监听器事件源代码中,事件源要包含事件对象,也要注册事件监听器对象列表。在触发事件后,循环调用事件监听器的onEvent方法。事件对象也要保存有事件源对象。如此,在事件源触发某一事件后,就一一执行事件监听器的方法...
2021-08-10 22:07:15
195
原创 mybatis中找不到mapper.xml的问题
注意,mapper.xml放在资源目录resources的文件夹下,是文件路径,不是包路径。创建文件夹的时候不能使用"."来表示创建子文件夹,要用“/”。比如mybatis/mapper,不能这样创建:mybatis.mapper。否则报错了很难发现问题。...
2021-07-31 12:08:44
636
原创 seata分布式事务项目中无法传递xid的问题
最近在seata项目中遇到xid无法通过feign传递到其他微服务的情况。网上找了资料解决seata在Fegin开启熔断(Hystrix)微服务之间无法传递事务XID的问题以及无法传递oauth2 token的问题兼容Zipkin,由于该文章没有说到最重点的地方,所以一时还未发现问题在哪。于是打断点跟踪,看到当前服务是有xid的,但是通过feign调用时,xid就不见了,感觉很诡异。又重启服务并debug,还是一样。折腾了好长时间都没有进展。后面想到,既然当前服务有xid,经过feign时就没有了,那么中
2021-07-31 11:33:12
2875
4
原创 HashMap的初始化与扩容
初始化无参构造器只为加载因子赋值为0.75,capacity和threshold不赋值设置初始容量的构造器初始化threshold值为不小于初始容量的最近的2的n次幂(比如初始容量为7,则threshold为8)扩容两种情况下会扩容(resize):1.初始化后第一次put,2.元素个数大于threshold值未设置初始容量第一次put初始化capacity为16,threshold为12元素个数大于threshold将capacity扩大一倍,threshold也扩大一倍设置过初始
2021-07-04 16:53:48
1029
1
原创 CopyOnWriteArrayList的使用场景
1.适用于数据量不大的场景,不适用于数据量大的场景。由于写操作的时候,需要拷贝数组,会消耗内存,如果原数组的内容比较多的情况下,可能导致young gc或者full gc2.适用于读多写少的场景,不适用于实时读的场景。CopyOnWriteArrayList能保证写操作的线程安全,也能保证数据的最终一致性,但是无法保证数据的实时一致性。CopyOnWriteArrayList在写操作中,使用了ReentrantLock锁以保证线程安全,并替换原array属性;但是读的时候直接读取array,可能会发生
2021-06-27 12:08:27
2502
原创 MySQL偶尔的卡顿
redo log的write pos是指写的位置,checkpoint之前表示擦除完了的。当write pos和checkpoint相遇的时候表示redo log已经写满了。这个时候数据库会停止进行更新语句的执行,转而进行redo log日志同步到磁盘中。此时数据库更新请求就会卡顿。...
2021-05-23 15:36:41
317
原创 线程池的几个常识
线程并没有区分是核心还是非核心,并不是先创建的就是核心,超过核心线程数后创建的就是非核心,最终保留哪些线程,完全随机。allowCoreThreadTimeout可以设置核心线程为可回收,但不建议这么做。何时回收非核心线程?看getTask()方法:当当前线程数大于核心线程数,且工作队列为空时,在getTask()方法中调用compareAndDecrementWorkerCount方法,将线程数减一。getTask方法返回null后,runWorker方法内部的while循环结束,执行proces
2021-05-21 11:03:27
111
原创 数据已删除,又重新出现的问题排查
一个棘手的问题:用户描述:一笔交易加入到某记账簿中,删掉,第二天看,又自动加入到该记账簿中去了。根据用户的描述,追查整个流程:建记账簿时会加载一次交易,但用户的交易是在记账簿建好之后加进去的,排除;实时加载会有问题吗?用户...
2021-04-13 12:30:06
442
原创 2个地方使用Springboot的@Scheduled,其中一未生效
第一处使用@Scheduled,是while循环,没有退出的。第二处使用@Scheduled,是每30分钟执行一次。第一处正常执行,第二处就是不执行。原因:schedule默认是单线程的线程池执行,如果某个定时任务耗时很长,到了其他定时任务执行的时间,因为线程未释放,其他定时任务也会无法执行。解决办法:指定线程池大小@Configurationpublic class ScheduleConfig implements SchedulingConfigurer { @Override
2021-04-12 17:49:16
1081
转载 java8 map reduce
reduce的用法java8 map reduceOptional<T> reduce(BinaryOperator<T> accumulator);里面的accumulator是BinaryOperator类型,该类的父类是BiFunction。也就是说,该方法是要有返回值的。// 求和stream.reduce((a, b) -> a + b);Optional<T> reduce(U identity, BinaryFuncti
2021-04-08 17:07:13
260
原创 @PostConstruct方法内部死循环引起的问题
一个springboot项目,由于该项目部署在微服务环境中,会被定时检测心跳,结果死活检测不到心跳(调用该工程的/health请求)。于是查配置,没发现问题;对比其他工程,也没发现问题;重新部署,还是有问题。无奈之下,只能看代码。当看到一个类的init方法上使用了@PostConstruct注解,就发现不对劲。因为该方法上使用while(true),一直死循环跳不出来,卡在这里了,因此没有启动Tomcat。改掉,重新部署,终于好了!还是需要更多的历练,才能获得更多的经验。...
2021-04-08 10:14:03
1095
原创 zookeeper之命令行操作zookeeper节点
连接到远程zookeeper服务器:本地启动zookeeper,打开zkCli.cmd,使用命令connect ip:port连接到远程zookeeper服务器。创建节点:create /aa/bb/cc “xxx”获取节点:get /aa/bb/cc修改节点:set /aa/bb/cc “yyy”创建子节点:create /aa/bb/cc/dd “zzz”列出子项:ls /aa/bb/cc移除节点:rmr /aa/bb/cc/dd...
2021-02-10 09:57:03
307
转载 Redis缓存负载均衡使用的一致性哈希算法
原文链接由于普通哈希算法实现的缓存负载均衡存在扩展能力和容错能力差问题,所以我们引入一致性哈希算法。一句话概括一致性哈希:就是普通取模哈希算法的改良版,哈希函数计算方法不变,只不过是通过构建环状的 Hash 空间代替普通的线性 Hash 空间。操作选择一个足够大的Hash空间(一般是 0 ~ 2^32)构成一个哈希环。对于缓存集群内的每个存储服务器节点计算 Hash 值,就是服务节点在 Hash 环上的位置。对每个需要存储的数据 key 同样也计算一次哈希值,计算之后的哈希也映射到环上优点
2021-01-16 13:11:51
218
转载 java SPI简述
引用Java 的 SPI 机制,英文全称是 Service Provider Intrface,常用于框架的可扩展实现。Java 语言的 JDBC、JDNI 就使用了这种技术,甚至我们常用的 dubbo 也是在 Java SPI 机制基础上做的改进。Service Provider Framework 的四个概念:Service Interface 服务接口,(这里对应 Song 接口。)Provider Registration API 用户注册接口,(这里对应 ParserManager.
2021-01-16 11:31:01
172
原创 程序线程池大小设置
在设置线程池大小时,我们首先需要了解该程序是IO密集型还是CPU密集型。线程池大小 = ((线程 IO time + 线程 CPU time )/线程 CPU time )* CPU数目这里需要知道的三个要素:一个请求的IO时间 (线程 IO time)该请求计算时间 (线程 CPU time)CPU 数目Mark~~...
2020-12-14 16:39:32
155
原创 关于ThreadLocal内存泄漏的问题
【引用】https://www.jianshu.com/p/b74597032598对于ThreadLocal,我的理解是:每个线程Thread对象里面有个ThreadLocalMap(可以当成Map看),map对象里面的key就是ThreadLocal对象,value是ThreadLocal#set进去的Object对象。如果在逻辑执行完成后,key-value键值对没有从map对象中移除,map就会一直持有该键值对,对于线程池中的线程对象来说,这种键值对越积越多,无法释放,就造成了内存泄漏,最终导
2020-12-14 15:56:40
89
原创 使用alter table tabname ENGINE=InnoDB后占用的空间更大
alter table tabname ENGINE=InnoDB之后原因:这个表,本身就已经没有空洞的了,比如说刚刚做过一次重建表操作。在 DDL 期间,如果刚好有外部的 DML 在执行,这期间可能会引入一些新的空洞。在重建表的时候,InnoDB 不会把整张表占满,每个页留了 1/16 给后续的更新用。也就是说,其实重建表之后不是“最”紧凑的。来源:极客时间-林晓斌整理表碎片化空间方法:alter table tabname ENGINE=InnoDB;ANALYZE TABLE t
2020-12-02 08:36:11
7578
4
原创 MySQL alter add和modify对insert,update的影响
MySQL版本:5.6.23和5.7.17现象:MySQL5.6alter table add column不阻塞insert,updatealter table modify column阻塞insert,update(不论是增加还是缩短varchar的长度)MySQL5.7alter table add column不阻塞insert,updatealter table modify column阻塞insert,update(增加varchar长度不阻塞,缩短长度会阻塞)MyS
2020-12-01 18:49:16
872
原创 SimpleDateFormat与DateTimeFormatter的线程安全性
SimpleDateFormat代码分析 /** * The {@link Calendar} instance used for calculating the date-time fields * and the instant of time. This field is used for both formatting and * parsing. * * <p>Subclasses should initialize this
2020-11-24 13:12:10
1931
原创 springboot加载特定的properties配置文件
加载类路径下的全部/特定前缀的properties文件:import org.springframework.beans.factory.config.PropertiesFactoryBean;import org.springframework.context.annotation.Bean;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import java.io.IOExcep
2020-11-19 08:07:51
1093
转载 使用mybatis interceptor拦截器的方式
【来源】https://mybatis.org/mybatis-3/zh/configuration.html#plugins实现org.apache.ibatis.plugin.Interceptor接口,并在类上加上@interceptors注解@Intercepts({ @Signature( type=Executor.class, method="query", args={MappedStatement.c
2020-11-17 16:42:27
310
原创 项目的SQL执行效率需要验证
在最近做的项目中,有一个程序上线后,SQL执行相当地慢.这个SQL在本次迭代中并没有做修改,但是却慢出天际.实在令人费解.select …from tableA a inner join tableB b on a.col=b.colwhere a.xxx in (’…’, ‘…’, ‘…’)group by a.yyyB表对A表是一对多的关系.col字段是a表索引,也是b表的主键查看执行计划除了rows一列不相同外,其他的都相同.但是当a.xxx值不相同时,查询时间却相差巨大.第一
2020-11-15 16:40:25
127
转载 Sql错误引发的全表修改
[转载]www.fordba.com/mysql-double-quotation-marks-accident.htmlupdate tablename set source_name = “bj1062-北京市朝阳区常营北辰福第”where source_name = “-北京市朝阳区常营北辰福第”
2020-11-15 13:48:56
193
转载 maven 打包时,src/main/java目录下的xml等资源文件没有打包进去的问题
【转载】https://blog.youkuaiyun.com/csdn_ds/article/details/72730504默认maven在src/main/java中只编译java文件,其他的文件会被忽略,但可以通过配置pom.xml,改变默认的设置,但在此建议,非java相关的资源,写在src/main/resources中比较好,这样条理清晰。问题:maven打包时 ,src/main/java目录下的xml等资源文件打包不进去解决方法:在pom.xml文件的标签中添加以下内容<resource
2020-11-15 09:56:33
357
转载 MySQL explain 执行计划
// TODO inner join 全表扫描?不走索引? 如何解决【转载】http://www.cnitblog.com/aliyiyi08/archive/2008/09/09/48878.html±—±------------±------±------±------------------±--------±--------±------±-----±------+| id | select_type | table | type | possible_keys | key
2020-11-10 21:02:52
157
原创 springboot @Configuration 和 @Import, @EnableAutoConfiguration 注解
【参考】https://blog.youkuaiyun.com/Janson_Lin/article/details/87778878@Configuration一般用来声明配置类,可以使用 @Component注解替代,不过使用Configuration注解声明配置类更加语义化。@Target({ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Componentpublic @interface Configuration
2020-11-08 11:45:27
2129
3
原创 springboot conditional相关
【参考】https://blog.youkuaiyun.com/yhahaha_/article/details/88638490@Conditional和@Condition都是spring的注解, springboot下有@ConditionalOnClass,@ConditionalOnBean,@ConditionalOnMissingBean等注解扩展了其功能.@Conditional注解说明:其参数是实现了Condition接口的类的数组,通常和Condition接口配合使用,只有接口的实现类(一个或
2020-11-07 12:25:39
180
原创 springboot没有加载application.yml文件的原因
遇到没有加载application.yml文件的问题,经debug后,发现是ConfigFileApplicationListener类的load方法没有识别到该文件.一番查询资料后发现,多数是由于缺少某些pom依赖,我遇到的问题,是由于缺少snakeyaml依赖.也有缺少spring-boot-autoconfigure或spring-cloud-context依赖的.参考:https://blog.youkuaiyun.com/z6165039/article/details/99632629https:/
2020-11-06 09:53:49
4105
原创 EnvironmentPostProcessor与spring.factories
// TODO 继续补充主要作用是在springboot启动时做一些后处理吧,这些后处理类不会被实例化.比如EnvironmentPostProcessor的实现类
2020-11-03 08:46:01
283
转载 springboot的配置文件优先级,@ConfigurationProperties注解
同一目录/classpath下,properties文件 > yml文件不同目录:验证配置文件顺序(由先到后):file:./config/ (当前项目路径config目录下);file:./ (当前项目路径下);classpath:/config/ (类路径config目录下);classpath:/ (类路径config下).@ConfigurationPropertiesyml文件user: name: zhangsan password: ab.
2020-11-02 20:12:13
1688
转载 java问题排查工具
【转载】我的java问题排查工具单jmap看看堆都被谁占了? 再配合zprofiler和btrace,排查问题简直是如虎添翼它可以生成 java 程序的 dump 文件, 也可以查看堆内存使用、分配信息# 查看堆的情况jmap -heap 1# dumpjmap -dump:live,format=b,file=/tmp/heap2.bin 1jmap -dump:format=b,file=/tmp/heap3.bin 1# 查看堆的占用jmap -histo 1| head
2020-10-29 16:57:32
165
原创 springboot Binder类
比Environment类好用很多,可以非常方便地进行类型转换,可以将属性绑定到对象,Map,List等类型上# 绑定到对象 MailPropertiesC propertiesC = Binder.get(environment) //首先要绑定配置器 //再将属性绑定到对象上 .bind( "kaka.cream.mail-c", Bindable.of(MailPropertiesC.class) ).get(); //再获取实例 # 绑定Map M
2020-10-29 15:22:18
5495
原创 MySQL limit offset的替代方案
select * from table limit 10 offset 10000;OFFSET 和 LIMIT 对于数据量少的项目来说是没有问题的。但是,当数据库里的数据量超过服务器内存能够存储的能力,并且需要对所有数据进行分页,问题就会出现。因为数据库会进行全表扫描什么是全表扫描?全表扫描 (又称顺序扫描) 就是在数据库中进行逐行扫描,顺序读取表中的每一行记录,然后检查各个列是否符合查询条件。这种扫描是已知最慢的,因为需要进行大量的磁盘 I/O,而且从磁盘到内存的传输开销也很大。...
2020-10-27 00:21:42
1096
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人