木西笔记

个人博客

Java8使用@sun.misc.Contended避免伪共享

什么是伪共享 缓存系统中是以缓存行(cache line)为单位存储的。缓存行是2的整数幂个连续字节,一般为32-256个字节。最常见的缓存行大小是64个字节。当多线程修改互相独立的变量时,如果这些变量共享同一个缓存行,就会无意中影响彼此的性能,这就是伪共享。 缓存行上的写竞争是运行在SMP系统中并行线程实现可伸缩性最重要的限制因素。有人将伪共享描述成无声的性能杀手,因为从代码中很难看清楚...

Java类加载机制

Java类加载机制的七个阶段 当我们的Java代码编译完成后,会生成对应的 class 文件。接着我们运行java Demo命令的时候,我们其实是启动了JVM 虚拟机执行 class 字节码文件的内容。而 JVM 虚拟机执行 class 字节码的过程可以分为七个阶段:加载、验证、准备、解析、初始化、使用、卸载。 加载 下面是对于加载过程最为官方的描述。 加载阶段是类加载过程的第一个阶段。在...

Redis系列之数据结构篇(2)

字典

本文转自 redis 的设计与实现 结构 Redis 的 Hash 类型键使用以下两种数据结构作为底层实现: 字典; 压缩列表; 因为压缩列表比字典更节省内存, 所以程序在创建新 Hash 键时, 默认使用压缩列表作为底层实现, 当有需要时, 程序才会将底层实现从压缩列表转换到字典。 Dict哈希表 Redis 字典所使用的哈希表由 dict.h/dictht 结构定义: 12345...

Redis系列之数据结构篇(1)

SDS和链表

概诉 本文转自 redis 的设计与实现 SDS SDS 简介 Redis 没有直接使用 C 语言传统的字符串表示(以空字符结尾的字符数组,以下简称 C 字符串), 而是自己构建了一种名为简单动态字符串(simple dynamic string,SDS)的抽象类型, 并将 SDS 用作 Redis 的默认字符串表示。 举个例子, 如果客户端执行命令: 12redis> SET m...

源码分析系列(2)

为什么禁止在 foreach 循环里进行元素的 remove/add 操作

在阿里巴巴Java开发手册中,有这样一条规定: foreach循环 123for(元素类型t 元素变量x : 遍历对象obj){ 引用了x的java语句; } 以下实例演示了 普通for循环 和 foreach循环使用: 1234567891011121314public static void main(String[] args) { //...

JAVA多线程之AQS分析(1)

ReentrantLock的源码分析独占锁的实现

概述 谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronized(AQS)!,类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock/Semaphore/CountDownLatch…。我们以ReentrantLock作为讲解...

稳定性保证

关于分布式应用程序处理未知峰值的四种方案

我最近参与讨论了很多有关应用程序如何处理高负载的能力,这个为的核心在于如何在,如何在不浪费大量的特定资源的情况下保持程序的稳定性,而这些特定的资源只会流量峰值的时候起作用。 很多应用服务,这样的典型case 十分差常见,例如: 博客应用程序可能会在每次发文后出现峰值。再比如,博客应用程序可能会在每次发布的帖子上出现峰值。 像Groupon或One Kings Lane这样的日交易比较活跃的网...

MQ可以解决哪些实际问题?

消息队列中间件是分布式系统中重要的组件,主要解决应用解耦,异步消息,流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。消息中间件到底该如何使用,何时使用这是一个问题,胡乱地使用消息中间件增加了系统的复杂度,如果用不好消息中间件还不如不用。 1. 消息队列通讯模式 点...

深入理解java泛型

泛型是什么 一说到泛型,大伙肯定不会陌生,我们代码里面有很多类似这样的语句: 1List<T> list=new ArrayList<T> ArrayList就是个泛型类,我们通过设定不同的类型,可以往集合里面存储不同类型的数据类型(而且只能存储设定的数据类型,这是泛型的优势之一)。“泛型”简单的意思就是泛指的类型(参数化类型)。想象下这样的场景:如果我们现在要写一个...

JVM 替换PermGem 为 Meta Space

背景 永久代(PermGen)在哪里? 根据,hotspot jvm结构如下(虚拟机栈和本地方法栈合一起了): 上图引自网络,但有个问题:方法区和heap堆都是线程共享的内存区域。 关于方法区和永久代: 在HotSpot JVM中,这次讨论的**永久代**,就是上图的方法区(JVM规范中称为方法区)。《Java虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。在...