- 博客(243)
- 资源 (13)
- 收藏
- 关注
原创 【笔记】Spring 技术解密:Spring MVC 与 Web 环境
概述过去比较流行的 SSH 技术架构,也就是 Struts + Spring + Hibernate 技术组合,它们是 Web 应用开发中最常用的技术架构之一。这个技术架构是以 Struts 作为 Web 框架来帮助应用构建 UI,Spring 作为应用层平台,Hibernate 作为 O/R 映射的数据持久化层实现。虽然 SSH 组合中的 Web 层框架是由 Struts 来完成的,但 ...
2018-08-21 23:13:58 870
原创 Jackson 处理 Map key 为对象的情况
当使用 jackson 序列化 Map< ObjectA, ObjectB> 对象时,ObjectA 默认会以 toString 的方式来序列化,而在反序列化时,则会直接失败。这个问题,该如何解决呢?jackson 提供额外的接口供我们扩展,网上以 2.x 版本为例的解决方案很多,1.x 的比较少,这里主要说 1.x 版本的解决方案。在 jackson 里提供了 JsonSer...
2018-08-14 15:45:35 5340 1
原创 模块级别自动化测试的经验与教训
模块级别自动化测试的经验与教训概述原理经历的坑本地缓存的 dump 问题性能问题静态方法、随机数问题带异步任务的请求结束时间判断问题代码规范问题总结参考资料模块级别自动化测试的经验与教训概述搞了几个月的自动化测试,结果不甚理想,这里做一个简单的总结。为什么要做自动化测试呢?因为手工测试效率低,找 case、执行 case 太费时间。为...
2018-06-18 16:57:28 3787 6
原创 自动内存管理的艺术【笔记】
自动内存管理的艺术引言标记-清扫回收概述三色抽象位图标记懒惰清扫标记-整理回收概述局限性复制式回收引用计数法分代垃圾回收概述时间测量弱分代假说分代与堆布局多分代年龄记录分代间指针自动内存管理的艺术引言存活性是一个全局特征,但是调用 free 函数将对象释放却是局部行为,所以如何将对象正确地释放是一个复杂的问题。...
2018-06-02 12:09:53 905
原创 消息队列 RocketMQ 设计学习
消息队列 RocketMQ 设计学习概述一个消息队列的实现需要关注哪些问题点?需要实现哪些功能?先说最通用的功能,任何系统都需要考虑的功能:系统结构高可用高性能再说,MQ 特有的功能:Message OrderAt Least Once消息查询消息堆积能力事务定时消息回溯消费物理部署结构如上图所示, RocketMQ的部署结构有以下特点:...
2018-05-21 14:40:54 1017
原创 分布式事务解决方案总结
分布式事务两阶段提交协议Paxos 算法本地消息表TCC 事务Saga 模式阿里的分布式事务处理方案 GTS参考资料分布式事务两阶段提交协议两阶段提交协议是用来处理分布式事务的。在分布式系统中,每个节点虽然可以知晓自己的操作时成功或者失败,却无法知道其他节点的操作的成功或失败。当一个事务跨越多个节点时,为了保持事务的ACID特性,需要引入一个作为协调者...
2018-03-13 17:20:24 1061
原创 DirectByteBuffer 里的堆外内存何时释放?
DirectByteBuffer 里的堆外内存何时释放?简要答案DirectByteBuffer 在分配堆外内存时:先要通过 Bits.reserveMemory 来看看是否还有可用的内存,是否达到了堆外内存的上限?有的话,占坑。通过 unsafe.allocateMemory 分配内存。创建 Cleaner,这个 Cleaner 就是用来管理堆外内存的。Cleaner 继承...
2018-03-11 22:14:07 1808
原创 利用 Java Agent 和 Instrument 技术录制线上流量
利用 Java Agent 和 Instrument 技术录制线上流量Java Instrument 技术遇到的难题自动打包依赖ClassNotFound 问题HttpServletRequest body 只能 get 一次利用 Java Agent 和 Instrument 技术录制线上流量在做性能压测的时候,需要先准备好压测请求数据,可以采用人工制造的方式
2018-02-04 11:06:17 2231
原创 性能优化案例(一):通过修改路由算法提升系统性能
性能优化案例一通过修改路由算法提升系统性能概述系统结构优化方法优化效果性能优化案例(一):通过修改路由算法提升系统性能概述一般性能优化方法有两种:一是,从代码层面优化,提升某个方法的性能,从而提升单机性能;二是,从系统结构层面优化,通过减少无用功,来减少资源消耗。这里,我们写一个用第二种方法优化性能的例子。系统结构首先,说一下最初的系统结构。我们有一
2018-02-03 19:25:30 1342
原创 Netty 权威指南笔记(八):EventLoopGroup 和线程模型
一般情况下,I/O 复用机制需要事件分发器(event dispatcher)。 事件分发器的作用,即将那些读写事件源分发给各读写事件的处理者,就像送快递的在楼下喊: 谁谁谁的快递到了, 快来拿吧!开发人员在开始的时候需要在分发器那里注册感兴趣的事件,并提供相应的处理者(event handler),或者是回调函数;事件分发器在适当的时候,会将请求的事件分发给这些handler或者回调函数。
2017-11-16 23:51:22 5334
原创 Netty 权威指南笔记(七):ChannelPipeline 和 ChannelHandler 源码分析
Netty 的 ChannelPipeline 和 ChannelHandler 机制类似于 Servlet 和 Filter 过滤器,这类拦截器实际上是职责链模式的一种变形,主要是为了方便事件的拦截和用户业务逻辑的定制。Servlet Filter 过滤器提供了一种面向对象的模块化机制,用来将公共人物封装到可插入的组件中。这些组件通过 Web 部署配置文件(web.xml)进行声明,无须改动代码即可添加和删除过
2017-11-07 14:14:33 5722
原创 Netty 权威指南笔记(六):Channel 解读
JDK 的 NIO 类库中,提供了 SocketChannel 和 ServerSocketChannel 用于非阻塞 I/O 操作。类似于 NIO 的 Channel,Netty 提供了自己的 Channel 和其子类实现。
2017-11-06 09:48:35 2092
原创 Netty 权威指南笔记(五):ByteBuf 源码解读
Java 本身提供了 ByteBuffer 类,为什么 Netty 还要搞一个 ByteBuf 类呢?因为 ByteBuffer 类有着许多缺点:1. ByteBuffer 长度固定,无法动态伸缩。2. ByteBuffer 只有一个位置指针 position,读写的时候需要手工调用 flip 和 rewind 方法进行模式转换,操作繁琐,容易出错。3. 功能太少,缺少一些高级特性。
2017-11-03 14:04:10 1489
原创 Netty 权威指南笔记(四):架构剖析
对 Netty 的架构进行剖析,学习其设计,便于在今后的架构设计中,设计出高性能、高可靠、可扩展的产品。
2017-11-02 12:54:04 668
原创 Netty 权威指南笔记(三):TCP 粘包和拆包
TCP 是一个“流”协议,所谓“流”就是没有界限的一串数据。大家可以想像河流里的水,期间并没有分界线。TCP 底层并不了解上层业务数据的具体含义,它会根据 TCP 缓冲区的实际情况进行包的划分。所以,在业务上,一个完整的包可能会被 TCP 拆分成多个包进行发送,也有可能把多个小的包,封装成一个大的数据包发送,这就是所谓的 TCP 粘包和拆包问题。
2017-11-01 15:33:07 633
原创 《深入理解 Java 内存模型》笔记总结
简单的说,内存模型描述了某个程序的可能行为。内存模型包含一组规则,规定了一个线程的写操作何时对另一个线程可见。在程序行为满足这些规则的情况下,JVM 可以自由地进行代码转换,比如重排序和非必要的同步移除,代码转换往往是为了提升性能。
2017-10-31 10:29:14 469
原创 Netty 权威指南笔记(二):Java NIO 和 Netty 对比
Netty 是业界流行的 NIO 框架之一,它的健壮性、功能、性能、可定制性和可扩展性在同类框架中都说首屈一指的,也已经得到了成百上千商用项目的验证。Netty 框架都有什么优点呢?1. API 使用简单,开发门槛低。2. 功能强大,预置多种编解码功能,支持多种主流协议。3. 定制能力强,可以通过 ChannelHandler 对通信框架灵活扩展。4. 性能高。5. 成熟稳定,社区活跃,已经修复了 Jav
2017-10-30 15:29:22 13681 1
原创 Netty 权威指南笔记(一):网络 I/O 模型和 Java NIO 入门
网络 I/O 模型和 Java NIO 入门Java I/O 模型的实现离不开底层操作系统的支持,所以这里先讲一下 Linux 网络 I/O 模型。Linux 网络 I/O 模型简介同步阻塞 I/O 模型最常见的模型是
2017-10-29 15:58:30 2142
原创 Spring 框架学习(四):AOP
Aspect 是一种新的模块化机制,用来描述分散在对象、类或函数中的横切关注点。从关注点中分离出横切关注点是面向切面的程序设计的核心概念。分离关注点使得解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑代码中不再含有针对特定领域问题代码的调用,业务领域同特定领域问题的关系通过切面来封装、维护,这样原本分散在整个应用程序中的变动就可以很好地管理起来。
2017-10-26 15:09:37 409
原创 Spring 框架学习(三):IoC 容器
IoC 容器的核心是依赖反转模式。许多应用都是由两个或多个类通过彼此的合作来实现业务逻辑的,这是的每个对象都需要与其合作对象的引用。如果这个获取过程要靠自己实现,那将导致代码高度耦合并且难以测试。在 Spring 中通过把依赖对象的获取交给 IoC 容器来完成,在解耦代码的同时提高了代码的可测试性。
2017-10-25 11:15:25 540
原创 Spring 框架学习(二):Spring 应用配置文件讲解
初学 Spring 的时候,只是照猫画虎,对于每一项配置的由来并不十分了解。这里,我们深入了解一下,这些配置都起到了什么作用?
2017-10-22 10:29:12 373
原创 Spring 框架学习(一):设计理念、整体架构
总结一下,Spring 的设计理念是:1. IoC 控制反转:降低了对象之前的耦合关系,简化了应用的开发。2. AOP 面向切面编程:方便以动态的、非侵入的方式,增强服务的功能。3. 面向接口编程:作为平台,核心功能之外服务,都可以选择不同的技术实现。
2017-10-20 14:21:39 1105
原创 Java 并发框架 Disruptor 源码分析:RingBuffer
Disruptor 是一个高性能的线程间通信库。它来自于 LMAX 对并发、性能和非阻塞算法的研究,如今交易系统基础架构的核心部分。这里,我们围绕其基础数据结构 RingBuffer,深入源码学习一下其实现。
2017-10-17 20:05:08 2951
原创 Effective Java 读书笔记(十):序列化
谨慎地实现 Serializable 接口考虑使用自定义的序列化形式保护性地编写 readObject 方法对于实例控制枚举类型优先于 readResolve考虑用序列化代理代替序列化实例
2017-10-16 16:00:19 390
原创 Effective Java 读书笔记(六):方法
检查参数的有效性必要时进行保护性拷贝谨慎设计方法签名慎用重载慎用可变参数返回零长度的数组和集合而不是 null为所有导出的 API 元素编写文档注释
2017-10-15 19:53:47 338
原创 Effective Java 读书笔记(三):类和接口
使类和成员的可访问性最小化在公有类中使用访问方法而非公有域使可变性最小化复合优先于继承要么为继承而设计并提供文档说明要么禁止继承接口优于抽象类接口只用于定义类型类层次优于标签类用函数对象表示策略
2017-10-14 19:41:33 537 1
原创 Effective Java 读书笔记(四):泛型
请不要在新代码中使用原生态类型消除编译时的非受检警告列表 List 优先于数组优先考虑泛型优先考虑泛型方法利用有限制通配符来提升 API 的灵活性优先考虑类型安全的异构容器
2017-10-13 16:04:34 425
原创 Effective Java 读书笔记(七):通用程序设计
将局部变量的作用域最小化for-each 循环优于传统的 for 循环了解和使用类库如果需要精确的答案请避免使用 float 和 double基本类型优于装箱基本类型如果其他类型更合适则尽量避免使用字符串当心字符串连接的性能通过接口引用对象接口优先于反射机制谨慎地使用本地方法谨慎地进行优化遵循普遍接受的命名惯例
2017-10-12 20:04:01 365
原创 Effective Java 读书笔记(五):枚举和注解
用 enum 代替 int 常量用实例域代替序数用 EnumSet 代替位域使用 EnumMap 代替序数索引用接口模拟可伸缩的枚举注解优先于命名模式坚持使用 Override 注解用标记接口定义类型
2017-10-10 20:17:16 582
原创 Effective Java 读书笔记(八):异常
只针对异常情况才使用异常对于可恢复的情况使用受检异常对于编程错误使用运行时异常避免不必要地使用受检异常优先使用标准的异常抛出与抽象相对应的异常每个方法抛出的异常都要有文档在细节消息中包含造成异常的信息努力使失败保持原子性不要忽略异常
2017-10-09 11:32:00 372
原创 Effective Java 读书笔记(九):并发
同步访问共享的可变数据避免过度同步使用线程池管理线程不要手动 new 线程并发工具优先于 wait 和 notify线程安全性的文档化慎用延迟初始化不要依赖于线程调度器避免使用线程组 ThreadGroup
2017-10-01 16:32:23 395
原创 Effective Java 读书笔记(二):对于所有对象都通用的方法
Effective Java 读书笔记二对于所有对象都通用的方法覆盖 equals 时要遵守的约定覆盖 equals 的时候总是覆盖 hashCode始终要覆盖 toString谨慎覆盖 clone考虑实现 Comparable 接口
2017-09-30 16:13:53 449
原创 Effective Java 读书笔记(一):创建和销毁对象
考虑用静态工厂方法代替构造器构造器参数较多时考虑用 Builder 构建用私有构造器或枚举类型强化 Singleton 属性在私有构造器里抛异常来强化不可实例化的能力避免创建不必要的对象消除过期的引用避免使用终结方法 finalize
2017-09-29 17:44:22 479
原创 Java 日志框架解析:设计模式、性能
在平常的系统开发中,日志起到了重要的作用,日志写得好对于线上问题追踪有着很大的帮助。一个好的日志框架,既要方便易用,也要有较好的性能,减少日志输出对系统内存、CPU 的影响。研究一款开源项目,学到的不仅仅是这个项目本身,还会学到很多设计思想,可以利用到日常工作中。
2017-09-28 10:00:54 5502
原创 Java 进阶:异常影响性能吗?
Java 进阶:异常影响性能吗?曾经在给一个业务系统增加限流功能,使用的限流组件在流量超过阈值时,会直接抛异常,异常导致 CPU 占用率飙升。第一次遇到这样的情况,让我们不得不思考,异常怎么会对性能造成这么大的影响?下面我们写几个测试程序观察一下。
2017-09-24 10:31:26 10785 1
原创 深入理解 Java 泛型:类型擦除、通配符、运行时参数类型获取
泛型的本质是参数化类型,相比于直接使用 Object 的好处是:编译期强类型检查、无需进行显式类型转换。这里介绍一些泛型的用法、特性,以及如何在运行时获取泛型参数类型信息。
2017-09-21 10:00:58 3384
原创 Java 迭代器介绍
迭代器介绍迭代器模式迭代器模式是一个典型的设计模式,提供一种方法访问一个容器对象中各个元素,而又不暴露该对象的内部细节。因为屏蔽了细节,可以针对不同实现的容器,提供一致的标准化的访问方法。
2017-09-18 14:46:01 920
原创 Java 注解:注解处理器获取泛型真实类型
注解 annotation 是 Java 中的一大特性,是插入代码中的元数据。注解的使用能够大大简化代码的编写,所以在很多框架中得到了使用,比如 spring、hibernate-validator。泛型的真实类型信息会在编译期间擦除,注解处理器正是运行在编译期间,能够用来获取泛型真实信息。
2017-09-17 16:30:31 6136
原创 降级熔断框架 Hystrix 源码解析:滑动窗口统计
一个滑动窗口统计主要分为两步:1. bucket 统计,bucket 的大小决定了滑动窗口滚动时间间隔;2. window 统计,window 的时长决定了包含的 bucket 的数目。Hystrix 实现滑动窗口利用了 RxJava 这个响应式函数编程框架。
2017-09-14 11:25:09 8559 2
Virtual Machines Versatile Platforms for Systems and Processes
2017-10-13
修改代码的艺术 中文版
2017-09-23
Netty5.0 架构剖析和源码解读
2017-09-18
matlab 7.0 在数字信号处理中的应用
2010-04-03
Linux Command Directory
2009-10-28
Win32help.exe
2009-10-16
新编windows32 api参考大全
2009-10-16
Standard C Library c++ STL
2009-09-26
GNU.C++.for.Linux
2009-09-02
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人