使用 pyrasite-ng 和 guppy3 做内存分析

复制代码
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()
相关推荐
Cooper253 小时前
单文件 Flask 跑通微信服务器校验:先跑通再谈工程化
python·flask
Cooper253 小时前
三源热榜去重加 AI 摘要:URL 唯一键踩出的三个坑
前端·python
用户4019925568613 小时前
多源异构 B2B 公开需求信号去重与企业实体证据链存储设计(64-bit SimHash 分桶 + Jaccard)
python
aifannihao4 小时前
GitHub Actions 锁文件实测:6 个 uses 只锁住 2 个
python·ci/cd·标准库·供应链安全·github actions
2601_967980114 小时前
使用gensim处理文本(1)语料库与词向量空间
python·自然语言处理·gensim·词向量·文本分析
3095566665 小时前
股票接口返回 404 与空数组的排查笔记:证书状态与级别参数
java·笔记·python·ios·iphone·股票数据api·股票数据接口
2601_967980116 小时前
世界上最好的Python编辑器是什么?我投PyCharm一票
ide·python·pycharm·数据科学·jupyter notebook
wuyk5556 小时前
Spider-第09讲-三格式落盘CSV-Excel-JSON
爬虫·python·json·excel
青少儿编程课堂6 小时前
蓝桥杯青少组图形化 + 全国青少年信息素养大赛 + 电子学会图形化考级:校园大富翁经营闯关解析
c++·python·算法·bfs·信息学竞赛
特立独行的猫A13 小时前
用仓颉语言 cj-tauri 框架,五分钟给娃做了个鸿蒙形近字游戏
java·后端·python