自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

张哈希的博客

MyCat 1.6核心源代码贡献者之一。为全栈而努力,喜欢各种轮子,最近因业务需要研究NLP相关的东西

  • 博客(253)
  • 论坛 (1)
  • 收藏
  • 关注

原创 JVM相关 - StackOverflowError 与 OutOfMemoryError

本文基于 Java 15StackOverflowError 与 OutOfMemoryError 是两个老生常谈的 Java 错误。Java 中的虚拟机错误 VirtualMachineError 包括以下四种:我们比较关心的就是 StackOverflowError 与 OutOfMemoryError,剩下的 InternalError 一般是内部使用错误,UnknownError 是虚拟机发生未知异常,这两种我们这里不讨论。虚拟机规范中的 StackOverflowError 与 Out.

2020-10-12 12:05:36 154

原创 JDK核心JAVA源码解析(9) - hashcode 方法

本文基于 OpenJDK 11, HotSpot 虚拟机在开发过程中我们可能会经常接触到hashcode这个方法来生成哈希码,那么底层是如何实现的?使用时有何注意点呢?hashcode() 方法底层实现hashcode()是Object的方法:@HotSpotIntrinsicCandidatepublic native int hashCode();它是一个native的方法,并且被@HotSpotIntrinsicCandidate注解修饰,证明它是一个在HotSpot中有一套高效的实.

2020-09-16 17:44:51 95

原创 Java GC详解 - 1. 最全面的理解Java对象结构 - 对象指针 OOPs

最近在抽时间阅读 JDK 的源码,主要是 GC 还有 Safepoint 相关的源码,发现很多我在之前拜读网上各种 JVM 原理大作时候的对于底层原理的误解。果然,一百个人读水浒传,就有一百种水浒传。还是需要更加深入的了解下源码,才能更好地理解 JVM,进行调优。这个系列,将在讲述 Java GC 各种原理的基础上,结合对应的源码分析,并附上源码地址。因为JVM的源码更新还是很快的,尤其是 GC 这一块,但是基本原理,应该大体不会变,附上源码地址,旨在让各位读者掌握这些原理最新实现情况。本文在撰写的时候,.

2020-09-16 17:42:48 146 2

原创 Spring Cloud升级之路 - Hoxton - 10. 网关重试带Body的请求Body丢失的问题

带 Body 的重试 Body 丢失之前我们的配置里面,只对 Get 请求针对 500 响应码重试,但是针对像 Post 这样的请求,只对那种根本还没到发送 Body 的阶段的异常(例如连接异常)这种重试,那么如果我们要对带 Body 的 Post 进行重试呢?或者就是用 Postman 构建一个带 Body 的 Get 请求,重试是否正常呢?我们启动之前第6节的 EurekaServer,修改/test-exception-thrown接口,增加 RequestBody 参数:@RequestMap

2020-07-29 20:03:29 2904

原创 Spring Cloud升级之路 - Hoxton - 9. 针对网关非 Get 请求的重试

针对网关非 Get 请求的重试在之前的系列里面Spring Cloud升级之路 - Hoxton - 5. 实现微服务调用重试,我们针对 OpenFeign 和 Spring Cloud Gateway 都设置了重试。对于 OpenFeign:Get请求:任何非200 响应码,任何异常,都会重试。非 Get 请求:任何IOException(除了SocketTimeOutException,这个是read time out 导致的),还有 redilience 断路器异常,都会重试,其他的都不重试

2020-07-19 20:54:48 4320

原创 JVM相关 - SafePoint 与 Stop The World 全解(基于OpenJDK 11版本)

本文基于 OpenJDK 11在分析线上 JVM 性能问题的时候,我们可能会碰到下面这些场景:1.GC 本身没有花多长时间,但是 JVM 暂停了很久,例如下面:2.JVM 没有 GC,但是程序暂停了很久,而且这种情况时不时就出现。这些问题一般和 SafePoint 还有 Stop the World 有关。什么是 SafePoint?什么是 Stop the world?他们之间有何关系?我们先来设想下如下场景:当需要 GC 时,需要知道哪些对象还被使用,或者已经不被使用可以回收了,这样.

2020-07-19 20:32:21 4504

原创 Spring Cloud升级之路 - Hoxton - 8. 修改实例级别的熔断为实例+方法级别

实例级别的熔断带来的困扰如之前系列(Spring Cloud升级之路 - Hoxton - 4. 使用Resilience4j实现实例级别的隔离与熔断)所述,我们实现了实例级别的熔断。但是在生产中发现,并不是所有情况下都表现良好。首先如果发布了新接口,但是不小心回滚了,调用新接口就会报错,从而导致整个实例都不能访问。还有就是某些实例某个接口出现了问题,但是其他接口是好的,熔断掉整个实例有点浪费。于是乎,我们将实例级别的熔断改成 实例 + 方法级别。对于 OpenFeign 修改首先,我们只针对断路器进

