SDS Strings http://www.redis.cn/commands.html#string Redis在实现时选择并没有去选择传统的C字符串 而是选择了 SDS Simple Dynamic String 在Redis里C字符串只会作为一个字符串字面量,多用于一些无需对字符串进行修改的地方,比如打印日志等 但是Redis需要的并不仅仅是一个字面量的字符串,而是一个可以被修改值的字符串,这时候便用上了 SDS redis> SET msg "hello world" # 此时键…
SDS Strings http://www.redis.cn/commands.html#string Redis在实现时选择并没有去选择传统的C字符串 而是选择了 SDS Simple Dynamic String 在Redis里C字符串只会作为一个字符串字面量,多用于一些无需对字符串进行修改的地方,比如打印日志等 但是Redis需要的并不仅仅是一个字面量的字符串,而是一个可以被修改值的字符串,这时候便用上了 SDS redis> SET msg "hello world" # 此时键…
CMS 低延迟 并发执行 在JDK 1.5 时期,Hotspot推出了一款在强交互应用 中几乎可认为有划时代意义的垃圾收集器:CMS(Concurrent-Mark-Sweep)收集器,这款收集器是HotSpot虚拟机中第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程同时工作. CMS收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间. 停顿时间越短(低延迟)就越适合与用户进行交互,良好的响应速度能够提升用户体验 目前很大一部分的Java应用几乎都在互联网网站以及B/S系统的服务器上,这类…
Serial 串行回收 Serial收集器是最基本、历史最悠久的垃圾收集器了 Serial收集器作为HotSpot中Client模式下的默认新生代垃圾收集器. Serial收集器采用复制算法、串行回收和 STW 机制的方式执行内存回收. 除了年轻代之外,Serial收集器还提供了用于执行老年代垃圾收集的 Serial Old 收集器. Serial Old收集器同样使用了串行回收和 STW 机制,只不过内存回收算法使用的是标记-压缩算法. Serial Old是运行在Client模式下默认的老年代的垃圾回收器 Se…
ParNew并行回收 新生代 在JDK9 中已经被移除了. 对于新生代,回收次数频繁,使用并行方式高效. 对于老年代,回收次数少,使用串行方式节省资源(CPU并行需要切换线程,串行可以省去线程切换的开销) 由于ParNew收集器时基于并行回收,但也并不是说ParNew收集器回收效率在任何场景下都会比Serial收集器更高效 ParNew 收集器运行在多CPU的环境下,由于可以充分利用多CPU、多核心等物理硬件资源优势,可以更快速地完成垃圾收集,提升程序的吞吐量 但是在单个CPU的环境下,ParNew收集器不比Ser…
垃圾回收器 Garbage Collectors 具体算法的落地实现. 概述 JVM并没有在垃圾收集器中进行过多的规定,可以有不同的厂商、不同的版本的JVM来实现. 由于JDK的版本处于高速 迭代过程中,因此Java发展至今已经衍生了众多的GC版本. 从不同角度分析垃圾收集器,可以将GC分为不同的类型. Java不同版本的新特性. 语法层面:Lambda表达式、switch、自动装箱、自动拆箱、enum... API层面:Stream API、新的日期时间、Optional、String、集合框架 底层优化:JVM…
Parallel Scavenge 回收器 吞吐量优先 Parallel和ParNew底层使用的框架是不同的,各成一派 HotSpot的年轻代中除了拥有ParNew收集器是基于并行回收的以外, Parallel Scavenge收集器同样也采用了复制算法、并行回收和"stop the World"机制。 那么Parallel收集器的出现是否多此一举? 和ParNew收集器不同,Parallel Scavenge收集器的目标则是为了达到一个可控制的吞吐量(Throughput),它也被称为吞吐量优…
AQS 一般称为队列同步器 AQS是用来构建锁和其他同步组件的基础框架,其也是Java三大并发工具(CountDownLatch、CyclicBarrier、Semaphore)的基础,可见其重要性. 通过AQS可以来实现公平锁 AQS的设计与实现中实际上是体现了模板模式的 java.util.concurrent.locks AbstractQueuedSynchronizer,队列同步器 /** * Provides a framework for implementing blocking locks and…
装箱与拆箱 概述 数据类型 包 装 类 字节长度 默 认 值 int Integer 4 0 short Short 2 0 long Long 8 0l或0L byte Byte 1 0 float Float 4 0.0F或0.0f double Double 8 0.0 char Character 2 u0000 boolean Boolean 1 false 概述 自动装箱:实际上是对基本数据类型的一种封装,即意味着有对象的创建,将基本数据类型转为包装器类型. 自动拆箱:将包装器类型转为其对应的基本数据类…
再谈引用 我们希望能够描述这样一类对象:当内存足够时,则能保留在内存中;当内存空间进行垃圾回收后还是很紧张,则可以对某些对象进行回收 JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、和虚引用(Phantom Refernece),这四种引用强度依次减弱 java.lang.ref 强引用 StrongReference 最传统的"引用定义",是指在程序代码之中普…
锁升级 偏向锁 在大多数情况下,锁不仅不存在多线程竞争问题,而且总是由同一线程多次获得 为了让线程获得锁的代价更低,引入了偏向锁 锁会偏向于第一个获得它的线程,会在对象头存储锁偏向的线程ID,以后该线程进入和退出该同步代码块时只需要来检查是否为偏向锁、锁标志位以及线程ID即可 偏向锁在Java1.6之后是默认启用的,但是会在应用程序启动几秒钟之后才激活 可以使用 -XX:BiasedLockingStartupDelay=0关闭延迟,如果确定应用程序中所有锁通常情况下都处于竞争的状态,可以使用-XX:-UseBia…
AtomicInteger 基于CAS来实现线程安全的 public class AtomicInteger extends Number implements java.io.Serializable { private static final long serialVersionUID = 6214790243416807050L; // setup to use Unsafe.compareAndSwapInt for updates private static final Unsafe unsafe =…
COPYRIGHT © 2020 良夜的博客. ALL RIGHTS RESERVED.
This blog has been running:
本站由
This site is protected by wp-copyrightpro.com