读懂 GC 日志
当使用 Java 或任何其他基于 JVM 的编程语言时,其中一个核心功能是内存清理(垃圾回收)
和 C 和 C++ 等语言不同,使用者不需要关注内存相关的操作,例如
malloc
、calloc
、realloc
、free
等函数
释放内存的操作就是由 JVM 中名为 Garbage Collector 的角色完成的
垃圾回收器是如何工作的
JVM 在后台运行垃圾回收器来查找未使用的引用,这些引用占用的内存可以被释放并重新使用
当使用 Java 或任何其他基于 JVM 的编程语言时,其中一个核心功能是内存清理(垃圾回收)
和 C 和 C++ 等语言不同,使用者不需要关注内存相关的操作,例如
malloc
、calloc
、realloc
、free
等函数
释放内存的操作就是由 JVM 中名为 Garbage Collector 的角色完成的
JVM 在后台运行垃圾回收器来查找未使用的引用,这些引用占用的内存可以被释放并重新使用
二分的思想很简单,但是难在 coding 上,因为需要考虑边界条件
在 B 站上看了一个视频,二分查找为什么总是写错? 动画讲解了一种比较好记忆处理边界的方式(我认为并不是在讲二分的思想,而是用一种图示的方式避免边界处理错误),所以在这里记录下
引入抛出了一个问题
在 n 个数中,如何让抽到每一个数的概率相等
可以产生一个随机数,n 个数则在 [1,n] 中产生一个随机数即可
但如果涉及到外部数据,即一次并不能全部读取 n 个数(n 未知);例如一共 1000 个数据,一次只能加载 10 个,那么再每 10 个加载一次,总共加载 100 次的过程中如何保证最终取到的值满足 1/n
使用水塘抽样算法可以解决
之前一直对索引分析中 type range 有误解
下面是官方文档对 type range 的解释
range
can be used when a key column is compared to a constant using any of the=
,<>
,>
,>=
,<
,<=
,IS NULL
,<=>
,BETWEEN
,LIKE
, orIN()
operators:
1
2
3
4
5
6
7
8
9
10
11 SELECT * FROM tbl_name
WHERE key_column = 10;
SELECT * FROM tbl_name
WHERE key_column BETWEEN 10 and 20;
SELECT * FROM tbl_name
WHERE key_column IN (10,20,30);
SELECT * FROM tbl_name
WHERE key_part1 = 10 AND key_part2 IN (10,20,30);
IN
查询下的 range 什么时候会恶化为 ALL
呢?按照我之前的理解,可能有两点
语法
1 | SCAN cursor [MATCH pattern] [COUNT count] [TYPE type] |
时间复杂度
一次调用是 O(1)
,完整的迭代是
O(N)
,包括不断调用直到返回 cursor 为 0;N
为集合内元素数量