自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(264)
  • 资源 (1)
  • 收藏
  • 关注

原创 ZooKeeper 实用硬核分析

(终于迁移完了 iteye 上的文章,可以在这写一点新东西了。)注:此文是基于我的一次技术分享讲座整理的。文章内容顺序大致遵循讲演的顺序,所以部分知识点会穿插提到。可下载附件提供的PPT,结合其中动画更易理解。(附件)目录1. “实用 + 硬核”?2. 先导说明:各种“节点”2.1 应用服务节点2.2 ZooKeeper 数据节点(znode)2.3 ZooKeep...

2020-01-15 09:39:24 946

原创 【序列化】Kryo 的几种常见序列化实现方式,及其兼容性

Kryo 是啥Kryo是Java生态中的一种序列化框架。许多软件组织在使用Dubbo(Dubbox)这套RPC框架时,经常会搭配使用 Kryo 作为其序列化方案。Kryo本身自带了很多针对 Java 原始数据类型 和 JDK常见类型的 序列化实现(如,DefaultSerializers)。它的姐妹工程 Kryo-Serializers 还提供很多额外的序列化实现。Kryo 常见序列化实现方式序列化/反序列化的兼容性问题序列化/反序列化 最主要的是关注对象内容。大多数场景中,我们只会序列化对

2020-06-08 21:12:02 535

原创 Redis 基础简谈

本文主要从使用者的角度介绍Redis 常见基础内容。内容选择偏向实用性。本文会从一些典型应用案例介绍Redis的数据类型和基础命令。然后介绍基础管理与维护的常见注意事项,以及典型集群模式。1. Redis 简介1.1 SQL vs NoSQL此处 “SQL” 通常是指Oracle、MySQL 等传统的 关系型数据库,“NoSQL” 则是指 MongoDB、Cassandra 等 “非关系型”数据库。SQL 和 NoSQL 之间有什么区别呢?是SQL的数据结构化程度高?是NoSQL高性能和..

2020-06-02 12:57:58 104

原创 【误区】软件开发过程中的合作边界:业务架构 vs 技术实现

软件开发过程中会有各种角色的干系人。。。

2020-05-13 23:23:53 271

原创 【坑】分布式锁之误 “解锁”(Redis为例)

基于Redis的分布式锁有各种实现。。。

2020-05-12 10:13:35 214

原创 【Java 8 GC 调优】其它考量点

本节介绍影响GC的其它情况。Finalization 和 弱引用、软引用 及 幻象引用有些应用程序会通过 Finalization 和 弱引用、软引用 及 幻象引用 与 GC 交互。这些特性会在 Java 编程语言级别造成性能问题。一个例子就是 依赖 Finalization 关闭文件描述符。...

2020-03-06 13:35:44 53

原创 【Java 8 GC 调优】G1 调优

