mysql笔记03-Buffer Pool内存数据结构
Buffer Pool内存数据结构
Buffer Pool的内存大小默认为128M,,磁盘中存放的数据页的默认大小为16KB,而Buffer Pool中存放的一个一个的数据页,我们通常叫做缓存页,因为毕竟Buffer Pool是一个缓冲池,里面的数据都是从磁盘缓存到内存去的。Buffer Pool中的缓存页的大小也和数据页相同为16KB,每个缓存页都有描述信息,其占数据页的5%左右,也就是大概800B,buffer pool真是数据结构可以由多个buffer pool组成,每个buffer pool可以由多个chunk组成,运行期间可以支持动态调整大小
如何知道哪些缓存页是空闲的
数据库会为Buffer Pool设计一个free链表,他是一个双向链表数据结构,这个free链表里,每个节点就是一个空闲的缓存 页的描述数据块的地址,也就是说,只要你一个缓存页是空闲的,那么他的描述数据块就会被放入这个free链表中。
数据库启动的时候,如何初始化Buffer Pool
数据库只要一启动,就会按照你设置的Buffer Pool大小,稍微再加大一点,去找操作系统申请一块内 ...
mysql笔记02-binlog日志
binlog日志
MySQL binlog到底是什么?
之前说的redo log,他是一种偏向物理性质的重做日志,因为他里面记录的是类似这样的东西,“对哪个数据页中的什么记录,做了个什么修改”。而且redo log本身是属于InnoDB存储引擎特有的一个东西。而binlog叫做归档日志,他里面记录的是偏向于逻辑性的日志,类似于“对users表中的id=10的一行数据做了更新操 作,更新以后的值是什么”,binlog不是InnoDB存储引擎特有的日志文件,是属于mysql server自己的日志文件。
提交事务的时候,同时会写入binlog
提交事务的时候,会把redo log日志写入磁盘文件中去。然后其实在提交事务的时 候,我们同时还会把这次更新对应的binlog日志写入到磁盘文件中,
binlog日志的刷盘策略
binlog日志,其实也有不同的刷盘策略,有一个sync_binlog参数可以控制binlog的刷盘策略,他的默认值是0, 此时你把binlog写入磁盘的时候,其实不是直接进入磁盘文件,而是进入os cache内存缓存。如果此时机器宕机,那么你在os ...
mysql笔记01-InnoDB储存引擎的架构设计
InnoDB储存引擎的架构设计
InnoDB的重要内存结构:缓冲池
引擎要执行更新语句的时候 ,比如对“id=10”这一行数据,他其实会先将“id=10”这一行数据看看是否在缓冲池里,如果不在的 话,那么会直接从磁盘里加载到缓冲池里来,而且接着还会对这行记录加独占锁
undo日志文件:如何让你更新的数据可以回滚?
假设“id=10”这行数据的name原来是“zhangsan”,现在我们要更新为“xxx”,那么此时我们得先 把要更新的原来的值“zhangsan”和“id=10”这些信息,写入到undo日志文件中去
更新buffer pool中的缓存数据
当我们把要更新的那行记录从磁盘文件加载到缓冲池,同时对他加锁之后,而且还把更新前的旧值写入undo日志文件 之后,我们就可以正式开始更新这行记录了,更新的时候,先是会更新缓冲池中的记录,此时这个数据就是脏数据。因为这个时候磁盘上“id=10”这行数据的name字段还是“zhangsan”,但是内存里这行数据已经被修改了,所以就会叫他是脏数据。
Redo Log Buffer:万一系统宕机,如何避免数据丢失?
...
leetcode-718. 最长重复子数组
leetcode-718. 最长重复子数组
1234567891011121314151617181920212223242526272829class Solution { public int findLength(int[] A, int[] B) { int n1 = A.length; int n2 = B.length; int[][] dp = new int[n1][n2]; int ans = 0; for(int i = 0; i < n1; i++){ if(B[0] == A[i]){ dp[i][0] = 1; } } for(int i = 0; i < n2; i++){ if(A[0] == B[i]){ dp[0][i] = 1; ...
JVM笔记08-内存溢出
JVM内存溢出
可能导致内存溢出的三个区域
Metaspace区域里发生OOM
每个线程的虚拟机栈内存可能发生OOM的区域
堆内存空间发生内存溢出
Metaspace区域
第一种原因,很多工程师他不懂JVM的运行原理,在上线系统的时候对Metaspace区域直接用默认的参数,即根本不设置其大小 这会导致默认的Metaspace区域可能才几十MB而已,此时对于一个稍微大型一点的系统,因为他自己有很多类,还依赖了很多外部的jar包有有很多的类,几十MB的Metaspace很容易就不够了
第二种原因,就是很多人写系统的时候会用cglib之类的技术动态生成一些类,一旦代码中没有控制好,导致你生成的类过于多的时候,就很容易把Metaspace给塞满,进而引发内存溢出
Metaspace区域发生内存溢出的一个场景,就是如果我们在程序里不停的动态生成类,就会导致不停的加载类到Metaspace区域里去,而且这些动态生成的类必须还得是不能被回收掉的。 接着一旦Metaspace区域满了,就会触发Full GC连带着回收Metaspace中的类,但是此时大量的类是不能被回收的。 因此即使触 ...
JVM笔记-07JVM内存查看命令
JVM内存查看命令
内存分析命令
jstat -gc PID,jstat -gc PID 180000 10 这就相当于是让他每隔三分钟执行一次统计,连续 执行10次
S1C:这是To Survivor区的大小
S0U:这是From Survivor区当前使用的内存大小
S1U:这是To Survivor区当前使用的内存大小
EC:这是Eden区的大小
EU:这是Eden区当前使用的内存大小
OC:这是老年代的大小
OU:这是老年代当前使用的内存大小
MC:这是方法区(永久代、元数据区)的大小
MU:这是方法区(永久代、元数据区)的当前使用的内存大小
YGC:这是系统运行迄今为止的Young GC次数
YGCT:这是Young GC的耗时
FGC:这是系统运行迄今为止的Full GC次数
FGCT:这是Full GC的耗时 GCT:这是所有GC的总耗时
jmap和jhat摸清线上系统的对象分布
jmap -heap PID 这个信息会打印出来堆内存相关的一些参数设置,然后就是当前堆内存里的一些基本各个区域的情况
jmap -histo PID 他会按照各种对象占用 ...
机器学习笔记-01
机器学习笔记-01
监督学习
回归问题
预测估计
预测天气
预测房价、体重
分类问题
判断一个邮件是否为垃圾
图像识别
判断一个人的信用好坏
无监督学习
数据没有标签,多为聚类分析
数据预处理
归一化
Xnorm=X−XminXmax−XX{norm} = \frac{X - X{min}}{X{max} - X}
Xnorm=Xmax−XX−Xmin
标准化
Xstd=X−UϵX{std} = \frac{X-U}{\epsilon}
Xstd=ϵX−U
数据转换:One-Hot encoding
leetcode-1124. 表现良好的最长时间段
leetcode-1124. 表现良好的最长时间段
12345678910111213141516171819202122class Solution { public int longestWPI(int[] hours) { int n = hours.length; int ans = 0; for (int i = 0; i < n; i++) { int count = 0; for (int j = i; j < n; j++) { if (hours[j] > 8){ count = count + 1; }else { count = count - 1; } if (count > ...
leetcode-34. 在排序数组中查找元素的第一个和最后一个位置
leetcode-34. 在排序数组中查找元素的第一个和最后一个位置
12345678910111213141516171819202122232425class Solution { public int[] searchRange(int[] nums, int target) { int n = nums.length; int i = -1; int j = n - 1; int a = -1; int b = -1; while(i < n-1){ i++; if(nums[i] == target){ a = i; break; } } while(j >= 0){ if(nums[j] == target){ ...
leetcode-767. 重构字符串
leetcode-767. 重构字符串
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051class Solution { public String reorganizeString(String S) { String ans = ""; char[] ch = S.toCharArray(); Map<Character, Integer> map = new HashMap<>(); for (int i = 0; i < ch.length; i++) { map.put(ch[i], map.getOrDefault(ch[i], 0) + 1); } PriorityQueue<Character> queue = new P ...