2020-07-14 10:24:08 4531

原创 JDK核心JAVA源码解析(8) - 自动封箱拆箱与效率的思考
原力计划

想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本文基于 Java 14在JDK1.5引入自动装箱/拆箱,让开发更高效。自动装箱时编译器调用valueOf()将原始类型值转换成对象,同时自动拆箱时,编译器通过调用类似intValue(),doubleValue()这类的方法将对象转换成原始类型值。自动装箱是将 boolean 值转换成 Bo

2020-06-16 20:19:38 3193

原创 Spring Cloud升级之路 - Hoxton - 7. 后续更新(WebFlux等)

1. 修正实例列表乱序导致的负载均衡重试相同实例的问题虽然之前考虑了通过每个请求的traceId隔离负载均衡的position来实现重试不会重试相同实例的问题,但是没有考虑在负载均衡过程中,实例列表的更新。例如:请求第一次调用负载均衡,实例列表是:[实例1,实例2],position为1,对2取余=1,所以请求发送到实例2上面了请求失败,触发重试,实例列表缓存失效,更新后变成了:[实例2,实例1],position为2,对2取余=0,所以请求又发送到实例2上面了private Response

2020-06-15 15:21:57 7451

原创 Spring Cloud升级之路 - Hoxton - 6. 场景测试
原力计划

准备工作首先拉取项目源码:git clone https://github.com/HashZhang/spring-cloud-scaffold.git打开其中的 spring-cloud-hoxton 项目。启动Eureka启动zone1-service-provider-instance1,zone1-service-provider-instance2,zone1-service-provider2-instance1,zone2-service-provider-instance1这

2020-06-05 17:39:26 4064

原创 Spring Cloud升级之路 - Hoxton - 5. 实现微服务调用重试
原力计划

feign 实现重试我们继续使用resilience4j实现重试,根据上一篇Spring Cloud升级之路 - Hoxton - 4. 使用Resilience4j实现实例级别的隔离与熔断,我们已经加载了RetryReqistry这个核心配置Bean。Retry相关的配置:create-and-configure-retry配置项默认值说明maxAttempts3最大重试次数,不包括本身那次调用waitDuration500[ms]重试间隔时间interva

2020-06-05 17:38:52 7376

原创 Spring Cloud升级之路 - Hoxton - 4. 使用Resilience4j实现实例级别的隔离与熔断
原力计划

如何不启用Hystrix由于我们的入口注解类从@SpringCloudApplication替换成了SpringBootApplication,这样不会启用Spring-Cloud-CircuitBreaker。引入的Hystrix依赖也就没有效果。请参考本系列第二节: Spring Cloud升级之路 - Hoxton - 2.入口类注解修改与OpenFeign的改造使用Resilience4j实现实例级别的隔离与熔断为什么需要实例级别的熔断呢?因为某个微服务可能某些实例暂时不可用,我们希望在重试的

2020-06-05 11:13:39 7914 1

原创 Spring Cloud升级之路 - Hoxton - 3. 负载均衡从ribbon替换成spring-cloud-loadbalancer
原力计划

本系列示例与胶水代码地址: https://github.com/HashZhang/spring-cloud-scaffold负载均衡Ribbon替换成Spring Cloud Load BalancerSpring Cloud Load Balancer并不是一个独立的项目,而是spring-cloud-commons其中的一个模块。 项目中用了Eureka以及相关的 starter,想完全剔除Ribbon的相关依赖基本是不可能的,Spring 社区的人也是看到了这一点,通过配置去关闭Ribbo.

2020-06-04 11:14:18 8384

原创 Spring Cloud升级之路 - Hoxton - 2.入口类注解修改与OpenFeign的改造

本系列示例与胶水代码地址: https://github.com/HashZhang/spring-cloud-scaffold入口类注解修改之前的项目,我们也许会用@SpringCloudApplication作为我们入口类的注解。这个注解包括:@SpringBootApplication@EnableDiscoveryClient@EnableCircuitBreakerpublic @interface SpringCloudApplication {}其中的@EnableDis.

2020-05-28 18:43:28 7529

原创 Spring Cloud升级之路 - Hoxton - 1.背景介绍与要实现的功能
原力计划

