垃圾回收器1. GC 分类与性能指标1. 垃圾回收器概述
垃圾收集器没有在规范中进行过多的规定,可以由不同的厂商、不同版本的JVM来实现。
由于JDK的版本处于高速迭代过程中,因此Java发展至今已经衍生了众多的GC版本。
从不同角度分析垃圾收集器,可以将GC分为不同的类型。
Java不同版本新特性
语法层面:Lambda表达式、switch、自动拆箱装箱、enum、泛型
API层面:Stream API、新的日期时间、Optional、String、集合框架
底层优化:JVM优化、GC的变化、元空间、静态域、字符串常量池等
2. 垃圾回收器分类1. 按线程数分(垃圾回收线程数),可以分为串行垃圾回收器和并行垃圾回收器。
串行回收指的是在同一时间段内只允许有一个CPU用于执行垃圾回收操作,此时工作线程被暂停,直至垃圾收集工作结束。
在诸如单CPU处理器或者较小的应用内存等硬件平台不是特别优越的场合,串行回收器的性能表现可以超过并行回收器和并发回收器。所以,串行回收默认被应用在客户端的Client模式下的JVM中
在并发能力比较强的CPU上,并行回收器产生的停顿时间要 ...
MyCat2
1. Mycat概述如今随着互联网的发展,数据的量级也是成指数的增长,从 GB 到 TB 到 PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候 NoSQL 的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。
但是,在有些场合 NoSQL 一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候 NoSQL 肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储。
1. 基本介绍Mycat是数据库分库分表中间件。
1、数据库中间件
中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。
例子:Tomcat,web中间件。
数据库中间件:连接java应用程序和数据库
2、为什么要用Mycat?
① Java与数据库紧耦合。万一耦合的MySQL DBMS挂了怎么办?
② 高访问量、高并发对数据库的压 ...
索引优化与查询优化都有哪些维度可以进行数据库调优?简言之:
索引失效、没有充分利用到索引 —— 索引建立
关联查询太多JOIN(设计缺陷或不得已的需求) —— SQL优化
服务器调优及各个参数设置(缓冲、线程数等) —— 调整my.cnf
数据过多 —— 分库分表
关于数据库调优的知识点非常分散。不同的DBMS,不同的公司,不同的职位,不同的项目遇到的问题都不尽相同。这里我们分为三个章节进行细致讲解。
虽然SQL查询优化的技术有很多,但是大方向上完全可以分成物理查询优化和逻辑查询优化两大块。
物理查询优化是通过索引和表连接方式等技术来进行优化,这里重点需要掌握索引的使用。
逻辑查询优化就是通过SQL等价变换提升查询效率,直白一点就是说,换一种查询写法执行效率可能更高。
1. 数据准备学员表 插 50万条, 班级表插1万条。
步骤1:建表
1234567891011121314151617CREATE TABLE `class` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `className` VARCHAR(30) DE ...
锁事务的隔离性由这章讲述的锁来实现。
1. 概述锁是计算机协调多个进程或线程并发访问某一资源的机制。在程序开发中会存在多线程同步的问题,当多个线程并发访问某个数据的时候,尤其是针对一些敏感的数据(比如订单、金额等),我们就需要保证这个数据在任何时刻最多只有一个线程在访问,保证数据的完整性和一致性。在开发过程中加锁是为了保证数据的一致性,这个思想在数据库领域中同样很重要。
在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。为保证数据的一致性,需要对并发操作进行控制,因此产生了锁 。同时锁机制也为实现MySQL的各个隔离级别提供了保证。锁冲突也是影响数据库并发访问性能的一个重要因素。所以锁对数据库而言显得尤其重要,也更加复杂。
2. MySQL并发事务访问相同记录并发事务访问相同记录的情况大致可以划分为3种:读-读、写-写、读-写(写-读)
1. 读-读情况读-读情况,即并发事务相继读取相同的记录。读取操作本身不会对记录有任何影响,并不会引起什么问题,所以允许这种情况的发生。
2. 写-写情况写-写情况,即并发事务相继对相同的 ...
主从集群构建主库配置文件
1234567[mysqld]bind-address=0.0.0.0server-id=1log-bin=mysql-binlog-slave-updatesbinlog-ignore-db=mysql,information_schema,sys,performance_schemabinlog_format=MIXED
从库配置文件
1234[mysqld]bind-address=0.0.0.0server-id=2relay-log=mysql-relay
1. 主库全量备份并记录binlog位置1mysqldump -u root -p --master-data=1 --single-transaction --all-databases > master_backup.sql
2. 修改master_backup.sql 文件12345CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=5096;# 修改为:CHANG ...
一. 虚拟机栈1. 简介1. 虚拟机栈的出现背景
由于跨平台性的设计,Java的指令都是根据栈来设计的。不同平台CPU架构不同,所以不能设计为基于寄存器的【如果设计成基于寄存器的,耦合度高,性能会有所提升,因为可以对具体的CPU架构进行优化,但是跨平台性大大降低】。
优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。
2. 内存中的栈与堆
首先栈是运行时的单位,而堆是存储的单位。
即:栈解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的是数据存储的问题,即数据怎么放,放哪里
3. 虚拟机栈基本内容
Java虚拟机栈是什么?
Java虚拟机栈(Java Virtual Machine Stack),早期也叫Java栈。每个线程在创建时都会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的Java方法调用,栈是线程私有的
12345678910111213141516171819public class Test { public static void main(String[] ...
1. 数据传输指令1. 通用数据传送指令1234567891011121314MOV 传送字或字节MOVSX 先符号扩展,再传送MOVZX 先零扩展,再传送PUSH 把字压入堆栈POP 把字弹出堆栈PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈BSWAP 交换32位寄存器里字节的顺序XCHG 交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)CMPXCHG 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)XADD 先交换再累加.(结果在第一个操作数里)XLAT 字节查表转换.----BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)
...
编译运行jdk-21学习来源于该博客
1. 构建编译环境在MacOS[1]和Linux上构建OpenJDK编译环境相对简单,对于MacOS,需要MacOS X 10.13版本以上,并安装好最新版本的XCode和Command Line Tools for XCode(在Apple Developer网站[2]上可以免费下载),这两个SDK提供了OpenJDK所需的CLang编译器以及Makefile中用到的其他外部命令。
对于Linux系统,要准备的依赖与MacOS类似,在MacOS中CLang编译器来源于XCode SDK,而Ubuntu里用户可以自行选择安装GCC或CLang来进行编译,但必须确保最低的版本为GCC 4.8或者CLang 3.2以上,官方推荐使用GCC 7.8或者CLang 9.1来完成编译。在Ubuntu系统上安装GCC的命令为:
1sudo apt-get install build-essential
在编译过程中需要依赖FreeType、CUPS等若干第三方库,OpenJDK全部的依赖库已在表1-1中列出,读者可执行相应的安装命令完成安装。具体缺少的依赖可 ...
MyBatisPlus1. MyBatis-Plus介绍1. 简介MyBatis-Plus(简称 MP)是一个 MyBatis的增强工具,在 MyBatis 的基础上只做增强不做改变,为 简化开发、提高效率而生。
我们的愿景是成为 MyBatis 最好的搭档,就像魂斗罗中的 1P、2P,基友搭配,效率翻倍。
2. 特性
无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由 配置,完美解决主键问题
支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强 大的 CRU ...
Redis原理篇1. 数据结构1. 动态字符串SDS我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。
不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题:
123// c语言,声明字符串char* s = "hello"// 本质是字符数组: {'h', 'e', 'l', 'l', 'o', '\0'}
获取字符串长度的需要通过运算
非二进制安全
不可修改
Redis构建了一种新的字符串结构,称为简单动态字符串(Simple Dynamic String),简称SDS。
例如,我们执行命令:
1set name 虎哥
那么Redis将在底层创建两个SDS,其中一个是包含“name”的SDS,另一个是包含“虎哥”的SDS。
Redis是C语言实现的,其中SDS是一个结构体,源码如下:
例如,一个包含字符串“name” ...

