java
文章平均质量分 63
_Yasin
苟有恒何必三更眠五更起 最无益莫过一日曝十日寒
展开
-
记一次matespace导致的FGC导致接口性能尖刺
0. 背景自己服务一个核心接口的TP99有性能尖刺,开始的排查之旅。先用skywalking定位了下执行慢的请求,发现依赖的数据库、redis组件均是快速返回。时间都占用’spingmvc’本身。这就有点难了,性能尖刺一般怀疑db慢查询。目前确实没有。该接口QPS挺高的,想着是不是线程不够用呀。用 jstat看了下线程情况,发现tomcat的线程还是够用的。不过还是主动增大了线程数量,且增加了几个节点副本。发现并无效果。排查进入困难之后,想着是不是有GC的STW导致请求尖刺。于是查了机器上的gc l原创 2022-01-24 19:00:40 · 601 阅读 · 0 评论 -
maven parent
1.使用背景随着业务复杂度的增长,部门内的服务也在变多,各服务之间一些中间件版本不一致,升级一个版本,会解决不同的版本冲突,会非常痛苦。这时候使用maven parent来统一管理版本,就很合适了。常见的spring的parent2.parent作用1.parent只是声明版本号,可以作为部门内统一版本的管理,引用该parent的项目,可以在dependency里声明坐标,而不用写版本号,就会使用parent里的版本号。如果没有在项目里声明,parent里dependencyManagement原创 2021-08-22 21:21:23 · 1412 阅读 · 0 评论 -
AQS作用及源码解析,了解后,你也能轻易写出一个Java的锁
1.AQS介绍当我们想要看一个技术源码时,我们第一步是先搞清楚它的功能是什么,它能解决什么问题,带着需求看源码,才会更容易理解它的设计思想。AQS: java.util.concurrent.locks.AbstractQueuedSynchronizerJava标准库的一个抽象类。它主要提供的功能有 获取、释放资源的功能。在获取资源时,如果获取不到,直接将该线程放到等待队列中,并且将改线程休眠。释放资源时,会唤醒等待队列的一个线程,去获取资源。它将并发场景下资源控制,线程控制,队列控制等技术原创 2020-12-03 15:36:01 · 429 阅读 · 2 评论 -
ThreadLocal有内存泄漏?Java的作者有这么low?不清楚的还是别乱说话了
网上经常有人说ThreadLocal有内存泄漏的问题。我先说结论:呵呵,你觉得JDK的一群大佬,能让一个内存泄漏的bug存在吗?jdk的每一行代码,都是凝聚了最顶尖的设计和智慧。最好和我们的业务代码比,是高太多了。我们先来复习下threadlocal的设计。Thread的一个属性ThreadLocalMapMap是的key就是弱引用,是ThreadLocal,value就是任何值了。我们通过ThreadLocal tl = new ThreadLocalI();进行传递值。听着有点晕?怎么使用这原创 2020-11-02 14:27:51 · 312 阅读 · 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 · 370 阅读 · 0 评论 -
日常踩坑小日记
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 · 292 阅读 · 0 评论 -
java GC总结
1.垃圾收集算法本节主要讲述算法思想,包括对象是否存活判定算法,垃圾收集的算法。1.0 如何判断对象是否改被回收在讲垃圾收集算法前,有必要先了解我们算法要收集的“垃圾”,现在使用的是可达性算法,把java堆栈中所有的对象当作 图中的 点,如果两个对象有引用,就把两个点之间连成线,如果在我们选定的几个根节点(gc root)到任何一个对象没有路可达,那这个对象就没有存在的价值,可以被...原创 2018-09-17 14:56:44 · 713 阅读 · 0 评论 -
CountDownLatch、ReentrantLock源码解析
1.AQS因业务中在用多线程并行执行代码块中会用到CountDownLatch来控制多线程之间任务是否完成的通知,最近突然想去看一下CountDownLatch在await及唤醒是如何实现的,便开始了阅读源码及查阅资料,然后打开了一个新大门。发现它是基于AbstractQueuedSynchronizer(下文简称AQS)框架实现的。所以我们先了解AQS是干什么的。它提供的功能可以概括为两点:...原创 2018-10-08 10:17:33 · 404 阅读 · 0 评论 -
记一次内存泄露排查
1.事发背景这是一个爬虫项目中遇到的问题,众所周知爬虫必然需要代理,公司内部有获取单个代理ip和port的接口,每次爬取都取请求一个代理是不合理的,所以我自己维护了一个ip池,项目启动时会初始化获取200个IP,如果在爬取中发现代理不好用,便废弃该代理,重新获取。2.处理过程有天我上去看该进程的内存情况,发现保存代理信息的类HttpHost的实例超多2: 607868 ...原创 2018-11-01 11:36:32 · 626 阅读 · 0 评论 -
krpc中的注册中心实现
1.什么是注册中心注册中心中保存的是各服务的节点信息,主要包括ip和端口号,当服务端的节点增减时,服务的调用者能通过注册中心感知到服务端节点的变化。使用注册中心的优点:如果服务节点部署机器过多,调用者需要配置太多的节点信息,不利于维护;当服务端增减节点时,客户端无需改动重启。2.如何实现krpc目前已经增加了zookeeper作为注册中心(如果不配置zk信息,则不使用)。针对 服务节点意...原创 2018-12-01 09:50:56 · 977 阅读 · 0 评论 -
mybatis源码分析
1.读取xml sql启动时,扫描mapper文件,放入Configuration.mappedStatements2.获取dao层接口从SqlSeesion中获取dao层接口SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(fis);//DefaultSqlSessionFactorys...原创 2019-02-10 21:42:08 · 278 阅读 · 3 评论 -
spring-mybatis使用事务
1.使用 TransactionTemplate入口代码 @Autowired TransactionTemplate transactionTemplate; public Long insert(User user) { TransactionCallback<Long> tc = new TransactionCa...原创 2019-05-14 11:28:51 · 526 阅读 · 0 评论 -
Java使用Mockito&PowerMockito进行单测
1. 开始首先说明单测的意义:单测是为了校验自己的代码逻辑是否正确,那有同学说了,我直接调用自己写的方法不就得了。随着服务的划分,我们的代码会依赖不同的服务,及时不调用其他服务,也会有mysql、redis等一些数据,在跑测试的时候要准备这些环境是不方便的(主要是前者,有的测试环境不稳定),我们便可以使用Mock的方法,将我们依赖的第三方服务Mock掉(也就是屏蔽掉,不会真的去调用我们依赖...原创 2019-06-30 20:35:17 · 899 阅读 · 0 评论 -
java线程状态解释
比较好的文章:https://blog.csdn.net/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 · 344 阅读 · 1 评论 -
结合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 · 908 阅读 · 0 评论 -
RPC客户端如何实现-KRPC源码解析
1.前言这篇文章主要结合KRPC(我自己开源的一个RPC框)代码详细分析一下RPC客户端具体实现。在一篇文章了解RPC框架原理文中,我们主要讲述了一次调用RPC调用中各流程,这篇文章就结合KRPC的代码仔细讲解一下开始前,我先说一下KRPC的网络传输中的内容: 1.服务实现名字。server端需要你服务实现的名字,才能知道你调用的是哪个实现的方法,跟web项目中的controller写的...原创 2018-06-03 11:02:46 · 3550 阅读 · 0 评论 -
Java注解的实现与使用
Java注解是java5版本发布的,其作用就是节省配置文件,增强代码可读性。在如今各种框架及开发中非常常见,特此说明一下。原创 2017-04-26 09:15:11 · 3600 阅读 · 3 评论 -
代理模式-Java动态代理的实现及应用
Java动态代理其实写日常业务代码是不常用的,但在框架层一起RPC框架的客户端是非常常见及重要的。spring的核心思想aop的底层原理实现就使用到了java的动态代理技术。 使用代理可以实现对象的远程调用以及aop的实现。 java的动态代理的实现,主要依赖InvoctionHandler(接口)和Proxy(类)这两个。下面是一个例子 实现的代理的一般需要有个接口package com.y原创 2017-06-03 17:45:31 · 602 阅读 · 0 评论 -
认识java中线程安全问题
出现场景: 多个线程同时操作一个对象,如果该对象没有线程安全的控制,便会出现线程安全问题。例如:我们有一个类Apublic class A{ int count=0; public void add1000(){ for(int i=0;i<1000;i++){ count++; System.out.println(c原创 2017-03-16 16:32:33 · 547 阅读 · 0 评论 -
Java IO最详解
博客原文: http://blog.csdn.net/yczz/article/details/38761237Java IO最详解2014-08-22 20:14 118301人阅读评论 (35)收藏举报本文章已收录于:分类: JAVA (118) 作者同类文章X初学Java转载 2017-01-13 15:31:07 · 499 阅读 · 0 评论 -
SSM框架整合
最近没有写博客,主要是在学习前端和java开发的一些入门知识。 这篇博客讲一下SSM整合,虽然这个没有技术含量,多搭两次变能掌握的事情,但对于刚入门的新手而言,整合这三个框架还是有点头痛的,毕竟配置文件好多。使用的工具:Spring Tool Suite(就是在Eclipse上加了一些插件);maven1.新建maven web项目 新建完成后,如果jsp文件报错,是因为没有加载sevlet原创 2016-12-28 10:01:09 · 587 阅读 · 0 评论 -
java回调思想
难得有时间,是时候写一篇java思想这一块了。随着自己的学习,越来越被OO的思想所折服!这里写一下在android用的最多也是最早就学了的回调思想。 button.setOnClickListener(new OnClickListener(){ @override public void click(){}}); 这就是回调,是不是恍然大悟,我们是多么常用的。像java中原创 2016-07-19 13:22:30 · 555 阅读 · 0 评论 -
单例模式
单例模式其实是一个很简单的设计模式,其作用就是为了让某一个类的全局实例只有一个。 我认为这个模式在oop上思想的增加是很少的。但这个模式却是对多线程安全认知的一个很好的例子。这是我代码的demo单例github demo其实我代码中的注释也写的很明白了。 能保证线程安全的单例大概有三种写法。第一种: 双重检查就是SingletonDobuleCheck这个类的写法,使用了java内置的加锁机制,原创 2017-08-14 19:36:11 · 457 阅读 · 0 评论 -
Java线程池使用与原理
线程池是什么?我们可以利用java很容易创建一个新线程,同时操作系统创建一个线程也是一笔不小的开销。所以基于线程的复用,就提出了线程池的概念,我们使用线程池创建出若干个线程,执行完一个任务后,该线程会存在一段时间(用户可以设定空闲线程的存活时间,后面会介绍),等到新任务来的时候就直接复用这个空闲线程,这样就省去了创建、销毁线程损耗。当然空闲线程也会是一种资源的浪费(所有才有空闲线程存活时间的限制),原创 2017-09-25 10:01:17 · 3238 阅读 · 7 评论 -
apache-common-pool2源码分析
基础概念apache-common-pool2是一个对象池管理框架,任何需要对象池这种概念的都可以利用这个框架来实现,例如redis的客户端jedis和dbcp都是基于common-pool2实现的。本文是common-pool2的源码分析,在讲源码前我先阐述一下基本对象池的基本概念吧。现在java创建一个对象的速度已经很快了,但是对于网络连接的创建还是需要很长的时间的,频繁的创建客户端与服务的连接原创 2017-10-31 10:03:55 · 1782 阅读 · 0 评论 -
Redis客户端Jedis源码阅读及连接池分析
0.起因自己负责的项目redis服务端连接数明显高于实际访问量,很多空闲连接没有释放;Jedis对象和连接的对应关系?连接池的复用是复用了jedis对象,还是只保存连接?总总疑惑,让我开始了jedis的源码阅读。所幸最后都搞明白了,在这里写明白分享给大家。我相信很多刚入门的同学一定想了解连接池是如何复用连接的。客户端和服务器之间的连接和客户端对象之间的关系。因此在源码解读前,我先提出几个问原创 2017-11-25 16:05:56 · 3744 阅读 · 2 评论 -
java线程不安全类 SimpleDateFormat
不安全在什么地方?前段时间在做系统数据清洗过程中,因为用到多线程及simpeldateformat,一开始没注意,遇到了线程安全问题,就在此描述解决办法。// Called from Format after creating a FieldDelegate private StringBuffer format(Date date, StringBuffer toAppend原创 2018-01-07 12:03:49 · 463 阅读 · 0 评论 -
HashMap
注意事项数组+链表/红黑树来存储数据链表长度为8(默认)时,转化为红黑树,加快查询速度。数组下标是 (n-1)&hash,n表示数组长度,hash表示key的hash值构造参数无参:数组长度和扩容因子采用默认(16,0.75) 单参:指定数组大小(向上取相应2^n值,例如输入3数组的长度为4,输入6数组的长度为8) 双参:数组长度和扩容因子扩容机制:当数组长度达...原创 2018-03-12 16:37:17 · 253 阅读 · 0 评论 -
反序列化 动态加载jar的里的类报ClassNotFoundException解决办法
1.背景自己在写一个RPC框架时,碰到第一个麻烦就是做动态加载加载jar包后,在进行反序列化(不要吐槽为啥用java原生的序列化方案,一步一步来,框架写完能跑后在优化)时报CNF错误,当时感觉应该是原生的序列化方案中使用的ClassLoader是应用加载器AppCloassLoader,而我使用的URLClassLoader加载的外部jar包,导致没有找到。关于java的类加载器,如果知道...原创 2018-04-29 11:54:41 · 3771 阅读 · 0 评论 -
SSH框架如何与APP通信
最近SSH肤浅的学了一遍后,也算自己向全栈迈出了重要的一步。现在学SSH框架大多以网站开发为例。像我这种做APP出身的,就特想实现跟服务器的通信。 要解决的问题就是如何接受APP传来的数据(一般为json格式)和返回数据(一般为json格式)。下面就进行一下说明。 如何接受APP传来的数据: 我是让action实现了ServletRequestAware这个接口,然后重写了其方法获取reque原创 2016-11-05 14:46:48 · 2092 阅读 · 1 评论