请简单说一下python的垃圾回收机制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21核心机制:Python 的垃圾回收机制主要由 引用计数、标记-清除 和 分代回收 三部分组成,共同管理内存中无用对象的回收。
(1) 引用计数(Reference Counting)
原理:每个对象维护一个引用计数器,记录有多少变量引用该对象。当计数器为 0 时,对象立即被回收。
优点:实时性:对象一旦无引用,立即释放内存。
缺点:1.无法处理循环引用(如 a = []; a.append(a),导致引用计数始终为 1,但实际已无用)。
2.性能开销:每次赋值/释放都需要修改计数器,可能影响性能。
(2) 标记-清除(Mark and Sweep)
目的:解决引用计数无法处理循环引用的问题。
流程:
1.标记阶段:从根对象(如全局变量、线程栈)出发,遍历所有可达对象并标记为“存活”。
2.清除阶段:回收未被标记的对象(不可达对象)。
触发时机:定期自动触发(默认每分配 700 个对象或 10 次小对象分配后触发)。
配置:可通过 print(gc.get_threshold()) 调整回收频率。默认是 (700, 10, 10) 。
(3) 分代回收(Generational Collection)
原理:将对象按存活时间分为 3 代(Generation 0~2),存活时间越长,回收频率越低。
优势:大多数对象生命周期短,分代回收可减少不必要的检查。
触发规则:当某一代的对象数量超过阈值时,触发该代的垃圾回收。
强制执行全量 GC:gc.collect()列表和元祖和字典和集合的区别
集合适合去重、快速成员检测(如唯一用户ID集合)。列表存储有序且可能变化的数据(如任务队列)。
元祖适合存储不可变数据(如配置参数、固定数据)。字典适合快速查找和存储键值对(如用户信息、缓存)
pod起不来的原因一般都有啥?
首先kubectl get pods -n <namespace>
,查看错误提示是啥:
Pending:未调度或资源不足。
CrashLoopBackOff:容器启动后立即崩溃。
Error:容器启动失败。
ImagePullBackOff:镜像拉取失败。
然后 kubectl describe pod <pod-name> -n <namespace>
查看pod详情。
然后 kubectl logs <pod-name> -n <namespace>
查看容器日志,如果容器已崩溃,再加上--previous
。
- 如何快速定位Pod处于Pending状态的原因?
当Pod处于 Pending 状态时,通常表示Kubernetes调度器(Scheduler)无法为Pod分配节点。kubectl describe pod-n 看一下pod详细信息,重点关注 Events 部分,通常会直接提示错误原因,例如: a.资源不足(Insufficient CPU/Memory) b.节点选择器(NodeSelector)不匹配,此时需要查看标签kubectl get nodes --show-labels c.污点(Taint)与容忍度(Toleration)冲突,此时需要kubectl describe node <node-name> | grep Taints 查看污点 d.持久卷(PersistentVolume)无法绑定
- gitlab冲突处理?
首先git checkout dev
你从当前分支切换到指定的分支dev。
git pull origin dev
拉取最新代码(Pull),确保你本地的代码是最新的。git status
查看哪些文件发生了冲突,比如出现了both modified: app.py
,这说明app.py
文件存在冲突,然后处理具体的冲突。
然后git add app.py
将修改后的文件标记为冲突已解决。
下一步是git commit -m "Resolved merge conflict"
提交合并(Commit)。
最后git push origin dev
将代码推送到远程仓库。
python如何在一个函数内部修改全局变量?
函数内部global声明 修改全局变量, 比如:1
2
3
4
5
6
7
8
9a = 5
def func():
global a
a = 4
func()
print(a)python里,map()函数有用过么?
map()函数可以将一个函数应用到一个序列上的每一个元素,并返回一个新的迭代器。举个例子:1
2
3
4
5
6
7
8
9
10
11
12# 定义一个函数,计算一个数的平方
def square(x):
return x * x
# 初始列表
numbers = [1, 2, 3, 4, 5]
# 使用 map() 函数将 square 函数应用到 numbers 列表的每个元素上
squared_numbers = list(map(square, numbers))
# 打印结果
print(squared_numbers) # 输出: [1, 4, 9, 16, 25]统计字符串每个单词出现的次数”kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h”
1
2
3
4
5from collections import Counter
a = "kjalfj;ldsjafl;hdsllfdhg;lahfbl;hl;ahlf;h"
res = Counter(a)
print (res)list里的append和extend的区别是啥?
list里的+方法等价于extendCPU 使用率里的%usr %system %iowait 这些都是啥?
1
2
3
4用户 CPU 使用率(%usr):包括用户态 CPU 使用率(user)和低优先级用户态 CPU 使用率(nice),表示 CPU 在用户态运行的时间百分比。用户 CPU 使用率高,说明用户态进程占用了较多的 CPU,应该着重排查进程的性能问题。
系统 CPU 使用率(%system):表示 CPU 在内核态运行的时间百分比(不包括中断)。系统 CPU 使用率高,说明内核比较繁忙,应该着重排查内核线程或者系统调用的性能问题。往往它高了会带动%usr也变高。查看指标:mpstat -P ALL 1
等待 I/O 的 CPU 使用率(%iowait):通常也称为 iowait,表示等待 I/O 的时间百分比。iowait 高,通常说明系统与硬件设备的 I/O 交互时间比较长,应该着重排查系统存储是不是出现了 I/O 问题。
软中断和硬中断的 CPU 使用率(%softirq %irq ):分别表示内核调用软中断处理程序、硬中断处理程序的时间百分比。它们的使用率高,通常说明系统发生了大量的中断,应该着重排查内核中的中断服务程序。系统的 CPU 使用率很高,却找不到高 CPU 的应用?
有可能是短时应用导致的问题:
a.应用里直接调用了其他二进制程序,这些程序通常运行时间比较短,通过 top 等工具也不容易发现。
b.应用本身在不停地崩溃重启,而启动过程的资源初始化,很可能会占用相当多的 CPU。应用的Metaspace 使用率高,都有什么样的原因?
a. 加载的类数量多,类加载也会导致 CPU升高(少数静态类加载除外)
b. 新类与老类共存(未卸载旧类)
c. Metaspace 泄漏(Memory Leak)
d. JVM 参数配置不当