JAVA
文章平均质量分 71
sutonline
这个作者很懒,什么都没留下…
展开
-
CPU高速缓存原理梳理
为什么要用CPU高速缓存?原因本质是局部性原理,体现在两个方面。时间局部性: 如果一个信息最近被访问,那么很可能会被再次访问空间局部性: 如果一个地址被读取,那么它临近的地址也很可能会被访问。所以相当于我们从时间上缓存了将要执行的指令,从空间上我们缓存将要读取的数据来加速性能。当然速度上肯定是,寄存器>高速缓存>主内存为什么多级呢?我们知道CPU通常都是三级缓存,L1,L2,L3。我们如果想的话,如果性能和成本都足够的话,那么一级就行了。所以还是资本的原因,精细化管理原创 2021-09-10 00:06:03 · 925 阅读 · 0 评论 -
JVM架构及内存模型详解
JVM架构及内存模型详解JVM内存架构JVM架构主要分成了三个部分:JVM内存模型,主要包括了方法区、堆、虚拟机栈、程序计数器、本地方法栈。在下面进行展开。执行引擎,包括最核心的解释器和GC垃圾回收器,还包括了JIT编译器。本地方法接口和库JVM内存模型这里我们将结合着第二张图一起来看。方法区在JVM的规范里是存储一些常量的区域,主要是类常量。因为运行时也可以产生常量,比如我们最常用的String,所还包括了Runtime Constant Pool。最后它还包括了Code Cac原创 2021-09-07 09:09:37 · 440 阅读 · 0 评论 -
JVM Crash的定位和解决办法
JVM的Crash定位及解决办法原创 2022-06-08 08:41:39 · 1953 阅读 · 1 评论 -
如何做性能优化
之前也做了几次的性能优化,每次的过程好像大体上都差不多,所以就此总结一下。如果有哪里不到位的地方,欢迎及时指正。性能优化的过程,我认为可以分为三个阶段:收集监控信息和资料确定改进措施,验证及调整总结最佳实践这里我们主要对前两个部分进行展开。收集监控信息和资料监控信息无论在什么领域,监控都是流程中优化的关键。我们需要从上层下层的顺序去监控,采集到我们需要的信息,然后才能进行优化。应用层本层需要观察到优化的方法每一步的时间,从而逐个击破地进行优化。需要固定的监控点位置有三种:API原创 2021-10-07 16:40:18 · 2257 阅读 · 0 评论 -
Guava Cache缓存机制说明
在日常使用本地缓存的时候,我们经常会选择GuavaCache,使用起来很方便。不过也会有一些疑惑,主要的疑问点有:如何实现的LRU缓存, LFU又是如何实现的单个key失效大量请求会造成雪崩吗失效key的处理是怎么样的Cache命中率查看那么接下来就让我们一起来看看吧。LRU缓存是如何实现的一切我们从CacheBuilder看起,因为这个类是我们经常用来构建GuavaCache的入口。public <K1 extends K, V1 extends V> Cache<.原创 2021-10-06 12:29:36 · 1242 阅读 · 0 评论 -
Testable-Mock增强之路
最近我们又在热火朝天的搞起来了单元测试。但谈到单元测试,总是不可避免的涉及到Mock,如何方便地Mock,是一个很大的难题。之所以会是这样的原因,主要是因为Mock的时候希望尽量不侵入原有代码,而且可以任意对部分,包括私有方法进行Mock。在比较工具之后,我选择了最近火热的testable-mock框架,但是在使用的过程发现如果我想进行流程测试,并不是一个测试类对应一个被测类,这样的方式去Mock,有没有办法去增强一下呢? 我们定义一个全局的类,将我们依赖RPC Mock进去,并且支持数据模板的配置原创 2021-09-30 11:30:24 · 465 阅读 · 0 评论 -
字节码增强总结
经常遇见字节码就懵逼,ASM, CGLIB, Instrument, Aspect, Spring AOP这些都是啥关系,有什么作用。今天就让我们来试着总结一下。一切还要从Instrument讲起Instrument是JVM提供的一个可以修改已加载类的类库,专门为Java语言编写的插桩服务提供支持。在JDK 1.6以前,instrument只能在JVM刚启动类时生效,而在JDK 1.6之后,instrument支持在运行时对类定义的修改。我们看一下instrument的类库都包括什么:Instrum原创 2021-09-29 18:47:13 · 429 阅读 · 0 评论 -
如何把算法讲明白
在高中的时候发现自己的数学还可以,但是大学之后就不太行了,包括后来学习算法或者给人讲一个普通的算法时候也会很难让人理解和明白。所以自己在想的是,如何将算法或者数学讲明白。理清本质算法的定义:In mathematics and computer science, an algorithm (/ˈælɡərɪðəm/ (About this soundlisten)) is a finite sequence of well-defined, computer-implementable instru原创 2021-09-16 08:52:05 · 380 阅读 · 0 评论 -
RingBuffer vs Netty零拷贝
为什么会将这两个放在一起原因是这两个缓存比较都是高性能,也比较容易联想到一起,容易搞混。RingBuffer的原理RingBuffer是Disruptor的核心组件,是一个高性能的队列。那么谈到队列,那么首先想到的就会是创建线程池使用的ArrayBlockingQueue和LinkedBlockingQueue。那么这两个有什么缺点呢? 通过阅读代码我们可以得知,ArrayBlockingQueue内部结构是数组,线程安全使用的锁,LinkedBlockingQueue的内部结构是双向链表,线程原创 2021-09-16 00:04:54 · 420 阅读 · 0 评论 -
JVM Remembered Set图解
为什么要有Remembered Set?因为在JVM的分代收集器里,会存在老年代引用年轻代的情况,这样YGC的时候就必须扫描老年代,这样岂不是编程了FULL GC?所以前人就想了一个办法,精细化管理。将老年代进行分页,就像操作系统的分页一样。当老年代指向年轻代的时候,就把对应的区域更新成脏页,需要进行扫描。有了存储的地方了,怎么写呢?具体的机制是写屏障,但这里的名字也和其他的有重合。这里可以理解为当更新对象的reference时,就像AOP一样,会更新Remembered Set。结构分析Rem原创 2021-09-14 23:57:30 · 759 阅读 · 0 评论 -
ThreadLocal存储、泄露、TTL线程传递详解
为什么要有ThreadLocal我们知道Java线程的出现是为了共享资源,但在线程运行的过程中,他们也希望能够独享某些资源。ThreadLocal结构和内存泄露分析这里其实有点难以理解。这里来说一下要点。每个Thread有自己的属性threadLocals,是ThreadLocalMap类型ThreadLocalMap是一个EntryTable,Entry拥有对threadlocal的弱引用和valueThreadLocal的实例对象拥有两个引用,一个是它本身的强引用ThreadLocalR原创 2021-09-11 18:59:10 · 882 阅读 · 0 评论 -
Collection集合介绍
Collection从接口上一共包括了三种数据结构,Set,List,Map关键点介绍:HashSet是依赖于HashMap实现的,值是固定的LinkedHashSet是继承了HashSet,使用HashSet的构造函数,通过无意义的参数区分,使用的是LinkedHashMapTreeSet是有序唯一的集合,红黑树结构ArrayList内部是Object[]集合LinkedList是双向链表LinkedHashMap保存了一个双向链表。Linked会保证遍历时候的顺序,不过大多数场景都是没原创 2021-09-09 08:46:48 · 128 阅读 · 0 评论 -
ConcurrentHashMap 1.7和1.8结构图解
在1.7中使用锁的方法是ReetrantLock.在1.8如果数数组元素是不加锁,使用的是UnSafe的compareAndSet方法,如果非数组元素,那么就会使用Synchronized关键字进行加锁。原创 2021-09-09 00:16:49 · 335 阅读 · 0 评论 -
线程池原理简单解析
记得在4年前面试的时候,在追问为什么要用线程池呢?很简单的回答了因为线程池不用重复创建线程,重复创建线程是一个比较对性能有影响的动作。那么线程池的原理是什么呢? 这个问题一直没问题,今天就简单总结一下。总的结构无论是使用Executors还是Guava的ThreadFactory去构建线程池,都构建的是ThreadPoolExecutor,所以这个就是我们这次分析的目标。ctl变量首先不得不提一个神奇的变量ctl,这里我们简单理解它包含了两个部分: 线程池状态前3位和线程池worker数量。可以参见原创 2021-09-08 22:41:42 · 180 阅读 · 0 评论 -
HashMap图解
HashMap图解HashMap底层实现JDK7JDK8的HashMap原创 2021-09-08 00:33:13 · 94 阅读 · 0 评论 -
我眼中的DDD系列二
之前曾经写过一篇DDD,总结了一下自己对于DDD的一些认识,包括认为DDD是一种战略,从道法术器上来讲,还属于道的层面,无法很好的落地。时隔一年后,因为工作参与业务中台建设的关系,也啃了两本书,所以再来阶段性总结一下。在开始总结之前,先立一个小flag,看完要让大家对DDD有一个全局性的认识,如果没有达成,请找我发红包_。DDD就是面向对象DDD的全称是领域驱动设计,与之前的设计模式相比有较大的不同。假如我们回忆一下编程语言发展的历史,其实就会感受到,编程语言的发展是从指令、到过程式,再到面向对象。假原创 2021-06-24 12:28:30 · 216 阅读 · 1 评论 -
Druid的CreateConnectionThread无故消失分析
现象在升级弹性数据库后,我们发现我们的应用在运行一段时候后,某些容器会收到服务端线程池满,并且一直不能恢复的情况。线程为什么hang住了在遇到线程问题时,我们首先想到的工具就是jstack。拿到拿到日志后,我们来一起看一下RPC有关的线程。"RPC-BZ-22000-91-T-1" #419 daemon prio=5 os_prio=0 tid=0x00007f3dd8030800 nid=0x98b0a waiting on condition [0x00007f4169504000] j原创 2021-04-30 19:42:48 · 1865 阅读 · 1 评论 -
延迟请求组件设计
最近有一个需求,调用某个服务不需要返回结果,收敛窗口时间的请求, 最后进行一次调用,来避免并发出现的问题。网上搜了一下这样的需求还是挺多的,但每个解决方案解决的问题又不太相同。所以就来整理一下。思路从需求出发,我们可以从功能上进行分析,如何进行实现。假设我们的组件叫A。那么A要做到单位T时间内合并请求,超过T后将请求发给服务端进行真正调用。实现的大概思路就是: 我们存储一个任务(T)时间内有效,当T时间内的请求后过来时,将请求过滤掉,在时间达到T后,将任务T发送出去进行执行。这个简单来看是一个自动失原创 2021-01-13 23:15:37 · 153 阅读 · 0 评论 -
java type设计分析
java的Type设计分析在1.5版本后,java设计了Type,但是对于Type是什么一直也是和清晰,所以一起看一下吧。分析的方式采用UML类图的方式,进行功能设计的解释说明。设计分析Type接口这个接口是所有类型的超类,只有一个没有很大作用的getTypeName()的默认方法,默认返回toString。GenericArrayType接口是一个数组类型接口,它的元素是ParameterizedType或者TypeVariable。只有一个方法,返回数组元素的类型。Wilca原创 2020-12-13 21:34:18 · 157 阅读 · 0 评论 -
Java集成Groovy
Java集成Groovy1. 介绍在这次教程里,我们将会探索一下如何将Groovy集成到一个Java应用中.2. Groovy的简短介绍Groovy是一个很有用的弱类型动态语言。开发支持主要来源于Apache基金会和超过200个开发者的Groovy社区。它可以用来构建一个完整的工程,或者作为一个Module,第三方集成到Java代码中。甚至可以作为脚本在执行时动态编译。更多的介绍,请阅读 Introduction to Groovy Language 或者 official documentat翻译 2020-11-15 18:16:49 · 1884 阅读 · 0 评论 -
Druid开启日志
Druid开启日志最近总是会有线上机器的com.alibaba.druid.pool.DruidDataSource.CreateConnectionThread会无故的退出,导致池中连接处小于minIdle甚至变成0, 所以就想打印这个线程或者DruidDataSource的日志来帮忙定位一下问题。那么就让我们来看一下druid的日志体系吧。Logger name如何生效的首先先引入Loggername配置的是如何生效的吧。logger的name具有父子关系,比如org就是org.sprin.原创 2020-10-15 22:45:33 · 3624 阅读 · 0 评论 -
Spring国际化原理浅析
Spring国际化原理浅析最近在做Spring国际化,虽然之前知道Spring是支持国际化的,但是在配置的时候遇到了一些问题,所以看了一些源码,简单记录一下。quick start配置i18n的basename,例如spring.messages.basename=i18n/message注意这个basename并不是路径,而是路径+i18n文件的前缀,所以这样配置会匹配到i18n/message_en_US.properties,i18n/message_zh_CN.properties等等。原创 2020-09-16 22:12:52 · 244 阅读 · 0 评论 -
guava/caffeine的evict策略探索
guava/caffeine的evict策略探索背景是上线了一个基于公司内部基于redis缓存组件读的服务时,发现redis数据变化后,超过了本地JVM缓存(caffeine)后并没有返回正确的值。在guava的wiki中有这样一段话:When Does Cleanup Happen?Caches built with CacheBuilder do not perform cleanup and evict values “automatically,” or instantly after a原创 2020-08-16 20:26:25 · 294 阅读 · 0 评论 -
分布式带来的事务失效解决方案总结
事务失效解决方案总结当应用业务到多个数据库时,事务升级为分布式事务,数据一致性强度有所降低。如何从短期和长期去解决这个问题呢?解决方案长期方案从总体来说,可以分成三种:1、缩小事务边界,收敛到单一库内,避免分布式事务2、引入分布式事务的方案,来达到最终一致性。3、移除不必要的事务结合迁库场景来看:是否可以收敛事务到单一库?在这种场景下,无法寻找到一个都可以保证不失效的分库键引入分布式事务解决方案,将事务转换为柔性事务(BASE,基本可用,最终一致),这里可以参见支付宝的分布式事务解决原创 2020-08-11 15:41:45 · 984 阅读 · 0 评论 -
idea如何排除自动引入哪些包
idea如何排除自动引入哪些包背景在使用idea作为IDE时,我们定义了一个SystemException,然后引入的时候经常会自动引入为org.omg.CORBA.SystemException。需要手动更换。解决办法在Editor > General > Auot Import中Exclude from import and completion中增加特定的package或者包。官方说明: Auto import...原创 2020-06-08 10:49:54 · 898 阅读 · 0 评论 -
SpringBootApplication的exclude不生效问题排查
SpringBootApplication的exclude不生效问题排查背景在ManApplication上添加了SpringBootApplication中配置了exclude={org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchAutoConfiguration.class}但是在启动过程了ElasticsearchAutoConfiguration还是加载了,使用配置文件的方式就可以避免加载。排查首先原创 2020-06-03 19:34:45 · 11281 阅读 · 2 评论 -
记录一次诡异页面调试问题
记录一次诡异页面调试问题现象:在一个风平浪静的早上,收到运营同学反馈系统页面打不开要么报错,并且再次刷新后会调到一个公用的不同域名的错误页。分析:很熟练的打开了chrome的console页面,然后看到加载js的时候报了一个错Cross-Origin Read Blocking(CROB)的错误。根据后面的提示打开了一个https://www.chromestatus.com/feature/5629709824032768的链接,以为是我们的script没有加类型导致(原来的引入js是<s原创 2020-05-25 20:25:30 · 153 阅读 · 0 评论 -
打印出来是null但是却不是null的情况
打印出来是null但是却不是null的情况在今天看日志的时候,很明显看到sku.getWidth()打印出来的是null,但是使用sku.getWidth() == null 和Strings.isBlank(sku.getWidth())返回的都是false.后来想起来width可能是"null"的字符串,所以打印出来是null,实际却不是。再往里看,原来用了String.valueOf()来设置width字段。String.javapublic static String valueOf(Obj原创 2020-05-19 21:56:04 · 1202 阅读 · 0 评论 -
数据模型是否需要version字段
数据模型是否需要version字段最近在设计数据库模型的时候,总会碰到要不要加version字段的问题。并且我们通常都会把version字段备注成乐观锁,但这其实是不准确的。接下来我们来看一下具体的分析。我们都明白锁是为了解决并发带来的问题。但是不知道有没有仔细想过,为什么并发就会出现问题?结合我们之前读过的文章,很容易回答出因为存在共享数据,对共享数据的读写如果不加锁就会混乱。但是存在共享...原创 2020-04-09 00:07:11 · 1273 阅读 · 0 评论 -
我眼中的DDD
我眼中的DDD最早接触DDD是在2018年,在接到一个事件记录系统的设计开发任务时。当时DDD在国内已经很火了,但在工作环境里还是个不太热的东西,周围并没有什么动静。在做完这个系统后,觉得自己甚至掌握了DDD,DDD就是聚合跟和界定上下文。当时也读了Eric Evans的领域驱动设计,很晦涩难懂,没有消化太多内容。在近两年的开发实践中,DDD变得更加流行,工作中也因此组织了一些学习和培训。但关...原创 2020-03-08 23:42:17 · 126 阅读 · 0 评论 -
Spring Boot Caffeine Cache设置不同缓存策略及查看命中率
Spring Boot Caffeine Cache设置不同缓存策略及查看命中率根据SpringBoot官方文档,使用Caffiene Cache方法很简单:spring.cache.type=caffeinespring.cache.cache-names=cache1,cache2spring.cache.caffeine.spec=maximumSize=500,expireAfte...原创 2020-02-11 18:18:39 · 5393 阅读 · 2 评论 -
MyBatis更新字段为null的一点思路
MyBatis更新字段为null的一点思路问题: 在好多工程里,我们都习惯了使用if test=xxx!=null进行部分字段动态更新。但是如果我们遇到这种需要更新字段为null的情况呢?大概方案想到了三种:去掉test条件。需要保证更新的实体都是从DB中查出来的,否则会丢数据使用特殊的值。比如-1等,这种含义有点模糊不清,并且可能以后随着业务发展也需要改。在更新对象中增加一个List...原创 2020-01-14 23:02:50 · 5483 阅读 · 0 评论 -
系统分层泛谈
系统分层泛谈今天同事提出了一个关于系统分层原因的问题。做为后端研发工程师,我们基本都听过MVC模式/框架,但是目前我们系统拆分的情况,会遇到完全是服务端的系统,同时一个系统维护的研发人员并不多的情况下,那么是否依然需要遵循类似MVC模式/框架的思想,对系统进行分层呢?如果需要是为什么呢?如果不需要又是为什么呢?基于上面的问题,系统分层的意义究竟又是什么呢对于这种设计类的问题,在工作中...原创 2020-01-14 18:46:21 · 229 阅读 · 0 评论 -
使用tesseract进行图像识别
使用tesseract进行图像识别在最近的工作中,遇到一个图像识别的问题。在探索一番opencv失败之后,无奈因为上线时间点的关系只能转用google的图像识别tesseract工具。这次记录安装记录以防止日后用到。先上结果:brew install tesseractbrew install tesseract-lang就这两条就可以愉快地使用tesseract 2.jpg -l...原创 2019-12-13 15:48:14 · 291 阅读 · 0 评论 -
jstack解决线上发布失败问题记录
### jstack解决线上问题记录问题现象之前也有看过jstack的文章,典型的案例是deadLock和空闲线程调优。不过都不是这次遇到的问题。这次的问题现象是容器发布时,tomcat输出的日志就卡在某行日志,需要大约半小时的时间才继续输出日志并且启动成功。启动成功后也没有明显的错误日志。解决步骤首先猜想是某个线程卡住了,一般来说是网络资源连接。果断使用jstack进行导出日志。接...原创 2019-11-30 13:14:58 · 508 阅读 · 0 评论 -
理一理Maven的phase, goal, surefire, failsafe
理一理Maven的phase, goal, surefire, failsafe一直在用Maven,可是今天在引用了一个插件,想要执行插件的goal的时候却完全懵了。执行mvn test的时候分不清surefire和failsafe的作用。这可怎么行,至少要知道大概的原理才行。首先phase是类似于Spring,Tomcat的lifecycle一样的各个阶段,这些phase是有顺序的。对Ma...原创 2019-10-11 22:35:57 · 432 阅读 · 0 评论 -
Java中的Abstract和Interface的区别
问题 I will give you an example first:public interface LoginAuth{ public String encryptPassword(String pass); public void checkDBforUser();} Now suppose you have 3 databases in your applicati原创 2016-03-04 15:00:44 · 323 阅读 · 0 评论 -
JAVA目标
JAVA工作目标 * 根据JAVA招聘,制定以下JAVA工作时实现的目标 *JAVA基础扎实,理解IO、多线程、状态机等基础框架,对JVM原理有一定的了解 SSI和SOA开源框架及了解其原理和实现机制;了解非关系数据,包括NOSQL,HBASEspring mvc/mybatisSpring、Struts、JQuery熟悉MySQL、Mongo等数据库,熟悉Redis/MemCach原创 2016-02-22 14:14:05 · 502 阅读 · 0 评论 -
Spring返回方式总结
Spring返回方式总结1.返回字符串,这时候会跳转到对应的页面。完成系统跳转功能。 #这个跳转到hello.jsp页面 @RequestMapping(value="/hello", method= RequestMethod.GET) public String printHello(ModelMap model){ model.addAttrib原创 2016-03-07 19:05:37 · 574 阅读 · 0 评论 -
引入struts2的taglib
当要使用struts2的标签时,应引入taglib %@taglib uri="/struts-tags" prefix="s" %>struts-tags.tld在 struts2-core-2.1.6.jar/META-INFO/struts-tags.tldstruts-tags.tld:http://java.sun.com/xml/ns/j2ee" x转载 2016-02-23 10:59:22 · 636 阅读 · 0 评论