此节介绍如何调整和优化G1,以进行评估、分析和性能测试。如《G1》所述,G1 是一个 分区、分“代” 的收集器,这意味着Java对象堆被分成了许多大小相等的区域。JVM启动时会设置区域大小。区域大小取决于堆大小,从 1MB 到 32MB。目标是不超过 2048 个区域。Eden、Survivor 和 老年代 是逻辑集合,且不是连续的。G1 有一个尝试达成的 暂停时长 目标(这是一个软实时目...

2020-02-20 16:28:49 1229

原创 【Java 8 GC 调优】Garbage-First(G1)

G1 是一个 服务器风格(Server-Style)的垃圾收集器。其适用目标是具有大内存的多处理器计算机。它试图在实现高吞吐量的同时,高概率地满足 GC暂停时间 目标。整个堆操作,如 全局标记,与业务线程同时运行。这可以防止 中断的发生概率 与 堆或存活数据大小 成比例。G1 通过几种技术实现了 高性能 和 暂停时间 目标。堆被划分成一些大小相等的区域,每个区域都是一片连续的虚拟内存(vi...

2020-02-19 10:37:57 197

原创 【Java 8 GC 调优】Concurrent Mark Sweep(CMS)

CMS(Concurrent Mark Sweep collector)适合的应用程序是“偏好更短的 GC暂停时间,且能忍受在应用运行期间 GC 分享处理器资源”。其典型的应用特征是,有一些相对较大的 “长寿命”数据,且运行在 2个或更多 处理器的机器上。但是,对于任何有 “低暂停时间” 需求的应用程序,都应该考虑此收集器。可通过命令行选项 -XX:+UseConcMarkSweepGC 来启用...

2020-02-18 14:09:41 596

原创 【分布式ID】【Snowflake变种】用 ZooKeeper 维护 Worker ID

Twitter 推出的 Snowflake 是一个非常实用的分布式ID生成方案。它的默认设置中,各部分信息所占比特位比较有代表性,通常无需二次定制。但是对于 datacenter id 和 worker id 的维护需要各项目自行设计方案。通常,datacenter id 是固定的,一旦为各数据中心分配好ID,几乎不会变更。但各数据中心内部的 worker id 可能会因ID生成服务实例...

2020-01-15 09:16:16 399

原创 【Arthas】运行时调整 Java 程序的 logger 日志级别

生产环境不开启 DEBUG 级别的日志对于部署到生产环境的程序,我们通常会将其日志级别设置为 INFO。DEBUG 级别的日志一般用于排查异常,而且通常数量较多。很少会有程序在生产环境默认开启 DEBUG 级别的日志。一个正常运行的程序,如果短时间内产生了大量日志,那么很可能是 logger 级别设置不正确。我也见过有些程序员有意将本应归为 DEBUG 级别的日志用 INFO 级别记...

2020-01-15 09:16:07 704

原创 【Java 8 GC 调优】并发GC(Mostly Concurrent Collector)

并发GC 之所以称为“并发”,是因为它的很多操作 与 应用程序的业务 是并发关系。注意是“很多操作”而不是“所有操作”。所以提到它时会附带“Mostly”,即“Mostly Concurrent Collectors”。Hotspot JDK 8 中 有 2个 并发GC: CMS(Concurrent Mark Sweep Collector): 适用于需要更短的GC暂停时间,...

2020-01-15 09:15:56 229

原创 【Java 8 GC 调优】并行GC

并行GC,也称为 吞吐量GC,是与 串行GC 类似的 分代GC。其主要区别在于,用多个线程加快垃圾收集速度。可通过命令行选项 -XX:+UseParallelGC 启用 并行GC。默认情况下,使用此选项后,Minor 和 Major GC 都是并行执行,以进一步减少垃圾收集的开销。在具有超过8个硬件线程的机器上,并行GC 会使用固定占比的数量作为GC线程数。硬件线程数较大时,该占比为 ...

2020-01-15 09:15:47 592

原创 【Java 8 GC 调优】有哪些 GC

此节主要与 串行GC 相关。3类 GCHotspot 有 3种 不同类型的 GC,每个 GC 都有不同的性能特征。串行GC串行GC 使用单线程执行所有垃圾回收工作。因为没有线程间通信开销,所以相对而言比较高效。尽管它在多处理器机器上,对小数据集(上限100MB左右)的应用程序很有效,但它最适合单处理器的机器。因为它不能利用多处理器硬件的优势。在某些硬件和操作系统上,串...

2020-01-15 09:15:38 90

原创 【Java 8 GC 调优】确定 “代” 的大小

很多参数会影响 “代” 的大小。下图说明了堆中“已提交空间”和“虚拟空间”之间的区别。JVM 初始化时会为堆预留整个空间。可以通过 -Xmx 选项指定这个预留空间的大小。如果参数 -Xms 的值比 -Xmx 小,那么不会把所有的预留空间都提交给 JVM。这些未提交的空间在图中被标为 “virtual”(虚拟空间)。堆的不同部分(新生代和老年代)可根据需要增长到虚拟空间的极限。某些参数是堆中 一...

2020-01-15 09:15:28 27

原创 【Java 8 GC 调优】“代”(Generation)

Jave SE 平台的一个优点是,它可以保护开发人员不受 内存分配 和 垃圾收集 复杂性的影响。但是当垃圾收集成为主要瓶颈时,了解这个隐藏实现的某些方面是很有用的。GC对应用程序使用对象的方式进行了假设。这些假设可以反映在可调参数中。可以在不牺牲抽象能力的情况下调整这些参数,以提高应用程序的性能。当一个对象不能被程序中的任何指针访问时,会被认为是垃圾。最简单的GC算法会遍历每个可到达的对象。任...

2020-01-15 09:15:08 45

原创 【Maven 插件】为 jar 包添加代码版本信息 —— git-commit-id-plugin

背景在软件包中添加代码版本信息是许多组织使用的管理技巧。这些信息在很多场景中可以发挥重要作用。对于一些尚处于混沌状态的萌芽组织来说,这些信息几乎可以在排障过程中发挥灯塔的作用。组织管理不善会引发很多“人祸”。软件包覆盖版本发布?代码分支管理方法混乱?代码 tag 覆盖打?系统出了问题,不知道软件包是哪个分支、哪次提交构建的?一个真实的项目该项目基于 git 管理代...

2020-01-15 09:14:57 743

原创 【Java 8 GC 调优】Ergonomics

(不知道把 Ergonomics 翻译成什么比较合适。)Ergonomics 是 “JVM” 和 “GC调优” 提高应用程序性能的过程(如,基于行为的调优)。JVM 根据所运行的平台提供了 GC、堆大小、运行时编译器 等方面的默认选择。这些选择符合不同类型应用程序的需求,可减少命令行(参数)调整。此外,基于行为的调优会动态调整堆大小,来满足应用程序的特殊行为。本节介绍这些默认选择和基...

2020-01-14 09:42:18 627

原创 【Java 8 GC 调优】引言

从小型桌面应用到大型服务器上的Web服务,有大量不同种类的应用程序使用了 Java SE 平台。为了支持多种多样的部署,Hotspot 这个 JVM 提供了多个垃圾收集器(GC),它们被设计成满足不同的需求。这是为了同时满足不同大小应用的重要组成部分。Java SE 会根据应用程序所运行的计算机类别,选择最合适的GC。但这可能并不是对每个应用的最优选择。用户,开发者,以及对性能目标有严格要求或有其...

2020-01-14 09:41:59 45

原创 【Java】被废弃的线程方法

原文:《Java Thread Primitive Deprecation》为什么 Thread.stop 被废弃了?Thread.stop不安全。 Stop 一个线程会导致它释放所持有的锁(monitor)。(ThreadDeatch 抛出后会释放 monitor 的锁。) 这可能会导致之前被 monitor 保护的对象处于 不一致的状态,并被其它线程看到。也就是...

2020-01-14 09:41:38 166

原创 MySQL auto_increment 重启后值丢失

相关链接: 《MySQL自增变量auto_increment踩坑,重启后值丢失》 《Be Careful With MySQL's auto_increment. How We Ended Up Losing Data》 《AUTO_INCREMENT Handling in InnoDB》 背景描述与相关链接《Be Careful...》中的案例很类似,某...

2020-01-14 09:41:25 316

原创 Zookeeper 查看 Dubbo 服务列表

黑白名单异常是 Dubbo 服务常见的问题。异常示例:com.alibaba.dubbo.rpc.RpcException: Forbid consumer 10.1.2.3 access service demo.service.DemoService from registry 10.1.2.3:2181 use dubbo version 2.8.4, Please check...

2020-01-14 09:40:11 1134

原创 Netty 引用计数对象

相关链接: 《Reference counted objects》 《Why do we need to manually handle reference counting for Netty ByteBuf if JVM GC is still in place?》 《Are Java DirectByteBuffer wrappers garbage collect...

2020-01-14 09:40:03 47

原创 Java NIO epoll 空转问题 + Netty 解决方法

.在 Java NIO 编程实践中,很多人都会选择 Netty 作为基础框架,而不是直接用 JDK 原生的 NIO API。因为 JDK 原生的 NIO 框架内容过于繁杂、学习成本高、补齐可靠性的工作量和难度都很大、还有一些bug。其中一个著名的bug就是 epoll Selector 空转问题。相关Bug单 《JDK-6670302 : (se) NIO select...

2020-01-14 09:39:53 703

原创 Linux IO 多路复用 之 epoll 与 select/poll 简介

IO 多路复用技术在 Linux IO 编程中,如果需要同时处理多个客户端请求,可以利用 IO多路复用技术,把多个 IO阻塞 复用到同一个 select(系统调用)阻塞上。这样就能达到 单个线程同时处理多个客户端请求 的效果。与传统的多线程方式相比,IO多路复用 可以减少系统开销。因为所需线程少,节省了很多系统资源。IO 复用的关键系统调用文件描述符 —— FD(fil...

2020-01-14 09:39:29 183

原创 Reator 模式 + Netty 线程模型 + 最佳实践建议

Reactor 模式大部分网络框架的设计都基于 Reactor 模式。这种模式基于事件驱动,特别适合处理大量的 IO 事件。根据线程数量,我们可以将 Reactor 模式大致分为以下3种(以服务端实现为例):单线程 Reactor单个 Reactor 线程负责对TCP链路读写数据和编解码(包括执行业务逻辑)。(很多人把该模式称为 “1 - 1”。其实这种称呼并不贴切。...

2020-01-14 09:39:12 92

原创 Netty 简介 - 高性能原理 + 关键组件模型

Netty > java.nio + java.netNetty 是一个 NIO 框架。它的设计强调了“分离关注点”(Separation Of Concerns)。它通过事件机制,将业务逻辑与无关的技术逻辑隔离,通过抽象层填补 基础平台 和 业务开发 之间的鸿沟。Netty 极大地简化了网络编程(如,TCP/UDP socket 服务器)。可以利用它更快速容易地开...

2020-01-14 09:38:53 36

原创 【Dubbo】Dubbo 服务序列化兼容性技巧 —— CompatibleFieldSerializer

序列化兼容技巧 之 指定序列化方式:CompatibleFieldSerializer因为性能出色,Kryo 经常被选为Dubbo服务的序列化方案。在序列化Java对象时,Kryo 默认使用 FieldSerializer 类进行序列化。但为了增强兼容性,我们一般会显式指定使用 CompatibleFieldSerializer。使用方式就是在 API jar 包中的类上...

2020-01-13 16:04:21 333

原创 Spring Bean 作用域

常见的 4 种作用域Spring Bean 的默认作用域是 Singleton。一般通过注解 @Scope 自定义Bean的作用域。 Singleton 整个应用中,只创建一个实例。(默认) ConfigurableBeanFactory.SCOPE_SINGLETON Prototype 每次注入或通过Spring Application Context 获取时,都...

2020-01-13 16:00:33 76

原创 Spring Bean 生命周期 + 循环依赖解决方法

Bean 创建过程自定义的初始化方法通常通过 @Bean 注解的 initMethod 指定(不推荐XML形式的配置方式)。Bean 销毁过程自定义的销毁方法类似自定义的初始化方法。通常通过 @Bean 注解的 destoryMethod 指定(不推荐XML形式的配置方式)。Bean循环依赖解决方法通过构造方法注入依赖 —— 失败...

2020-01-13 15:56:41 89

原创 【Java核心-基础】ConcurrentHashMap 高效地线程安全简介

JDK提供了一些线程安全的集合。有粗粒度 synchronized 的集合。如,Hashtable、Collections.synchronizedXxx 包装的集合。有细粒度,基于分离锁实现的集合。如,ConcurrentHashMap。通常,并发包中提供的容器性能远优于早期的简单同步实现。为什么需要ConcurrentHashMap?HashMap 不是线程安全的。在...

2020-01-13 15:56:37 35

原创 【Java核心-安全基础】编写安全的Java代码

实现安全的Java代码,需要从功能设计到实现细节,都充分考虑可能的安全影响。以消耗系统资源为目的的攻击是很常见的方式。CPU、线程、内存、文件描述符、数据库连接、再入锁等各种资源都可能成为攻击者消耗的目标。常见代码问题数值运算溢出如:Java代码 if(a+b<c){ ... } a+b 可能超出上限。改成 a&...

2020-01-13 15:55:55 47

原创 【SSL证书校验】Java Client 忽略对服务端的SSL证书校验

背景在某些特殊的项目中虽然使用了HTTPS,但其证书管理又不是采用常规模式,如服务端用了个自签名的证书。很多组织的内部项目因为各种原因采用了这种方式。(先不深挖这种模式的利弊)这种情况下,大多数HTTP客户端工具或框架都默认禁止此类证书。为了让客户端忽略SSL证书校验,需要额外的客户端代码设置。实现方式本文针对两种Java常见HTTP客户端请求方式,提供实现样例...

2020-01-13 15:55:44 649

原创 【异常】JVM 获取 Linux 时间错误(相差12小时)

.问题有两台Linux机器:date 命令查看时间相同通过 date 命令查看时间,发现两台机器区域语言和时间都相同:JVM获取系统时间相差12小时通过最基本的java代码 new Date() 获得时间,发现两台机器的系统时间相差12小时。其中一台输出的时区与上述date命令相同,都是东八区(CST,中国标准时间)。另一台输出的时区与date命令不符,是...

2020-01-13 15:55:41 387

原创 【Dubbo】序列化异常—— com.esotericsoftware.kryo.KryoException: Buffer underflow

Dubbo服务通常依赖一个jar包来表示服务签名,其中包含了服务的接口定义。服务的提供者(服务端)需实现这些接口;服务的调用者(客户端)可以通过这些接口调用服务。问题此文提到的异常 “com.esotericsoftware.kryo.KryoException: Buffer underflow” 通常是因为服务端和客户端持有的jar包版本号相同,但实际内容不同,导致序列化异常。...

2020-01-13 15:55:31 1341

原创 【Java核心-安全基础】Java的安全机制

任何可以用来绕过系统安全策略限制的缺陷都是安全漏洞。构建安全可靠的服务需要通过整体性的安全设计和综合性的防范手段。Java的安全机制1. 运行时安全机制字节码校验类加载过程中,字节码验证,防止不合规的代码影响JVM运行或载入恶意代码。如,自行编译String类替换JDK的String类就无法通过类加载。Class Loader 隔离代码 应用无法获...

2020-01-13 15:55:19 96

原创 【Java核心-进阶】运行时动态生成Java类

.技术上可行的方式生成源码文件 -> 编译源码 -> 加载类方式1:javac编译可以用 ProcessBuilder 这个类启动 javac 进程,编译源码文件方式2:Java Compiler API 编译JDK中的 Java Compiler API 提供了与 javac 对等的编译能力。(示例:InMemoryJavaCompiler)...

2020-01-13 15:55:10 192

原创 【Java核心-进阶】类加载

Java类加载的三个阶段《Loading, Linking, and Initializing》加载(Loading)将Java字节码数据读取到JVM中,并映射为 Class 对象。数据源可以是 jar文件、class文件或网络数据源。用户可以实现自己的类加载器来自定义加载过程。链接(Linking)把原始的类定义信息平滑地转化入JVM。分为三个子...

2020-01-12 19:54:26 26

原创 【Java核心-进阶】CAS(compare-and-swap)

CAS简介CAS(compare-and-swap)是一种对数据进行原子性操作的技术。它提供了一系列操作指令用于读取数值,或并发修改。它是Java并发中所谓 “lock-free” 机制的基础。CAS的底层依赖于CPU提供的指令。如,x86 CPU 的 cmpxchgCAS使用方式AtomicIntegerAtomicInteger使用了CAS技术,它底...

2020-01-12 19:54:16 45

原创 【Java核心-进阶】线程池(Executor)

线程池主要类概览ExecutorExecutor的初衷是将 任务提交 和 任务执行的细节 解耦。只有一个提交任务的方法:Java代码 voidexecute(Runnablecommand); ExecutorService虽然我们习惯将ExecutorService称为线程池,但它并不是简单的线程“池”。它提供了比较全面的 线程管理...

2020-01-12 19:47:16 34

ZooKeeper实用分析.pptx

ZooKeeper实用分析。包括基础特性与核心原理分析。 典型案例分析、会话、监视与通知、基础API和高级封装库、客户端故障处理、服务角色、群首选举、多数原则、Zab协议、事务、快照、重配置等。

2020-01-13

空空如也

空空如也

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

TA关注的人 TA的粉丝

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