Loading...
高性能进程缓存caffeine简介缓存是一个很好的增加查询速度的解决方案,也就是用空间换时间,通常本机缓存可选方案有多种:ConcurrentHashMap/HashMap: 利用HashMap作为缓存方案,有点是JDK原生支持,缺点是没有淘汰策略与过期机制,需要自己实现。GuavaCache: Google实现的一套本地缓存方案,有超时机制,使用简单。caffeine: 在设计上参考了G...
Centos7多服务器挂载同一文件系统服务器端配置安装nfsrpm -qa |grep nfs yum install nfs-utils修改配置编辑或新建配置文件,添加要共享的客户端地址vi /etc/exports/opt/share 192.168.50.18(rw,no_root_squash) /opt/share 192.168.50.19(rw,no_root_squash) ...
NIO中FileChannel如何读取数据传统IO读取数据的字节是放在byte数组中的,而NIO引入了ByteBuffer的概念,它相当于一个缓冲区,用以替代传统的byte数组。它有两种实现方式,一种是HeapByteBuffer,另一种是DirectByteBuffer。其中HeapByteBuffer底层维护的依然是一个byte数组,也就是说,读取到的数据也会被复制到堆内存中,而Dire...
java垃圾回收器以及jvm调优什么是垃圾程序的运行需要申请内存,在C语言中,有malloc与free,C++中有new与析构函数,它们都需要手动回收内存,这样就经常出现问题,比如说忘记回收了,就会造成内存泄漏,或者回收了多次,造成非法访问。java则放弃了手动回收,引入了GC(Garbage Collector)的概念,我们new出一个对象,当没有强引用指向它时,就会被识别成垃圾,GC会负...
java运行时数据区与常用指令Runtime Data AreaProgram CounterPC(程序计数器),记录下一条指令的地址,虚拟机通过PC获取下一条指令运行,并改变PC的值。PC是线程独有的,Cpu会切换线程执行任务,为了保证准确记录各个线程的字节码执行位置,会给每个线程分配一个独有的PC。JVM Stack虚拟机栈,里面存放一个一个的栈帧(frame),每个方法对应一个栈帧,虚...
java对象的内存布局对象的创建过程类加载loading双亲委派linkingVerification验证文件是否符合jvm规范Preparation静态成员变量赋默认值Resolution将类、方法、属性等符号引用解析为直接引用 常量池中的各种符号引用解析为指针、偏移量等内存地址的直接引用Initializing调用类初始化代码 <clinit>,给静态成员变量赋初始值对象创建...
volatile关键字与内存屏障硬件层数据一致性如图,储存器的层次结构是一个金字塔形,越向上的速度越快成本越高,向下则反之。cpu处理计算时,需要从下层将数据load到高级的缓存中,增加处理速度,但是L1与L2缓存为每个cpu独占,多个cpu之间有可能造成数据不同步,在多核CPU中,L1、L2缓存为每个核心独有,L3为多核心共享。早期的cpu为了解决这个问题,采用总线锁的方式,cpu可以发出...
认识Disruptor并发编程框架介绍主页:http://lmax-exchange.github.io/disruptor/源码:https://github.com/LMAX-Exchange/disruptorGettingStarted: https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Startedapi: http:...
JMH测试工具入门什么是JMH官网: http://openjdk.java.net/projects/code-tools/jmh/创建JMH测试maven依赖<!-- https://mvnrepository.com/artifact/org.openjdk.jmh/jmh-core --> <dependency> <groupI...
ThreadPoolExecutor源码解析常用变量的解释// 1. `ctl`,可以看做一个int类型的数字,高3位表示线程池状态,低29位表示worker数量 private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0)); // 2. `COUNT_BITS`,`Integer.SIZE`为32,所以`COU...