这两天收集了一些基础知识, 记录下
内存管理
通常使用 内存对齐方式 (8 字节、16 字节、32 字节),
有的值可能只占用两个字节,但是为什么还要一次性分配8字节呢.
原因是为了内存的可复用性, 产生更少的内存碎片.
new(9) 大于8, 将会使用16字节内存。
但是仔细想想, 8字节 16字节等等过于零散,可以再对内存进行归类组织, 就使用到了 页 的概念。
垃圾回收
1. 引用计数
每个对象拥有一个ref属性,标记引用的次数。
缺点
有可能造成循环引用,内存无法释放
增一减一 各种环境下要求准确记录, 如果出现不正确计数, 将会引发严重问题
优点
速度快
补偿措施
单独gc算法定期扫描引用链表,进行释放
2. 标记清理
最典型为三色标记法(golang)
3. 代龄
根据对象的生命周期, 标记为 0 1 2 三级代龄, 具体参考 java、C#
进程、线程、协程
1. 进程
操作系统分配存储资源的最小单元
2. 线程
程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位(所以一个进程最少一个线程)
3. 协程
在用户空间实现多任务的调度而多任务调度是发生在一个线程上的,我们把这种机制称之为协程, 因为在一个线程上,协程的本质是串行的。
上下文切换
cpu进程的切换最消耗性能了, 因为整个进程都得保存现场或者恢复现场
线程的切换因为同进程内共享地址空间, 切换相比进程开销要小得多
core文件gdb调试
软件崩溃后会产生core文件, 默认linux没有开启
代码语言:javascript复制ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 32768
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 1418
virtual memory (kbytes, -v) unlimited
开启命令:
代码语言:javascript复制ulimit -c unlimited #unlimited表示不限制大小
如果想要永久生效,可以“ulimit -c unlimited”这一行加到 /etc/profile 文件中去,放到这个文件最后一行即可。