Память в Python организована в несколько уровней.
- Слой 3 (Уровень ядра) - предназначен для non-object данных самого интерпрeтатора
- Слой 2 - выделение памяти под объекты
- Слой 1 - PyMem_ API
import sys
import struct
import ctypes
from elftools.elf.elffile import ELFFile
fd = open(sys.executable, 'rb')
elf = ELFFile(fd)
symtab = elf.get_section_by_name('.symtab')
unpack_fmt = {
ctypes.c_char: 'c',
ctypes.c_ubyte: 'B',
ctypes.c_bool: '?',
ctypes.c_ushort: 'H',
ctypes.c_int: 'i',
ctypes.c_uint: 'I',
ctypes.c_long: 'l',
ctypes.c_ulong: 'L',
# ...
ctypes.c_size_t: 'N'
}
def read_value(symtab, name, ctype):
# struct.calcsize('I')
symbols = symtab.get_symbol_by_name(name)
if symbols is None:
return
return [
struct.unpack(
unpack_fmt[ctype],
ctypes.string_at(s['st_value'], ctypes.sizeof(ctype))
)
for s in symbols
]
(struct.unpack('I',
ctypes.string_at(
symtab.get_symbol_by_name('maxarenas')[0]['st_value'],
ctypes.sizeof((ctypes.c_uint))
)
)
# addr = f"objdump -t {sys.executable}|grep maxarena|awk '{print $1}'"
read_value(symtab, 'maxarenas', ctypes.c_uint)
read_value(symtab, 'ntimes_arena_allocated', ctypes.c_size_t)
read_value(symtab, 'narenas_currently_allocated', ctypes.c_size_t)
- A Short Overview of CPython's Memory Management
- Alexander VanTol / Memory Management in Python
- Artem Golubin / Memory management in Python
- Neeraj Dana / Python Memory Management
- Python的内存模型架构 #17
- Использование памяти в Python
- Diving into CPython GC module
- Всё, что нужно знать о сборщике мусора в Python
- О том, как в Instagram отключили сборщик мусора Python и начали жить