Exception和Error
1、比Exception和Error,另外,运行时异常与一般异常有什么区别?Exception和Error都是继承了Throwable类,在Java中只有Throwable类型的实例才可以被抛出(throw)或者捕获(catch),它是异常处理机制的基本组成类型。 Exception和Error体现了Java平台设计者对不同异常情况的分类。Exception是程序正常运行中,可以预料的意外情况,可能并且应该被捕获,进行相应处理。 Error是指在正常情况下,不大可能出现的情况,绝大部分的Error都会导致程序(比如JVM自身)处于非正常的、不可恢复状态。既然是非正常情况,所以不便于也不需要捕获,常见的比如OutOfMemoryError之类,都是Error的子类。 Exception又分为可检查(checked)异常和不检查(unchecked)异常,可检查异常在源代码里必须显式地进行捕获处理,这是编译期检查的一部分。前面我介绍的不可查的Error,是Throwable不是Exception。 不检查异常就是所谓的运行时异常,类似...
NoClassDefFoundError和ClassNotFoundException
1、前言在写Java程序的时候,当一个类找不到的时候,JVM有时候会抛出 ClassNotFoundException 异常,而有时候又会抛出 NoClassDefFoundError。看两个异常的字面意思,好像都是类找不到,但是JVM为什么要用两个异常去区分类找不到的情况呢?这个两个异常有什么不同的地方呢? 2、ClassNotFoundExceptionClassNotFoundException 是一个运行时异常。从类继承层次上来看,ClassNotFoundException 是从 Exception 继承的,所以 ClassNotFoundException 是一个检查异常。 当应用程序运行的过程中尝试使用类加载器去加载Class文件的时候,如果没有在 classpath 中查找到指定的类,就会抛出 ClassNotFoundException 。一般情况下,当我们使用Class.forName()或ClassLoader.loadClass()或ClassLoader.findSystemClass()在运行时加载类的时候,如果类没有被找到,那么就会导致JVM抛出...
JVM配置参数
机器配置:8核16G 1、启动参数1234567891011121314151617181920212223242526272829303132333435VM Arguments: jvm_args: -Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8 -Djava.io.tmpdir=/tmp -Djava.net.preferIPv6Addresses=false -Xss512k -Xmx12g -Xms12g -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -XX:+AlwaysPreTouch -XX:ReservedCodeCacheSize=240m -XX:+HeapDumpOnOutOfMemoryError -XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:InitiatingHeapOccupancyPercent=40 -XX:MaxGCPauseMillis=100 -XX:+TieredCompilation...
Redis数据结构-Hash
1、Redis的hash结构简介Redis使用**一个全局Hash表来保存所有的键值对具体值的指针(*key, *value...
Reactor模型
单线程Reactor模式一个线程:单线程:建立连接(Acceptor)、监听accept、read、write事件(Reactor)、处理事件(Handler)都只用一个单线程。 多线程Reactor模式一个线程 + 一个线程池:单线程:建立连接(Acceptor)和 监听accept、read、write事件(Reactor),复用一个线程。工作线程池:处理事件(Handler),由一个工作线程池来执行业务逻辑,包括数据就绪后,用户态的数据读写。 主从Reactor模式三个线程池:主线程池:建立连接(Acceptor),并且将accept事件注册到从线程池。从线程池:监听accept、read、write事件(Reactor),包括等待数据就绪时,内核态的数据I读写。工作线程池:处理事件(Handler),由一个工作线程池来执行业务逻辑,包括数据就绪后,用户态的数据读写 具体的可以参考并发大神 doug lea 关于Reactor的文章。...
RadixTree优劣
RadixTree优势 本质上是前缀树,所以存储有「公共前缀」的数据时,比 B+ 树、跳表节省内存 没有公共前缀的数据项,压缩存储,value 用 listpack 存储,也可以节省内存 查询复杂度是 O(K),只与「目标长度」有关,与总数据量无关 这种数据结构也经常用在搜索引擎提示、文字自动补全等场景 RadixTree不足 如果数据集公共前缀较少,会导致内存占用多 增删节点需要处理其它节点的「分裂、合并」,跳表只需调整前后指针即可 B+ 树、跳表范围查询友好,直接遍历链表即可,Radix Tree 需遍历树结构 实现难度高比 B+ 树、跳表复杂 Redis中 Stream 在存消息时,推荐使用默认自动生成的「时间戳+序号」作为消息 ID,不建议自己指定消息 ID,这样才能发挥 Radix Tree 公共前缀的优势。 每种数据结构都是在面对不同问题场景下,才被设计出来的,结合各自场景中的数据特点,使用优势最大的数据结构才是正解。
Collection集合
1、Java 为什么要有集合?首先,java 是一门面向对象语言,操作对象是我们的日常。既然操作就需要有东西把对象存储起来。于是容器就应运而生,初学者接触到的第一个容器就是数组,但这远远不够,根据不同的对象以及不同的业务,我们需要用到不同的容器。比如,不想要重复对象,我们就会想到用 set 容器,想要对象有序我们会用 List 。不管是 List、Set。他们都会有共性, 而 java 就根据这些共性,给我们提供了 Collection 集合。 2、Collection接口框架图 由上面的 Collection 接口框架图,我们可以知道 Collection 是 List、Set、Queue 的父接口,看到这里,你们可能会问,Map 哪去了?其实,Java 中的容器,包括 Collection 和 Map ,Map 是另外一个体系。 3、Collection的方法 Collection 接口定义了以上待实现的方法。比如: size() 计算容器长度 isEmpty() 是否为空 contains() 是否包含某个对象 containsAll()...
Lambda表达式(三)
1、如何使用 lambda表达式1.1 构造器引用12345678910111213141516public class ConstructMethodExample { public static void main(String [] args) { // 构造方法方法引用--无参数(可以使用方法引用) Supplier<Method> supplier = Method::new; System.out.println(supplier.get()); // 等价于 Supplier<Method> supplier2 = () -> new Method(); System.out.println(supplier2.get()); // 构造方法方法引用--有参数 Function<String, Method> uf = name -> new Method(name); ...
Lambda表达式(一)
1、什么是lambda表达式Java8 是我们使用最广泛的稳定 Java 版本,lambda 就是其中最引人瞩目的新特性。lambda 是一种闭包,它允许把函数当做参数来使用,是面向函数式编程的思想,可以使代码看起来更加简洁。是不是听得一脸懵逼?我举个栗子你就明白了。 烂掉牙的例子,在没有 lambda 时候,我们是这样写的: 123456789101112// 内部类写法public class InnerClassMain { public static void main(String[] args) { //匿名内部类写法 new Thread(new Runnable() { @Override public void run() { System.out.println("内部类写法"); } }).start(); ...
Redis数据结构-SDS
1、Redis设计SDS的背景 优化C语言char* 字符数组的不足 操作效率低:获取长度需遍历,O(N)复杂度 二进制不安全:无法存储包含 \0 的数据(char* 数组用’\0’ 表述字符串结束 ) 2、SDS数据结构SDS 结构中记录了字符数组 使用的长度和分配的空间大小,避免了对字符串的遍历操作,可以直接获取到字符串的长度len,降低了操作开销 (空间换时间) 123456struct __attribute__ ((__packed__)) sdshdr8 { uint8_t len; /* 字符数组现有长度(uint8_t 是8位无符号整形,占用1字节)*/ uint8_t alloc; /* 字符数组的已分配空间,不包括结构体和0结束字符*/ unsigned char flags; /* SDS类型*/ char buf[]; /*字符数组*/}; flags表示SDS的类型,一共有5种类型 sdshdr5(已废弃)、sdshdr8、sdshdr16、sdshdr32、sdshdr64,...