使用 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()
相关推荐
Sakura_j_h_15 分钟前
Python 在定时任务里输出 emoji,UnicodeEncodeError 从哪来
开发语言·字符编码·windows·python·定时任务
supabc1232 小时前
欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则
xml·python·开源·电子发票·1024程序员节
ZhengEnCi2 小时前
AI Agent工具调用防护层怎么写-一份能直接跑的Python四层拦截实现
python·llm·agent
ZhengEnCi2 小时前
AI Agent工具误调用怎么解决-从参数校验到高危二次确认的四层工程防线
python·llm·agent
镜子AI4 小时前
镜子AI工程教程:用Python实现关键词布局检查器与语义改写查重(附完整代码)
人工智能·python·microsoft
小oo呆4 小时前
【学习心得】Python协程
python
信誓旦旦的程序猿5 小时前
【Python量化实战宝典 #22】涨跌停、连板情绪手册:情绪指标构建(Python 可跑)
python·1024程序员节·股票数据api·股票数据api接口·股票api数据接口·股票量化数据api·股票量化数据接口
gCode Teacher 格码致知5 小时前
Pandas教学-21:subplots的使用
python·pandas·1024程序员节
2601_967980115 小时前
Python开发的顶级开源项目全景图:2025-2026年生态概览
python·机器学习·开源项目·数据科学·生态概览
benchmark_cc6 小时前
量化开发中,什么时候应该停止手动下载股票数据?
python·数据分析·pandas·量化交易·1024程序员节·股票数据·quantdash