- 博客(87)
- 资源 (8)
- 收藏
- 关注
原创 记一次matespace导致的FGC导致接口性能尖刺
0. 背景自己服务一个核心接口的TP99有性能尖刺,开始的排查之旅。先用skywalking定位了下执行慢的请求,发现依赖的数据库、redis组件均是快速返回。时间都占用’spingmvc’本身。这就有点难了,性能尖刺一般怀疑db慢查询。目前确实没有。该接口QPS挺高的,想着是不是线程不够用呀。用 jstat看了下线程情况,发现tomcat的线程还是够用的。不过还是主动增大了线程数量,且增加了几个节点副本。发现并无效果。排查进入困难之后,想着是不是有GC的STW导致请求尖刺。于是查了机器上的gc l
2022-01-24 19:00:40
677
原创 maven parent
1.使用背景随着业务复杂度的增长,部门内的服务也在变多,各服务之间一些中间件版本不一致,升级一个版本,会解决不同的版本冲突,会非常痛苦。这时候使用maven parent来统一管理版本,就很合适了。常见的spring的parent2.parent作用1.parent只是声明版本号,可以作为部门内统一版本的管理,引用该parent的项目,可以在dependency里声明坐标,而不用写版本号,就会使用parent里的版本号。如果没有在项目里声明,parent里dependencyManagement
2021-08-22 21:21:23
1489
原创 AQS作用及源码解析,了解后,你也能轻易写出一个Java的锁
1.AQS介绍当我们想要看一个技术源码时,我们第一步是先搞清楚它的功能是什么,它能解决什么问题,带着需求看源码,才会更容易理解它的设计思想。AQS: java.util.concurrent.locks.AbstractQueuedSynchronizerJava标准库的一个抽象类。它主要提供的功能有 获取、释放资源的功能。在获取资源时,如果获取不到,直接将该线程放到等待队列中,并且将改线程休眠。释放资源时,会唤醒等待队列的一个线程,去获取资源。它将并发场景下资源控制,线程控制,队列控制等技术
2020-12-03 15:36:01
479
2
原创 ThreadLocal有内存泄漏?Java的作者有这么low?不清楚的还是别乱说话了
网上经常有人说ThreadLocal有内存泄漏的问题。我先说结论:呵呵,你觉得JDK的一群大佬,能让一个内存泄漏的bug存在吗?jdk的每一行代码,都是凝聚了最顶尖的设计和智慧。最好和我们的业务代码比,是高太多了。我们先来复习下threadlocal的设计。Thread的一个属性ThreadLocalMapMap是的key就是弱引用,是ThreadLocal,value就是任何值了。我们通过ThreadLocal tl = new ThreadLocalI();进行传递值。听着有点晕?怎么使用这
2020-11-02 14:27:51
357
2
原创 java常用代码
lambda从对象list中取一个值到新listList<Person> ps = new ArrayList();//... ps添加List<Interge> ids = ps.stream().map(Person::getId).collect(Colletcts.toList);//或者List<Interge> ids = ps.stream().map(p->p.getId()).collect(Colletcts.toList);.
2020-09-09 10:52:46
454
原创 日常踩坑小日记
Java1.mysql支持表情1.1 知识点:mysql的utf8是标准utf8的子集。不支持4字节的表情包。因此推出了utf8mb4字符集。一个字段的字符集按照字段>表>库进行配置。1.2 知识点:mysql server端可以设置客户端连接上的字符集,可以用show VARIABLES like "CHARACTER_set%"查看。设置为utf8mb4,用jdbc连接时才可以进行表情包的读写。不过server设置这个需要重启。不过可以设置session级别的,开启连接时,通过sql
2020-08-29 16:55:37
348
原创 go如何实现图片拼接,文字书写
零:背景这是我工作中实际碰到的后端生成图片拼接和文字贴图需求。特此总结下来,方便后人。文中代码都是我们生产环境使用的。一:图片拼接go标准库的image包本身就能实现拼接,因此还是比较简单的直接上代码1.1 图片拼接代码//图片拼接func MergeImageNew(base image.Image, mask image.Image, paddingX int, paddingY int) (*image.RGBA, error) { baseSrcBounds := base.Boun
2020-06-30 14:57:05
3189
原创 一次mysql死锁问题定位
0. 引子最近遇到了一个死锁问题,但定位死锁原因时终于遇到“面试造火箭”的理论知识(主要是mysql的事务锁),才帮助我定位到问题所在。下面介绍下分析过程1.问题背景1.1 问题出现最近参与一个新的项目,有天收到了死锁异常邮件,找项目老人问了下,说这个死锁报警有了一段时间了,我翻了下报警记录,确实已经存在时日了。然后定位到报死锁的代码,发现在一个大事务中,但是在报警这行代码前,事务中并没有...
2020-01-06 11:00:18
1159
原创 java线程状态解释
比较好的文章:https://blog.youkuaiyun.com/pange1991/article/details/53860651/可以比较清楚看到6种状态下面对主要3中状态进行解释1:BLOCKED/** * Thread state for a runnable thread. A thread in the runnable * state is executing in the ...
2019-07-23 11:48:20
388
1
原创 Java使用Mockito&PowerMockito进行单测
1. 开始首先说明单测的意义:单测是为了校验自己的代码逻辑是否正确,那有同学说了,我直接调用自己写的方法不就得了。随着服务的划分,我们的代码会依赖不同的服务,及时不调用其他服务,也会有mysql、redis等一些数据,在跑测试的时候要准备这些环境是不方便的(主要是前者,有的测试环境不稳定),我们便可以使用Mock的方法,将我们依赖的第三方服务Mock掉(也就是屏蔽掉,不会真的去调用我们依赖...
2019-06-30 20:35:17
989
原创 spring-mybatis使用事务
1.使用 TransactionTemplate入口代码 @Autowired TransactionTemplate transactionTemplate; public Long insert(User user) { TransactionCallback<Long> tc = new TransactionCa...
2019-05-14 11:28:51
576
原创 topk算法实现
0. 问题介绍top k就是求解一个数字队列前k大的问题,在工作后者面试中是一个非常常见的问题,这里说明两种解法。1.基于快排的解法1.1 算法思路这里假设你对快排已经熟悉。我们知道快排是随机找个标识,然后用此标识进行排序。我们进行降序排序的方式,第一次进行排序后,就能获得在序列中的大小位置。如果它正好是第k大,那么它左边的数组就是题目要求的top k(当然,这是很幸运的情况,我们要讨论...
2019-03-01 11:07:27
5267
原创 mybatis源码分析
1.读取xml sql启动时,扫描mapper文件,放入Configuration.mappedStatements2.获取dao层接口从SqlSeesion中获取dao层接口SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(fis);//DefaultSqlSessionFactorys...
2019-02-10 21:42:08
326
3
原创 Redis zset的数据结构:SkipList(跳表)的原理及实现
1.数据结构1.1 简介跳表(skiplist)是一个查询/插入/删除 复杂度o(lgn)的数据结构。在查询上跟平衡树的复杂度一致,因此是替代平衡树的方案。在redis的zset,leveldb都有应用。发现这个算法也解决了我一个问题。各种平衡树在工业界是广泛应用,帮助我们快速查找,插入数据,但其思想的复杂也让大家不是那么容易接触。当时想直接对有序链表进行二分搜索,那岂不是很容易做到相同复杂度...
2019-01-04 11:55:22
5525
原创 python常用脚本编写
1.关闭脚本import osstream = os.popen("ps aux | grep ' process key ' ")for line in stream.readlines(): print(line) pid = line.split(" ")[1].split(" ")[0] os.system("kill -9 "+pid)...
2018-12-11 11:26:25
409
原创 krpc中的注册中心实现
1.什么是注册中心注册中心中保存的是各服务的节点信息,主要包括ip和端口号,当服务端的节点增减时,服务的调用者能通过注册中心感知到服务端节点的变化。使用注册中心的优点:如果服务节点部署机器过多,调用者需要配置太多的节点信息,不利于维护;当服务端增减节点时,客户端无需改动重启。2.如何实现krpc目前已经增加了zookeeper作为注册中心(如果不配置zk信息,则不使用)。针对 服务节点意...
2018-12-01 09:50:56
1022
原创 MySQL慢优化个人记录
序该文章记录个人工作或者学习中经历的MySQL优化,该文章不做定时更新1.子查询1.1背景用mysql保存了一些不太更新的数据,切数据量不大,所以用到了一些join及子查询但是在开发阶段也发现慢sql,但表数据量不足5k。select namefrom twhere id in( select id from t where age&amp;gt;10)sql的结构跟上类似,...
2018-11-13 17:41:17
329
原创 记一次内存泄露排查
1.事发背景这是一个爬虫项目中遇到的问题,众所周知爬虫必然需要代理,公司内部有获取单个代理ip和port的接口,每次爬取都取请求一个代理是不合理的,所以我自己维护了一个ip池,项目启动时会初始化获取200个IP,如果在爬取中发现代理不好用,便废弃该代理,重新获取。2.处理过程有天我上去看该进程的内存情况,发现保存代理信息的类HttpHost的实例超多2: 607868 ...
2018-11-01 11:36:32
669
原创 CountDownLatch、ReentrantLock源码解析
1.AQS因业务中在用多线程并行执行代码块中会用到CountDownLatch来控制多线程之间任务是否完成的通知,最近突然想去看一下CountDownLatch在await及唤醒是如何实现的,便开始了阅读源码及查阅资料,然后打开了一个新大门。发现它是基于AbstractQueuedSynchronizer(下文简称AQS)框架实现的。所以我们先了解AQS是干什么的。它提供的功能可以概括为两点:...
2018-10-08 10:17:33
452
原创 java GC总结
1.垃圾收集算法本节主要讲述算法思想,包括对象是否存活判定算法,垃圾收集的算法。1.0 如何判断对象是否改被回收在讲垃圾收集算法前,有必要先了解我们算法要收集的“垃圾”,现在使用的是可达性算法,把java堆栈中所有的对象当作 图中的 点,如果两个对象有引用,就把两个点之间连成线,如果在我们选定的几个根节点(gc root)到任何一个对象没有路可达,那这个对象就没有存在的价值,可以被...
2018-09-17 14:56:44
746
原创 docker必用命令及构建一个可执行jar镜像
1.使用镜像既然你看到这篇文章,相信已经对docker有了初步的了解,这是一片docker快速使用的文章。其实docker跟maven似的,一个管理的是组织好的运行环境,一个是jar包。1.1 下载镜像docker pull hub.c.163.com/library/tomcat:latestPS:这里使用了网易的docker镜像,下载速度1.2 查看镜像dock...
2018-08-12 17:55:28
2630
原创 结合RPC框架通信谈 netty如何解决TCP粘包问题
0.起因因为自己造一个RPC框架的轮子时,需要解决TCP的粘包问题,特此记录,希望方便他人。这是我写的RPC框架的 GitHub地址 https://github.com/yangzhenkun/krpc。 欢迎star,fork。已经写了多篇文章对这个框架的原理进行说明。对原理有兴趣的欢迎交流。1.什么是粘包1.1 什么是TCP粘包TCP粘包就是在TCP数据传输过程中,...
2018-07-27 18:31:18
954
原创 RPC客户端如何实现-KRPC源码解析
1.前言这篇文章主要结合KRPC(我自己开源的一个RPC框)代码详细分析一下RPC客户端具体实现。在一篇文章了解RPC框架原理文中,我们主要讲述了一次调用RPC调用中各流程,这篇文章就结合KRPC的代码仔细讲解一下开始前,我先说一下KRPC的网络传输中的内容: 1.服务实现名字。server端需要你服务实现的名字,才能知道你调用的是哪个实现的方法,跟web项目中的controller写的...
2018-06-03 11:02:46
3595
原创 一篇文章了解RPC框架原理
1.RPC框架的概念RPC(Remote Procedure Call)–远程过程调用,通过网络通信调用不同的服务,共同支撑一个软件系统,微服务实现的基石技术。使用RPC可以解耦系统,方便维护,同时增加系统处理请求的能力。上面是一个简单的软件系统结构,我们拆分出来用户系统和订单系统做为服务存在,让不同的站点去调用。只需要引入各个服务的接口包,在代码中调用RPC服务就跟调用本地方法一...
2018-05-24 19:25:16
5072
1
原创 反序列化 动态加载jar的里的类报ClassNotFoundException解决办法
1.背景自己在写一个RPC框架时,碰到第一个麻烦就是做动态加载加载jar包后,在进行反序列化(不要吐槽为啥用java原生的序列化方案,一步一步来,框架写完能跑后在优化)时报CNF错误,当时感觉应该是原生的序列化方案中使用的ClassLoader是应用加载器AppCloassLoader,而我使用的URLClassLoader加载的外部jar包,导致没有找到。关于java的类加载器,如果知道...
2018-04-29 11:54:41
3850
原创 HashMap
注意事项数组+链表/红黑树来存储数据链表长度为8(默认)时,转化为红黑树,加快查询速度。数组下标是 (n-1)&hash,n表示数组长度,hash表示key的hash值构造参数无参:数组长度和扩容因子采用默认(16,0.75) 单参:指定数组大小(向上取相应2^n值,例如输入3数组的长度为4,输入6数组的长度为8) 双参:数组长度和扩容因子扩容机制:当数组长度达...
2018-03-12 16:37:17
275
原创 TCP协议-个人笔记
我们最常用的应用层协议http都是依赖传输层tcp协议完成的。同时很多client-server模式的软件(中间件)大都使用tcp通信,因此详细的了解tcp通信裨益极大。首先对网络模型先进行一个介绍。应用层,表示层,会话层,传输层,网络层,数据链路层,物理层7层网络模型大家已经熟知。http就属于应用层,将应用层数据进行传输,会进行tcp首部的拼接,TCP传输控制协议t...
2018-02-26 15:06:47
459
原创 java线程不安全类 SimpleDateFormat
不安全在什么地方?前段时间在做系统数据清洗过程中,因为用到多线程及simpeldateformat,一开始没注意,遇到了线程安全问题,就在此描述解决办法。// Called from Format after creating a FieldDelegate private StringBuffer format(Date date, StringBuffer toAppend
2018-01-07 12:03:49
480
原创 红黑树
红黑树是什么红黑树是一种树形数据结构,它的节点值的大小是按照左节点<父节点<右节点 这种顺序排列的。所有在搜索红黑树的值时,其复杂度是Olg(n)。如果有一组数据1,2,3,4,5,6,7按照这种顺序插入到树中,会导致所有的数据都在右节点上,这时候去这个树中搜索数据时,其复杂度依然是n,并没有任何优化,这是因为这种树结构左右失衡造成的。因此就有了平衡树这种数据结构,当发现左右节点深度不平衡时,通过一
2017-12-24 23:01:42
371
原创 Redis客户端Jedis源码阅读及连接池分析
0.起因自己负责的项目redis服务端连接数明显高于实际访问量,很多空闲连接没有释放;Jedis对象和连接的对应关系?连接池的复用是复用了jedis对象,还是只保存连接?总总疑惑,让我开始了jedis的源码阅读。所幸最后都搞明白了,在这里写明白分享给大家。我相信很多刚入门的同学一定想了解连接池是如何复用连接的。客户端和服务器之间的连接和客户端对象之间的关系。因此在源码解读前,我先提出几个问
2017-11-25 16:05:56
3783
1
原创 apache-common-pool2源码分析
基础概念apache-common-pool2是一个对象池管理框架,任何需要对象池这种概念的都可以利用这个框架来实现,例如redis的客户端jedis和dbcp都是基于common-pool2实现的。本文是common-pool2的源码分析,在讲源码前我先阐述一下基本对象池的基本概念吧。现在java创建一个对象的速度已经很快了,但是对于网络连接的创建还是需要很长的时间的,频繁的创建客户端与服务的连接
2017-10-31 10:03:55
1858
原创 Java线程池使用与原理
线程池是什么?我们可以利用java很容易创建一个新线程,同时操作系统创建一个线程也是一笔不小的开销。所以基于线程的复用,就提出了线程池的概念,我们使用线程池创建出若干个线程,执行完一个任务后,该线程会存在一段时间(用户可以设定空闲线程的存活时间,后面会介绍),等到新任务来的时候就直接复用这个空闲线程,这样就省去了创建、销毁线程损耗。当然空闲线程也会是一种资源的浪费(所有才有空闲线程存活时间的限制),
2017-09-25 10:01:17
3266
2
原创 模板方法模式
定义&示例HeadFirst定义:在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。其实就是将一些算法、业务步骤封装到一个方法中,使用者直接调用该模板方法,这样保证该步骤不会出错,减轻调用方压力。老规矩先放一个demo github传送门demo我假设了我们常用的12306买火车票场景。把下单支付环节抽象为一个模板方法
2017-09-17 22:45:41
419
原创 一篇文章了解mvc框架工作流程
动机argo是58同城开源出来的一个基于java的轻量级mvc框架。这个框架是其13年开源出来源代码,但接下来就没有维护了,但58内部好像还一直维护沿用wf(argo内部称呼)。 但阅读这款轻量级框架源码对于我们理解mvc框架运行原理还是有很大裨益的。其代码量不是很大,这也是我读的第一个开源框架源码。同时argo跟springmvc在思想上有很多相似之处,相信读过这个源码,对以后阅读springm
2017-08-25 11:08:09
6865
1
原创 命令模式
命令模式就是将方法(运算业务逻辑代码)进行封装,并将该方法传递给执行者,执行者不关心所执行的命令(业务代码)是如何实现的。 java的线程池就是命令模式的一个体现。1.示例deom说明 demo源码 demo中我使用的场景是遥控器要控制家里的电器设备。遥控器RemoteController的开关按钮只需要调用设置的命令的execute方法,而无需关注其如何实现。Command的实现类的exec
2017-08-21 00:28:36
725
原创 单例模式
单例模式其实是一个很简单的设计模式,其作用就是为了让某一个类的全局实例只有一个。 我认为这个模式在oop上思想的增加是很少的。但这个模式却是对多线程安全认知的一个很好的例子。这是我代码的demo单例github demo其实我代码中的注释也写的很明白了。 能保证线程安全的单例大概有三种写法。第一种: 双重检查就是SingletonDobuleCheck这个类的写法,使用了java内置的加锁机制,
2017-08-14 19:36:11
479
原创 工厂模式
工厂模式中大概可分为三种:简单工厂,工厂方法,抽象工厂。 工厂模式的优点是让代码之家的依赖关系变少,降低项目耦合。简单工厂简单工厂可以说并不是一种设计模式,只是一种代码风格。 这是我写的一个简单工厂的例子简单工厂demo 这个工厂用来获取物品对象,利用多态实现这一个功能,如果代码中需要很多new操作,这样可以大大节省代码量和依赖关系,也让代码更加清晰。工厂方法headfirst中的定义:定义了
2017-08-10 00:48:10
521
原创 装饰者模式
定义动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案示例说明这是我github上的代码示代码talk is cheap,show your code 所以读者直接参考我github上的代码,我这里虚构了一个常见游戏场景,不同角色有自己的能力值,里面的武器也都有相应的能力,当角色装备后会增加其能力值。装饰者模式无论是被装饰与装饰组件,都需要继承自一个类,像代码中的Unit
2017-08-01 19:29:38
441
原创 观察者模式
定义定了了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会受到通知并自动更新在具体实现中,开发者可以自己定义一整套观察者框架,也可以利用java提供的api实现这个模式自定义实现观察者模式观察者模式主要在解耦方面有巨大的作用,开发者可以自己实现整个观察者模式框架,一般会实现了观察者接口,这个接口的必需的一个方法是提供 主题(被观察者)状态发生变化时,需要调用的,像Observ
2017-08-01 19:28:20
651
1
原创 策略模式
定义首先给出《Head First设计模式》中的定义:策略模式定义了算法族,分别封装起来,让他们之间可以相互替代,此模式让算法的变化独立于使用算法的客户。这个定义还是很到位的,总的来说策略模式会让代码复用率很高,并且让代码更加规整简洁。像我实例代码中使用了游戏中常用的一个场景,我定义了一个抽象类Person,其具有自己描述和攻击两种方法;我也定义了一个攻击方式接口,每一种具体的攻击方式都实现了该接口
2017-08-01 19:26:50
371
利用udig美化shape文件并由Geoserver发布
2016-10-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人