pyrasite-ng>=2.0.3
guppy3>=3.1.6
pyrasite-shell 3844242
docker-compose.yaml 放开 SYS_PTRACE
version: "3.8"
services:
your-app:
image: your-image
cap_add:
- SYS_PTRACE
python
from guppy import hpy
from guppy.heapy.UniSet import IdentitySetMulti
hp = hpy()
identity_set_multi: IdentitySetMulti = hp.heap()
print(identity_set_multi.bytype)
big_type = identity_set_multi.bytype[0]
print(big_type)
print(big_type.byvia[:5])
print(hp.iso(big_type[0]).referrers)
python
# -*- coding: utf-8 -*-
import time
import os
import psutil
class MemoryLeakObject:
"""创建一个会占用大量内存的对象"""
def __init__(self, size_mb):
# 每个对象创建一个大字节数组来占用内存
self.data = bytearray(size_mb * 1024 * 1024)
# 填充一些数据以确保内存真正被分配
for i in range(len(self.data)):
self.data[i] = i % 256
class MemoryLeakManager:
"""管理内存泄漏对象的容器"""
_leaked_objects = []
@classmethod
def create_leak(cls, size_mb):
"""创建一个内存泄漏对象并添加到全局容器中"""
obj = MemoryLeakObject(size_mb)
cls._leaked_objects.append(obj)
return len(cls._leaked_objects)
@classmethod
def get_total_leaked_memory(cls):
"""获取总泄漏内存大小(MB)"""
return len(cls._leaked_objects) * 100
def mem_info_print():
process = psutil.Process(os.getpid())
memory_info = process.memory_info()
# 转换为MB
rss_mb = memory_info.rss / 1024 / 1024
vms_mb = memory_info.vms / 1024 / 1024
# 打印内存使用情况
print(f"进程ID: {os.getpid()} | 物理内存使用: {rss_mb:.2f} MB | 虚拟内存使用: {vms_mb:.2f} MB")
def main():
print("开始创建内存泄漏...")
# 目标泄漏1GB内存,每次泄漏100MB
for _ in range(10):
mem_info_print()
obj_id = MemoryLeakManager.create_leak(100) # 每次泄漏100MB
print(f"创建泄漏对象 {obj_id}")
time.sleep(0.5)
print("\n=== 内存泄漏创建完成 ===")
print("预期泄漏内存: 1000 MB (1GB)")
print("程序将持续运行以观察内存泄漏情况...")
print(f"进程ID: {os.getpid()}")
while True:
time.sleep(2)
#mem_info_print()
if __name__ == "__main__":
main()