使用 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()
相关推荐
聪明蛋子哟5 小时前
Stagehand v3多语言SDK:Python/Go/Rust/Java下的浏览器自动化统一方案
python·golang·rust
今天AI了吗6 小时前
Python 基础语法(一):常量、变量、输入输出与运算符
开发语言·数据库·人工智能·python·sql·深度学习·机器学习
卷无止境6 小时前
Windows 上丝滑开发 Python,并稳定构建 Docker 镜像
后端·python·docker
TELL5216 小时前
selenium webdriver 第二次初始化的异常
开发语言·python
Csvn6 小时前
🐍 Day 4: Python 控制流 — 条件、循环与推导式的艺术
后端·python
大鹏说大话9 小时前
从爬虫到决策引擎:大数据下自媒体如何用Python挖掘用户痛点
开发语言·爬虫·python
Niuguangshuo9 小时前
silero-vad:超轻量级开源 VAD 实践指南
开发语言·python
2501_9446761610 小时前
揭秘!WORDTIP公司靠不靠谱?小白必看
大数据·人工智能·python
Minner-Scrapy10 小时前
Scrapy 2.17 源码解析:Scheduler 调度器与磁盘/内存双队列
java·爬虫·python·scrapy·网络爬虫·twisted
CODER030410 小时前
Anaconda和Mamba创建环境管理包常用命令合集
python·深度学习·conda·虚拟环境·mamba·常用命令大全