使用 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()
相关推荐
hef2887 小时前
如何生成特定SQL的AWR报告_@awrsqrpt.sql深度剖析单条语句性能
jvm·数据库·python
Jinkxs7 小时前
从语法纠错到项目重构:Python+Copilot 的全流程开发效率提升指南
python·重构·copilot
技术专家7 小时前
Stable Diffusion系列的详细讨论 / Detailed Discussion of the Stable Diffusion Series
人工智能·python·算法·推荐算法·1024程序员节
段一凡-华北理工大学8 小时前
【大模型+知识图谱+工业智能体技术架构】~系列文章01:快速了解与初学入门!!!
人工智能·python·架构·知识图谱·工业智能体
IT小Qi8 小时前
iperf3网络测试工具
网络·python·测试工具·信息与通信·ip
以神为界8 小时前
Python入门实操:基础语法+爬虫入门+模块使用全指南
开发语言·网络·爬虫·python·安全·web
xcjbqd08 小时前
Python API怎么加Token认证_JWT生成与验证拦截器实现
jvm·数据库·python
io_T_T8 小时前
如何调用google api 进行开发(使用免费版本)
python
广师大-Wzx9 小时前
一篇文章看懂MySQL数据库(下)
java·开发语言·数据结构·数据库·windows·python·mysql