- 博客(22)
- 收藏
- 关注
原创 @Transactional注解回滚失效问题
首先,@Transactional注解常见的几个失效原因:1. 抛出了checked异常:需要指定(rollbackFor=Exception.class)解决2. 注解标注的方法不是public3. 数据表(Mysql) 不是innodb引擎4. 同类非public方法调用注解方法5. 未配置<tx:annotation-driven transaction-manag...
2020-03-11 10:34:27
903
原创 20200308_分布式缓存Redis
缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 ...
2020-03-08 18:22:52
142
转载 20200223_Caffeine缓存
Caffeine是一个高性能的本地缓存,相比Guava缓存的性能更加优秀,接近于最优。值得一提的是,Caffeine缓存的api于Guava基本一致,熟悉Guava的同学可以无缝切换。Caffeine的设计十分精妙,有几个点:近似统计LFU的算法Count-Min Sketch。 借鉴了kafka的时间轮调度。 数据结构采取了Ringbuffer。这几个点可以深入去学习:https:...
2020-02-23 15:38:24
153
原创 20200214_Disruptor框架
Disruptor是一个高性能的并发队列,三个特性保障了它的高效性:1. CAS乐观锁: 利用CAS(compare and swap) 乐观锁代替了重量级的lock锁, 提升了性能。2. 消除伪共享 伪共享是计算机的CPU缓存导致的。现在的计算机的CPU缓存一般是以行的形式来保存,一行大概是64个字节。java中一个Long是8个字节,所以一行能存8个Long。但是这...
2020-02-23 15:19:13
119
原创 20200203_本地缓存_GuavaCache原理
Guava Cache原理类似ConcurrentHashMap,支持多线程安全的本地缓存。Guava Cache也加入了自己的特性,当从缓存里查询不到所查询的key时,就执行用户自定义的操作去获取值,并增添至缓存。同时可以防止多线程重复加载,只会有一个线程进入load方法,而其他线程则等待,直到缓存值被生成。这个听起来似乎是一种很危险的操作啊!不用担心,Guava还提供了另一种缓存策略,缓存...
2020-02-03 21:51:44
456
原创 20191116_ThreadLocal源码解析
ThreadLocal是用来存储线程的本地数据的。ThreadLocal的设计算是十分巧妙的。每一个线程Thread持有ThreadLocalMap, ThreadLocalMap是ThreadLocal下的一个内部静态类。ThreadLocalMap并没有继承Map, 而是持有了一个Entry[]的table。Entry的key是ThreadLocal (弱引用), value是存储的值。...
2019-11-16 15:52:17
116
转载 20191028_字节码加强
美团技术博客:https://tech.meituan.com/2019/09/05/java-bytecode-enhancement.html
2019-10-28 11:42:37
121
原创 20191027_java_Class文件
class文件是一组以8位字节为基础的二进制流。ClassFile { u4 magic; // 魔法数字,表明当前文件是.class文件,固定0xCAFEBABE u2 minor_version; // 分别为Class文件的副版本和主版本 u2 major_version; u2 constant_pool_count; // 常量池计数 cp...
2019-10-27 13:10:16
167
原创 20191501_ClassLoader源码解析
/* * A class loader is an object that is responsible for loading classes. The * class <tt>ClassLoader</tt> is an abstract class. Given the <a * href="#name">binary name</a>...
2019-10-20 15:05:40
96
原创 20191020_java类加载器机制
双亲加载机制JDK提供了几种默认的ClassLoader:Bootstrap ClassLoader使用c++编写,负责加载$JAVA_HOME中jre/lib/rt.jar里所有的class。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。Extensions ClassLoader负责加载JRE的扩展目录,li...
2019-10-20 15:01:21
97
原创 20190829_netty底层架构总结
一个EventLoopGroup当中包含多个EventLoop.一个EventLoop在它的生命周期当中只有唯一一个Thread进行绑定。启用EventLoop所处理的各种I/O事件都将在它所关联的那个Thread上进行处理。一个Channel在它的生命周期当中只会注册在一个EventLoop上。一个EventLoop在运行过程中,会被分配给一个或多个channel.在Netty中,...
2019-08-29 20:58:23
153
原创 20190829Netty 源码分析
首先来了解一些概念:EventLoop: IO 线程 EventLoop。EventExecutor: 实际上就是继承了ScheduledExecutorService,区别在于重新定义了一些Netty自己定义的关于Future的接口。EventExecutorGroup: 一个EventExecutorGroup 包含一个或者多个 EventExecutor。EventLoopGro...
2019-08-29 20:57:10
139
原创 20190826_Netty ByteBuf与NIO ByteBuffer
Netty中使用了ByteBuf作为数据容器,它相对于NIO的ByteBuffer做了不少改进。下面我们分别对它们进行介绍。ByteBufferNIO为New IO, 区别于传统的Java IO。 Java Io 最核心的概念是流(stream),是面向流的编程。 java的流要么是输入流,要么是输出流,不可能同时包含两个。而java nio 有3个核心的概念。 selector, chan...
2019-08-26 23:31:40
291
原创 20190826_Netty 零拷贝
普通io操作(读到写)4次上下文切换,4次拷贝零拷贝:2次上下文切换, 2次拷贝零拷贝优化(直接读到socket)2次上下文切换,1次拷贝内存映射文件首先,“映射”这个词,就和数学课上说的“一一映射”是一个意思,就是建立一种一一对应关系,在这里主要是只 硬盘上文件 的位置与进程 逻辑地址空间中 一块大小相同的区域之间的一一对应,如图1中过程1所示。这种对应关系纯属是逻辑上的概...
2019-08-26 23:30:04
125
原创 20190825_Netty Reactor模式
Reactor模式翻译为反应器模式。Netty整体架构是Reactor模式的完整体现。参考Doug Lea这篇著名的论文模式角色Handle(句柄或描述符):本质上表现一个资源,是有操作系统提供的;该资源表示一个个的事件,比如文件描述符,或是针对网络编程里的socket描述符。既可以来自外部,也可以来自内部;外部事件比如客户端的连接请求,客户端发来数据等;内部事件比如操作系统产生的定时...
2019-08-25 15:52:35
124
原创 20190825_Netty简介
Netty定义Netty官网的第一句话就对Netty有了一个清晰的定义:Netty is an asynchronous event-driven network applicationframework.Netty是以异步事件驱动的网络框架。Netty之所以高效,主要来自于它是如何实现异步事件驱动的:其 I/O 模型和线程处理模型,前者决定如何收发数据,后者决定如何处理数据。Net...
2019-08-25 14:45:14
139
转载 20180915_Hive
由于 Hive 采用了 SQL 的查询语言 HQL,因此很容易将 Hive 理解为数据库。其实 从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处。 数据库可以用在 Online 的应用中,但是 Hive 是为数据仓库而设计的,清楚这一点,有助于从应用角度理解 Hive 的特性。 一、Hive是一个基于Hadoop的数据仓库平台。通过hive,我们可以方便地进行ETL的工...
2018-09-15 09:06:18
306
原创 20171204_ConcurrentLinkedQueue源码的一些问题
今天在看ConcurrentLinkedList的1.8源码,结合网上的一些博客,发现有一些地方有坑,不是太好理解,就写下来总结一下吧。 首先,ConcurrentLinkedList是一个并发容器,它的并发性是通过CAS来实现的,这是实现非阻塞并发算法的基础。然后,head/tail 并非总是指向队列的头 / 尾节点,也就是说允许队列处于不一致状态,这个特性把入队 / 出队时,原本需要一起原子化
2017-12-04 20:58:06
243
转载 20171021_python内存回收机制
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!看到一篇不错的文章,转了。语言的内存管理是语言设计的一个重要方面。它是决定语言性能的重要因素。无论是C语言的手工管理,还是Java的垃圾回收,都成为语言最重要的特征。这里以Python语言为例子,说明一门动态类型的、面向对象的语言的内存管理方式。 对象的内存使用 ##赋值语句是语言最
2017-10-21 10:14:25
264
转载 20171001_链接原理
链接器必须对这些可重定位目标文件完成两个主要任务:符号解析。将每个符号引用刚好和一个符号定义联系起来。重定位。链接器把每个符号定义与一个虚拟地址联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储位置,从而重定位这些节。符号分为四类: 导出符号(export,本地符号), 导入符号(import,外部符号), 静态符号(本地符号), 局部符号(本地符号,不出现在符号表中)。
2017-10-01 20:29:27
364
原创 20171001_Alfred介绍和一些workflow推荐
尽管MacOS下自带的Spotlight已经是一款非常高效率的软件了,但是被称为神器的Alfred有过之无不及。 Alfred 的名字可能是因为作者是蝙蝠侠迷吧(^_^ 笑),下面简单介绍一下Alfred并且给出一些workflow推荐和下载地址。 Alfred 是一个用键盘通过热键、关键字、自定义插件来加快操作效率的工具,它不但是搜索工具,还是快速启动工具,甚至能够操作许多系统功能
2017-10-01 18:52:09
2659
原创 20170930 编译型语言和解释型语言
我们平时使用的高级语言无法直接被计算机识别,计算机要想识别并运行高级语言,必须将高级语言翻译成机器码。“翻译”的方式有两种,一种为编译,一种为解释,二者的主要区别是翻译的时机不同。下面分别对编译型语言和解释型语言作出介绍以及二者的优劣势。
2017-09-30 09:47:36
253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人