本系列示例与胶水代码地址: https://github.com/HashZhang/spring-cloud-scaffoldSpring Cloud还是比较活跃的,更新一直很快。我一般考虑最新版本SR2发布之后,再考虑升级(一般SR1还有SR2会有一些新老框架的兼容性升级)。而且由于需要我们线上稳定,结合我们的发布周期来看,跳一个大版本升级是一个更好的选择(也就是一年做一次大版本升级)。例如我们之前的升级路线就是:Brixton -> Daltson -> Finchley ->.

2020-05-28 18:42:05 7776

原创 深度探索JFR - JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与JVM调优策略(2)
原力计划

2. JAVA 应用相关2.4. Java Monitor 同步锁相关主要是三种 Event:当进入同步块,尝试获取锁的时候,产生 JavaMonitorEnter Event;当调用 Object.wait() 进入等待时,会产生 JavaMonitorWait Event;当 锁升级(另一种说法是锁膨胀)时,产生 JavaMonitorWait Event。下面我从网上看到的这张图,有...

2020-04-07 19:48:05 4310

原创 深度探索JFR - JFR详细介绍与生产问题定位落地 - 3. 各种Event详细说明与JVM调优策略(1)
原力计划

Event 采集详细配置目前,JDK 11 一共有136个 Event 采集配置。这里会比较详细的去看每一个Event,并说明基本应用,建议配置。如果 default.jfc 中没有打开或者需要修改的配置,会将配置文件代码发出来。1. JFR 相关 Event一共4个 Event,但是需要关心的就下面这两个Data Loss:数局丢失 Event,当有数据发生丢失时,会有这个Event ...

2020-04-03 18:11:55 4302

原创 深度探索JFR - JFR详细介绍与生产问题定位落地 - 2. 通过一个线上调优例子了解JMC 与 Event 结构与详细配置
原力计划

查看 JFR 事件的工具 - JMC (Java Mission Control)官网地址:https://adoptopenjdk.net/jmc.html国内下载起来比较慢,建议在aws上面建一个欧洲法兰克福的实例,在这个实例上先下载好,然后传输到本地。或者直接用我下面提供的连接下载,我也会跟着官网上面的版本进行更新的。我的私人下载地址:https://zhxhash-blog.oss-...

2020-04-01 16:52:53 3491

原创 深度探索JFR - JFR详细介绍与生产问题定位落地 - 1. JFR说明与启动配置
原力计划

本文基于 OpenJDK 11 并涉及一些之后版本的特性,非 OpenJDK 11 的特性会被特殊标记出来什么是 JFR?我们都知道,黑匣子是用于记录飞机飞行和性能参数的仪器。在飞机出问题后,用于定位问题原因。JFR 就是 Java 的黑匣子。JFR 是 Java Flight Record (Java飞行记录) 的缩写,是 JVM 内置的基于事件的JDK监控记录框架。这个起名就是参考了...

2020-04-01 11:04:22 4666

原创 OpenJDK 11 JVM日志相关参数解析与使用

OpenJDK 11是在OpenJDK 8之后的第一个长期支持版本,这一版本在JVM日志配置有了很大改动,主要是规范化,统一化了。在OpenJDK 8中,日志配置有很多状态位,让人摸不着头脑,并且比较难以维护与进一步迭代。在OpenJDK 11终于将JVM日志相关的配置规范起来,统一配置。这篇文章会对于这些配置做一个详尽的说明和解析。一、JVM日志标签JVM日志和我们java代码中的日志,其实...

2020-02-28 16:01:08 3176

原创 Java中对于位运算的优化以及运用与思考

