0%

最早了解Hash的用法,是一次分表的经历,公司用户表数据有几千万,查询的效率已经比较低了,需要做拆分处理,之前系统中已经有分表的数据,处理方式比较简单,没有使用中间件,按照商家的ID(32位字符串)做Hash然后取模,算出其落在表的编号,然后加上前缀得到最终表名。

最近在了解zk分布式锁时,为了避免一种实现方式的羊群效应,其改进思路类似一致性哈希算法。于是,便看了下Hash相关的知识,并用Java做了简单实现。

阅读全文 »

之前探讨过一次JAVA的FinalReference,这次我们来看下java.lang.ref包下对应的其他三种引用。

走近引用

Reference和ReferenceQueue在使用中一定是结伴出现的,当一个Reference确定要被GC回收,GC便会把Reference加入到与之关联的ReferenceQueue中。注意:在Reference的构造方法中,我们可以传入一个注册队列ReferenceQueue,这个队列我们稍后会具体看,需要主要的是,这个队列需要单独的线程去做消费,否则会存在OOM的隐患。

这些引用可用来实现不同的缓存类型(内存敏感和内存不敏感),大名鼎鼎的Guava cache就是基于引用的这些特性来实现高速本地缓存。

阅读全文 »

JAVA FinalReference

引入

使用MAT分析dump出的内存时,常会看到java.lang.ref.Finalizer占用内存也不小,比较纳闷我们在编程中并没有用到这个东西,为什么他会出现并且占用分量不算小的一部分内存呢?

1
2
3
4
final class Finalizer extends FinalReference {
private static ReferenceQueue queue = new ReferenceQueue();
//... ...
}

结合它的数据结构基本可以看出来,Finalizer中持有一个一个引用队列。猜测是这个队列吃掉了那些内存。
阅读全文 »

MAT Memory Analyzer Tool 基本使用

简介

分析和理解我们应用中内存的分布是一件极具挑战的事情。一个逻辑错误就有可能导致OutOfMemory。dump内存的方式很单:jmap -dump:format=b,file=path pid
注意操作时要有正确的用户权限。本篇旨在介绍分析中涉及到的一些概念和操作方法,实际案例分析放在下篇介绍。

内存泄漏指由于疏忽或错误造成程序未能释放已经不再使用的内存。内存泄漏并非指内存在物理上的消失,而是应用程序分配某段内存后,由于设计错误,导致在释放该段内存之前就失去了对该段内存的控制,从而造成了内存的浪费。

Histogram

阅读全文 »

Dubbo SPI

SPI 全称为 (Service Provider Interface) ,JDK也默认提供了SPI的一种实现,不过对比Dubbo的实现,JDK的实现就非常简单。

简单说下JDK默认的SPI用法。

  1. 定义Service接口
  2. 增加Service实现类
  3. META-INF/services目录下建立以接口包全名命名的文件,文件中写入实现类的包名+类名
  4. 用Java提供的ServiceLoader来加载实现
    阅读全文 »

服务器Load飙高排查方法

线上碰到CPU利用率高或者Load高的时候,排查的顺序。

  1. 拿到进程PID:ps -ef | grep java 或者 jps
  2. dump应用栈信息:jstack PID > PID.stack
  3. top查看导致高CPU的进程: top 后键入 x 默认按照CPU使用率排序进程,键入c可看到commond
  4. 查看导致高CPU利用率的线程信息:top -Hp PID
  5. 查看CPU利用率高线程的栈信息,stack文件中线程号为16进制,需要top出来的线程号进行转换:printf ‘%x\n’ ThreadPID
    阅读全文 »

AbstractQueueSynchronizer笔记

在开始介绍之前我先来简单理解一下为什么会产生AQS。在我们应用内不可避免的会发生对一些资源的抢占,那么如何处理线程之间对资源的争夺呢?在Java SE 5 之前JDK可以使用synchronized来串行化对资源的操作,synchronized可以隐式的获取和释放锁,但是带来的不便就是不够灵活,可扩展性没有显式获取和释放锁的自主控制性强,另外synchronized是完全互斥的,没法达到诸如共享锁、读写锁的效果。对资源的竞争可以抽象为对变量状态的竞争,这正是AQS实现的基本原理,当然,AQS的实现是复杂的。

阅读全文 »

记一次test4j导致CPU飙高的事故

在使用Jenkins构建工程时出现服务器Load不断飙升的现象,导致构建无法正常进行,查看构建日之后发现一些应用处出现OOM的状况。
于是,我就开始查找原因的漫漫长征路。

阅读全文 »

AOP是spring中重要的一个组件,今天看了下AOP代理生成的过程,做了简单的记录,留作日后查看。

spring在完成对bean的装配后,在暴露到工厂前,会对进行实例化。

阅读全文 »

最近项目中发现对Spring中的Autowired和JSR-250 定义的Resource认知还是比较模糊,网上的大多的解释也比较笼统,没能解释清楚我的疑问,于是自己动手,丰衣足食,总结如下。

阅读全文 »