摘要:
Throwable 是 Java 语言中所有错误与异常的超类。 Throwable 包含两个子类:Error(错误)和 Exception(异常),它们通常用于指示发生了异常情况。 Throwable 包含了其线程创建时线程执行堆栈的快照,它提供了 printStackTrace() 等接口用于获取
阅读全文
posted @ 2024-07-20 00:56
Duancf
阅读(24)
推荐(0)
摘要:
Class对象 class对象通常存放在方法区 在程序运行期间,Java运行时系统始终为所有对象维护一个运行时类型标识。这个信息会跟踪每个对象所属的类。虚拟机利用运行时类型信息选择要执行的正确的方法。不过,可以使用一个特殊的Java类访问这些信息。保存这些信息的类名为Class,这个名字有些让人困惑
阅读全文
posted @ 2024-07-19 19:13
Duancf
阅读(130)
推荐(0)
摘要:
[深入理解Java虚拟机]class文件
阅读全文
posted @ 2024-07-19 16:55
Duancf
阅读(18)
推荐(0)
摘要:
说起垃圾收集(Garbage Collection,下文简称GC),有不少人把这项技术当作Java语言的伴生产物。事实上,垃圾收集的历史远远比Java久远,在1960年诞生于麻省理工学院的Lisp是第一门开始使用内存动态分配和垃圾收集技术的语言。当Lisp还在胚胎时期时,其作者John McCart
阅读全文
posted @ 2024-07-18 23:53
Duancf
阅读(47)
推荐(0)
摘要:
HotSpot的算法细节实现 3.2、3.3节从理论原理上介绍了常见的对象存活判定算法和垃圾收集算法,Java虚拟机实现这些算法时,必须对算法的执行效率有严格的考量,才能保证虚拟机高效运行。本章设置这部分内容主要是为了稍后介绍各款垃圾收集器时做前置知识铺垫,如果读者对这部分内容感到枯燥或者疑惑,不妨
阅读全文
posted @ 2024-07-18 23:52
Duancf
阅读(52)
推荐(0)
摘要:
字典是 Redis 服务器中出现最为频繁的复合型数据结构,除了 hash 结构的数据会用到字典(dict)外,整个Redis 数据库的所有 key 和 value 也组成了一个全局字典还有带过期时间的 key 集合也是一个字典。zset 集合中存储 value 和 score 值的映射关系也是通过字
阅读全文
posted @ 2024-07-18 19:29
Duancf
阅读(119)
推荐(0)
摘要:
数据库和缓存如何保证一致性? 阿旺登陆到了服务器,经过一番排查后,确认服务器的性能瓶颈是在数据库。 这好办,给服务器加上 Redis,让其作为数据库的缓存。 这样,在客户端请求数据时,如果能在缓存中命中数据,那就查询缓存,不用在去查询数据库,从而减轻数据库的压力,提高服务器的性能。 先更新数据库,还
阅读全文
posted @ 2024-07-18 18:43
Duancf
阅读(59)
推荐(0)
摘要:
next-key lock 参考资料1 这一节我们通过实验验证next-key-lock在各种情况下的表现: 在唯一索引上的等值查询 我们利用主键展现这一特性 命中记录 下面我们来解释这张图发生了什么, 会话A 会话B 1 开启事务 开启事务 2 快照读整张表,查到所有数据 3 对id为10的数据进
阅读全文
posted @ 2024-07-17 20:00
Duancf
阅读(153)
推荐(0)
摘要:
共享锁 排他锁 表锁 行锁 意向锁 意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。 当有事务A有行锁时,MySQL会自动为该表添加意向锁,事务B如果想申请整个表的写锁,那么不需要遍历每一行判断是否存在行锁,而直接判断是否存在意向锁,增强性能。 悲观锁 乐观锁 间隙锁 间隙
阅读全文
posted @ 2024-07-16 21:18
Duancf
阅读(38)
推荐(0)
摘要:
冒泡排序 直接插入排序 选择排序 快速排序 归并排序 希尔排序 堆排序 桶排序 时间复杂度:快希以nlog2n的速度归堆 稳定性:考研情绪不稳定,快些选一堆好友 归并排序 原理 归并排序的原理是这样的,比如一开始我们有数组[9,6,3,2,5,8,7,4,1,0] 然后我们开始平分并递归 [9,6,
阅读全文
posted @ 2024-07-16 17:24
Duancf
阅读(18)
推荐(0)
摘要:
进程 进程、线程、协程的概念 进程:是并发执行的程序在执行过程中分配和管理资源的基本单位,是一个动态概念,竞争计算机系统资源的基本单位。 线程:是进程的一个执行单元,是进程内的调度实体。比进程更小的独立运行的基本单位。线程也被称为轻量级进程。 协程:是一种比线程更加轻量级的存在。一个线程也可以拥有多
阅读全文
posted @ 2024-07-16 15:40
Duancf
阅读(34)
推荐(0)
摘要:
HashMap 数据结构 HashMap是:数组+链表/红黑树(JDK1.8增加了红黑树部分) 数据底层具体存储的是Node<k,v> 这样的存储方式有什么优点呢? // 默认初始容量(数组默认大小):16,2的整数次方 static final int DEFAULT_INITIAL_CAPACI
阅读全文
posted @ 2024-07-15 22:43
Duancf
阅读(50)
推荐(0)
摘要:
状态转换 Java语言定义了6种线程状态,在任意一个时间点中,一个线程只能有且只有其中的一种状态,并且可以通过特定的方法在不同状态之间转换。这6种状态分别是: 新建(New):创建后尚未启动的线程处于这种状态, 运行(Runnable):包括操作系统线程状态中的Running和Ready,也就是处于
阅读全文
posted @ 2024-07-15 20:42
Duancf
阅读(24)
推荐(0)
摘要:
sleep()、wait()、join()、yield() yield 在Java中,yield() 是一个Thread类的静态方法,它用于暂停当前线程并允许其他线程运行。它是一种线程调度的建议,告诉调度器可以切换到其他就绪状态的线程。调用yield()方法后,线程会从运行状态转换为就绪状态,让其他
阅读全文
posted @ 2024-07-14 22:32
Duancf
阅读(35)
推荐(0)
摘要:
线程 你可能已经很熟悉多任务(multitasking),这是操作系统的一种能力,看起来可以在同一时刻运行多个程序。例如,在编辑或下载邮件的同时可以打印文件。如今,人们往往都有多CPU的计算机,但是,并发执行的进程数目并不受限于CPU数目。操作系统会为每个进程分配CPU时间片,给人并行处理的感觉。多
阅读全文
posted @ 2024-07-14 21:42
Duancf
阅读(46)
推荐(0)
摘要:
可重入锁 ReentrantLock 锁对象 为什么需要锁对象 因为我们不希望有些操作被打断,例如在银行取钱的程序中,线程A正在从账户中取钱,他会进行三个操作, 读取账户金额100, 在自己的工作内存中对账户金额-100, 把0写回账户金额, 但是在第1,2步中间被线程B打断,线程B执行同样的操作,
阅读全文
posted @ 2024-07-14 21:05
Duancf
阅读(29)
推荐(0)
摘要:
Java与协程 在Java时代的早期,Java语言抽象出来隐藏了各种操作系统线程差异性的统一线程接口,这曾经是它区别于其他编程语言的一大优势。在此基础上,涌现过无数多线程的应用与框架,譬如在网页访问时,HTTP请求可以直接与Servlet API中的一条处理线程绑定在一起,以“一对一服务”的方式处理
阅读全文
posted @ 2024-07-14 21:03
Duancf
阅读(61)
推荐(0)
摘要:
OutOfMemoryError异常
阅读全文
posted @ 2024-07-14 20:56
Duancf
阅读(29)
推荐(0)
摘要:
对象的创建 Java是一门面向对象的编程语言,Java程序运行过程中时时刻刻都有对象被创建出来。在语言层面上,创建对象通常(例外:复制、反序列化)仅仅是一个new关键字而已,而在虚拟机中,对象(文中讨论的对象限于普通Java对象,不包括数组和Class对象等)的创建又是怎样一个过程呢? 当Java虚
阅读全文
posted @ 2024-07-14 20:55
Duancf
阅读(65)
推荐(0)
摘要:
数据类型和底层结构的对应 数据的存储模型 string list hash set Zset
阅读全文
posted @ 2024-07-13 19:34
Duancf
阅读(16)
推荐(0)
posted @ 2024-07-13 19:33
Duancf
阅读(15)
推荐(0)
摘要:
Redis 5.0 版本又引入了一个新的数据结构 listpack,它是对 ziplist 结构的改进版,在存储空间上会更加节省,而且结构上也比 ziplist 更精简。listpack 的整体形式和 ziplist还是比较接近的,如果你认真阅读了 ziplist 的内部结构分析,那么对于 1ist
阅读全文
posted @ 2024-07-13 19:33
Duancf
阅读(118)
推荐(0)
摘要:
quicklist Redis早期版本存储list列表数据结构使用的是压缩列表ziplist 和普通的双向链表linkedlist,也就是说当元素少时用ziplist,当元素多时用linkedlist。 //链表的节点 struct listNode<T>{ listNode* prev; list
阅读全文
posted @ 2024-07-13 19:33
Duancf
阅读(52)
推荐(0)
摘要:
Redis 为了节约内存空间使用,zset 和 hash 容器对象在元素个数较少的时候,采用压缩列表(ziplist)进行存储。压缩列表是一块连续的内存空间,元素之间紧挨着存储,没有任何冗余空隙。 >zadd programmings 1.0 go 2.0 python 3.0 java (inte
阅读全文
posted @ 2024-07-13 18:36
Duancf
阅读(126)
推荐(0)
摘要:
为什么需要分布式锁 现在大多数的项目都是由分布式架构所搭建起来的,常常会采用集群以及部署在多台服务器上等方式运行,想必现在nginx的反向代理、负载均衡已经无人不知无人不晓了吧。由于通过用户不同的电脑已经不同的浏览器进行访问项目,就会由nginx转发给集群中的项目实例,此时常用的锁由于跨服务器的原因
阅读全文
posted @ 2024-07-13 18:36
Duancf
阅读(46)
推荐(0)
摘要:
SDS Redis 中的字符串是可以修改的字符串,在内存中它是以字节数组的形式存在的。我们知道 C 语言里面的字符串标准形式是以 NULL(即 0x\0)作为结束符,但是在Redis 里面,字符串不是这么表示的。因为要获取以 NULL 结尾的字符串的长度使用的是 strlen 标准库函数,这个函数的
阅读全文
posted @ 2024-07-13 15:43
Duancf
阅读(39)
推荐(0)
摘要:
(请注意redis在rdb持久化(bgsave)和重写aof(bgrewriteaof)的时候创建子线程) Redis 是个单线程程序!这点必须铭记。也许你会怀疑高并发的 Redis 中间件怎么可能是单线程。很抱歉,它就是单线程,你的怀疑暴露了你基础知识的不足。莫要瞧不起单线程,除了Redis 之外
阅读全文
posted @ 2024-07-13 15:43
Duancf
阅读(24)
推荐(0)
摘要:
finally 中的代码一定会执行吗 通常在面试中,只要是疑问句一般答案都是"否定"的,因为如果是"确定"和"正常"的,那面试官就没有必要再问了。 典型回答 正常运行的情况下,finally 中的代码是一定会执行的,但是,如果遇到以下异常情况,那么 finally 中的代码就不会继续执行了: 程序在
阅读全文
posted @ 2024-07-12 21:38
Duancf
阅读(57)
推荐(0)
摘要:
这个问题我看网上有人做了实验,是in的效率会比or高 去查了官方文档 expr IN (value,...) Returns 1 (true) if expr is equal to any of the values in the IN() list, else returns 0 (false)
阅读全文
posted @ 2024-07-12 19:43
Duancf
阅读(18)
推荐(0)
摘要:
线程安全与锁优化 在软件业发展的初期,程序编写都是以算法为核心的,程序员会把数据和过程分别作为独立的部分来考虑,数据代表问题空间中的客体,程序代码则用于处理这些数据,这种思维方式直接站在计算机的角度去抽象问题和解决问题,被称为面向过程的编程思想。与此相对,面向对象的编程思想则站在现实世界的角度去抽象
阅读全文
posted @ 2024-07-12 16:56
Duancf
阅读(79)
推荐(0)
摘要:
类加载 加载 java数据类型分为基本数据类型和引用数据类型, 基本数据类型由虚拟机预先定义,引用数据类型才需要类的加载过程。 类的加载,就是将java类的字节码文件加载到内存中,并通过字节码在内存中构建出类的原型 类模板对象。 jvm把字节码中的常量池,类字段,类方法等信息存储到类模板中,这样jv
阅读全文
posted @ 2024-07-12 16:52
Duancf
阅读(21)
推荐(0)
摘要:
引用类型 无论是通过引用计数法判断对象引用数量,还是通过可达性分析法判断对象的引用链是否可达,判定对象的存活都与“引用”有关。 JDK1.2 之前,Java 中引用的定义很传统:如果 reference 类型的数据存储的数值代表的是另一块内存的起始地址,就称这块内存代表一个引用。 JDK1.2 以后
阅读全文
posted @ 2024-07-12 16:49
Duancf
阅读(74)
推荐(0)
摘要:
MySQL 的数据都是存在磁盘中的,那么我们要更新一条记录的时候,得先要从磁盘读取该记录,然后在内存中修改这条记录。那修改完这条记录是选择直接写回到磁盘,还是选择缓存起来呢? 当然是缓存起来好,这样下次有查询语句命中了这条记录,直接读取缓存中的记录,就不需要从磁盘获取数据了。 为此,Innodb 存
阅读全文
posted @ 2024-07-12 16:31
Duancf
阅读(36)
推荐(0)
摘要:
隔离级别 下面介绍四种因为事务的并发产生的问题: 脏写 假设银行账户中有100元, 有事务A,B A事务把余额改为200,但还未提交 这时,B事务把余额改为300,提交, 如果A发生了回滚,那么账户余额回到100元,事务B无效。 脏写就是已经提交的事务的写操作因为另一个还未提交的事务的回滚而失去效果
阅读全文
posted @ 2024-07-12 15:49
Duancf
阅读(37)
推荐(0)
摘要:
重传机制 TCP 实现可靠传输的方式之一,是通过序列号与确认应答。在 TCP 中,当发送端的数据到达接收主机时,接收端主机会返回一个确认应答消息,表示已收到消息。 但在错综复杂的网络,并不一定能如上图那么顺利能正常的数据传输,万一数据在传输过程中丢失了呢? 所以 TCP 针对数据包丢失的情况,会用重
阅读全文
posted @ 2024-07-12 15:36
Duancf
阅读(68)
推荐(0)
摘要:
1.子类与父类的加载过程,静态方法重写,静态代码块 2.Java中sync阻塞与可重入是怎么实现的,轻量级锁这么可重入,重量级锁维护了wait set 3.sync锁升级,AQS 4.用户态,内核态 5.wait与sleep,调用后操作系统发生了什么,sleep是怎样唤醒的 6.concurrent
阅读全文
posted @ 2024-07-12 14:42
Duancf
阅读(60)
推荐(0)
posted @ 2024-07-12 14:23
Duancf
阅读(6)
推荐(0)
posted @ 2024-07-12 14:23
Duancf
阅读(8)
推荐(0)
摘要:
Java中的对象一定是在堆上分配的吗? JVM的内存分配策略 首先回顾一下JVM的内存分配策略。 JVM的内存包括方法区、堆、虚拟机栈、本地方法栈、程序计数器。 一般情况下JVM运行时的数据都是存在栈和堆上的。 栈用来存放一些基本变量和对象的引用,堆用来存放数组和对象,也就是说new出来的实例。 但
阅读全文
posted @ 2024-07-12 14:16
Duancf
阅读(40)
推荐(0)
摘要:
运行时数据区域Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 JDK 1.8 和之前的版本略有不同,我们这里以 JDK 1.7 和 JDK 1.8 这两个版本为例介绍。 JDK 1.7: JDK 1.8: 线程私有的: 程序计数器 虚拟机栈 本地方法栈 线
阅读全文
posted @ 2024-07-11 21:19
Duancf
阅读(32)
推荐(0)