引言随着JDK的发展以及JIT的不断优化,我们很多时候都可以写读起来易读但是看上去性能不高的代码了,编译器会帮我们优化代码。之前大学里面学单片机的时候,由于内存以及处理器性能都极其有限(可能很多时候考虑内存的限制优先于处理器),所以很多时候,利用位运算来节约空间或者提高性能,那么这些优秀的思想,放到目前的Java中,是否还有必要这么做呢?我们逐一思考与验证下(其实这也是一个关于Premature...

2020-01-08 19:02:10 340 4

原创 JEP解读与尝鲜系列1 - Java Valhalla与Java Inline class

涉及到的JEP:Project ValhallaJEP 169: Value ObjectsJEP 218: Generics over Primitive Types这些特性将在JDK14实现Valhalla项目背景最主要的一点就是,让Java适应现代硬件:在Java语言发布之初,一次内存访问和一次数字计算的消耗时间是差不多的,但是现在,一次内存访问耗时大概是一次数值计算的2...

2019-10-22 19:54:09 359 3

原创 从JDK8升级到JDK11,看这篇就足够了

原文地址:https://blog.codefx.org/java/java-11-migration-guide/。 在原文的基础上,增加了一些我遇到的具体的坑还有在特定场景下的解决方案,供大家参考一些背景在背景知识,我们会讨论一些关于新的JDK Release周期,OpenJDK特性归一化,LTS(Long-term support长期支持版本)的事情。1. 新的发布周期这个就可以...

2019-10-17 15:47:27 12761

原创 OpenJDK11与Spring Cloud Finchley的不兼容问题与解决

本文的环境:OpenJDK 11.0.4,Spring Cloud finchley SR4,Spring Boot 2.0.3最近遇到了一个问题,在feign调用的时候,时常会出现这样一个奇怪的错误:2019-10-07 08:00:00.620 ERROR [xxx,e1ba4c7540954aa3,871b99c4576d42e3] [24] [XNIO-2 task-286][xx...

2019-10-07 17:37:58 4397

原创 OpenJDK8升级到OpenJDK11需要注意的修改与异常

目前,JDK两个长期版本是8和11,由于大部分项目使用的还是8,所以从8升级到11会遇到一些困难。本篇文章会基于实践遇到的问题,分类总结可能1. Java模块化从Java 9开始,由于引入了JPMS(https://openjdk.java.net/projects/jigsaw/spec/),开始更精细化的包管理和模块复用,导致很多JDK默认加载的包被移除了。其中我们可能会碰到的例如:...

2019-09-11 12:26:23 9554

原创 JDK核心JAVA源码解析(7)- 集合相关(1) - LinkedList

想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中集合类LinkedList进行分析,通过代码解释Java中的Fail-fast设计思想,以及LinkedList底层实现和与ArrayList对比下的就业场景。本文会...

2019-09-04 18:33:56 4633

原创 Spring cloud实现FeignClient指定Zone调用

本文基于Spring Cloud Fincheley SR3背景介绍目前项目多个区域多个集群,这些集群共用同一个Eureka集群。通过设置eureka.instance.metadata-map.zone设置不同实例所属的zone,zone之间不互相调用,只有zone内部调用(其实这里用zone做了集群隔离,实际上集群肯定是跨可用区的,这里的eureka中的zone在我们项目里面并不是可用...

2019-06-13 15:52:05 8896 4

原创 Spring Cloud Finchley OpenFeign的重试配置相关的坑

如题,本文基于Spring Cloud Finchley.SR2OpenFeign的重试OpenFeign配置重试后,逻辑分析对比Daltson和Finchley的基本组件,发现Ribbon还有Hystrix的重试逻辑基本没变,feign编程openfeign之后,增加了个重试逻辑,我们用下面这个图来展示其中的逻辑:首先搞清楚调用链:可以总结如下:OpenFeign有自己的重试...

2019-04-24 12:30:53 9379 4

原创 Ribbon的AvailabilityFilteringRule的坑(Spring Cloud Finchley.SR2)

如题,本文基于Spring Cloud Finchley.SR2我们项目配置了AvailabilityFilteringRule作为所有Ribbon调用的负载均衡规则,它有那些坑呢(理解歧义和注意点)?首先来看源码,核心是choose方法:public Server choose(Object key) { int count = 0; //通过轮询选择一个server...

2019-04-24 12:04:12 14422

原创 分布式缓存存储算法与实践思考

最近遇到一个问题,可能很多人也遇到过:由于业务量的增长,缓存节点个数不够用了。现在的Redis-Cluster直接就加个节点就解决了,但是之前Redis-Cluster不稳定时,我们并不敢用这个,而是通过自己实现分布式缓存Redis实现,在遇到这个问题时,碰到不少麻烦。由于我们分片算法很简单,直接用户id的哈希值对节点个数取余。假设原来是3,现在是4,那么至少有1-(3/4*3)=四分之三的数据...

2019-04-12 11:40:18 1344

原创 大数据级新闻去重实现 - 1.在线实时方案

最近针对爬虫爬下来的新闻进行去重。这个去重要考虑很多方面:不同网站发布的要点新闻,基本上是有通稿的,内容大同小异,基本一致,有些细节不同,需要去掉重复的,保留质量最好的。去重对比的时间跨度是多大呢?可能刚开始我们会考虑搜索整个库,每篇文章都对比,但是这样会效率太差了,没有必要。新闻有发布时间,以新闻发布时间前后一周为时间段, 对比这个时间段内的新闻即可。发布的新闻可能有很类似的,例如一个新...

2019-02-25 16:58:59 2774

原创 BookKeeper全解(1)-BookKeeper简介和快速上手

什么是BookKeeperBookKeeper是一个提供日志条目流存储持久化的服务框架。特别适合日志流存储,一个比较经典的应用是作为消息队列Pulsar的持久框架。那么BookKeeper是怎样产生的呢?这个灵感来源于Hadoop生态系统。我们知道,Haddop生态系统的文件存储是HDFS,HDFS包含一种节点叫做NameNode,用于记录所有的操作,在宕机的时候可以通过这些记录进行恢复。...

2018-10-16 16:06:44 12633 2

原创 Redis系列-生产应用篇-分布式锁(5)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-原子锁类

Redisson单进程Redis分布式悲观锁的使用与实现本文基于Redisson 3.7.54. 原子锁类Redisson中实现了两种原子锁类:RAtomicLong和RAtomicDouble,还有RLongAdder和RDoubleAdderRAtomicDouble和RAtomicLong其实一样的,RLongAdder和RDoubleAdder其实原理也是一样的,这里我们只说R...

2018-09-19 10:43:58 4286

原创 JDK核心JAVA源码解析(6) - 原子类AtomicLong与LongAdder对比

想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中的原子类以及JDK1.8新增的LongAdder进行对比,探究它们的原理以及为何LongAdder在多线程环境下比较快。本文基于JDK 1.8性能对比:测试程...

2018-09-18 14:10:42 8297 18

原创 Redis系列-生产应用篇-分布式锁(4)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-读写锁

Redisson单进程Redis分布式悲观锁的使用与实现 本文基于Redisson 3.7.53. 读写锁Redisson的分布式可重入读写锁RReadWriteLock Java对象实现了java.util.concurrent.locks.ReadWriteLock接口。同时还支持自动过期解锁。该对象允许同时有多个读取锁,但是最多只能有一个写锁。写锁是排它锁,获取写锁的时...

2018-09-13 19:43:38 4711

原创 Redis系列-生产应用篇-分布式锁(3)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-公平锁

Redisson单进程Redis分布式悲观锁的使用与实现 本文基于Redisson 3.7.52. 公平锁这种锁的使用方式和Java本身框架中的FairLock一模一样:RLock fairLock = redisson.getFairLock("testLock");try{ // 最常见的使用方法 fairLock.lock();

2018-09-11 20:34:09 4774

原创 Redis系列-生产应用篇-分布式锁(2)-单进程Redis分布式锁的Java实现(Redisson使用与底层实现)-可重入锁

Redisson单进程Redis分布式悲观锁的使用与实现 本文基于Redisson 3.7.51. 可重入锁(Reentrant Lock)这种锁的使用方式和Java本身框架中的Reentrant Lock一模一样RLock lock = redisson.getLock("testLock");try{ // 1. 最常见的使用方法 //lock....

2018-09-05 16:22:35 5665

原创 Redis系列-生产应用篇-分布式锁(1)-单进程Redis分布式锁实现思路

什么是分布式锁针对共享内存模型的程序(例如JAVA程序),锁就是一个非常常用的机制。 一般简单分为悲观锁和乐观锁。悲观锁就是你获取这块数据的锁之后,别人就无法访问或操作这块数据,直到你释放这个锁。乐观锁一般就是CAS更新。 在单进程内内存的锁,只控制进程内数据的,就是非分布式锁。相反的,跨进程,需要锁住多个进程访问数据的锁就是分布式锁。 悲观锁一般由Redis的SETNX实现,乐观锁一般...

2018-09-03 17:12:25 4249

原创 JDK核心JAVA源码解析(5) - JAVA File MMAP原理解析

想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对JAVA中的MMAP的文件映射读写机制,来分析为何很多告诉框架用了这个机制,以及这个机制好在哪里,快在哪里。 本文基于JDK 1.8JAVA File MMA...

2018-07-20 12:14:14 5549 2

原创 JDK核心JAVA源码解析(4) - 堆外内存、零拷贝、DirectByteBuffer以及针对于NIO中的FileChannel的思考

想写这个系列很久了,对自己也是个总结与提高。原来在学JAVA时,那些JAVA入门书籍会告诉你一些规律还有法则,但是用的时候我们一般很难想起来,因为我们用的少并且不知道为什么。知其所以然方能印象深刻并学以致用。本篇文章针对堆外内存与DirectBuffer进行深入分析,了解Java对于堆外内存处理的机制,为下一篇文件IO做好准备Java堆栈内存与堆外内存首先我们扔出一个公式:...

2018-07-17 17:05:18 14773 26

空空如也

张哈希的留言板

发表于 2020-01-02 最后回复 2020-01-17

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人 TA的粉丝

提示
确定要删除当前文章?
取消 删除